更新
我正在创建怀孕到期日倒计时,因此我使用android.widget.DatePicker
作为设置截止日期的工具。
例如:
Jan. 9 2015
Nov. 9 2014
2 months, 62 days and 8weeks
到目前为止,我只能显示设定截止日期。
问题: 如何在用户设置截止日期时获得确切的几个星期和几天。
更新代码
以下是代码:
private TextView txtResultDueDate ;
private DatePicker datePicker;
private Calendar calendar;
private int year;
private int month;
private int day;
static final int DATE_DIALOG_ID = 999;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_profile);
txtResultDueDate = (TextView) findViewById(R.id.txtDue);
btnChangeDate = (Button)findViewById(R.id.button1);
calendar = Calendar.getInstance();
year = calendar.get(Calendar.YEAR);
month = calendar.get(Calendar.MONTH);
day = calendar.get(Calendar.DAY_OF_MONTH);
showDate(year, month+1, day);
@SuppressWarnings("deprecation")
public void setDate(View view) {
showDialog(999);
Toast.makeText(getApplicationContext(), "ca", Toast.LENGTH_SHORT)
.show();
}
@Override
protected Dialog onCreateDialog(int id) {
// TODO Auto-generated method stub
if (id == 999) {
return new DatePickerDialog(this, myDateListener, year, month, day);
}
return null;
}
private DatePickerDialog.OnDateSetListener myDateListener
= new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker arg0, int year, int month, int day) {
Chronology chrono = GregorianChronology.getInstance();
DateTime end = new DateTime(arg0.getYear(), arg0.getMonth(), arg0.getDayOfMonth(), 0, 0, chrono);
DateTime current = new DateTime();
Interval interval = new Interval(current.toInstant(), end.toInstant());
Period duePeriod = interval.toPeriod();
showDate(duePeriod.getYears(), duePeriod.getMonths(), duePeriod.getDays());
}
};
private void showDate(int year, int month, int day) {
txtResultDueDate.setText(new StringBuilder().append(day).append("/")
.append(month).append("/").append(year));
}
这是我使用DatePicker
设置截止日期时遇到的错误:
致命的例外:主要
java.lang.IllegalArgumentException:结束时刻必须大于等于开头
at org.joda.time.base.Abstraction.checkInterval(AbstractInterval.java.63)
at org.joda.time.base.BaseInterval(BaseInterval.java:94)
at org.joda.time.Interval。(Interval.java.122)
at com.date.androin.Profile $ 1.onDataset(Profile.java:168)
在android.app.DatePickerDialog.tryNotifyDataSet(DatePickerDialog.java.148)
在android.app.DatePickerDialog.onClick(DatePickerDialog.java.116)
at com.android.internal.app.AlertController $ ButtonHandler.handleMessage(AlertController.java:166)
在android.os.Handler.dispatchMessage(Handler.java:99)
在android.os.Looper.loop(Looper.java:137)
在android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStrat.main(Native Method)
答案 0 :(得分:2)
有一个图书馆Joda Time。 Java提供的Date API更好
Joda Time有一个时间间隔的概念:
Interval interval = new Interval(oldTime, new Instant());
是的,您可以将joda lib与android DatePicker
Chronology chrono = GregorianChronology.getInstance();
// end datetime
DateTime end = new DateTime(datePicker.getYear(), datePicker.getMonth(), datePicker.getDayOfMonth(), 0, 0 ,chrono);
// current datetime
DateTime current = new DateTime();
然后使用开始和结束日期时间实例化Interval
Interval interval = new Interval(current.toInstant(), end.toInstant());
然后使用Interval api获取可以提取月/天/周差异的时间段
Period duePeriod = interval.toPeriod();
// get difference in months
duePeriod.getMonths();
// get difference in weeks
duePeriod.getWeeks();
请参阅以下Javadoc of Period以获取API的完整列表 http://joda-time.sourceforge.net/apidocs/org/joda/time/Period.html
对于Android,在您的情况下,将上述代码添加到DatePicker
onDateSet侦听器中。最后,监听器方法会这样,
@Override
public void onDateSet(DatePicker arg0, int year, int month, int day) {
// TODO Auto-generated method stub
Chronology chrono = GregorianChronology.getInstance();
// end datetime
DateTime end = new DateTime(arg0.getYear(), arg0.getMonth(), arg0.getDayOfMonth(), 0, 0, chrono);
// current datetime
DateTime current = new DateTime();
Interval interval = new Interval(current.toInstant(), end.toInstant());
Period duePeriod = interval.toPeriod();
showDate(duePeriod.getYears(), duePeriod.getMonths(), duePeriod.getDays());
}
答案 1 :(得分:1)
//somewhere in your code, init part
Calendar then = setDate(9, 0, 2015);//9 january 2015
Calendar c = Calendar.getInstance();
Calendar now = setDate(c.get(Calendar.DAY_OF_MONTH), c.get(Calendar.MONTH), c.get(Calendar.YEAR));
String leftDays = getLeftDays(then, now);//your result
//method setting days months years - we ignore hours and minutes
private String getLeftDays(Calendar then, Calendar now) {
long leftMilis = then.getTimeInMillis() - now.getTimeInMillis();
int seconds = (int) (leftMilis / 1000);
Log.d(TAG, "seconds:" + seconds);
int minutes = seconds / 60;
Log.d(TAG, "minutes:" + minutes);
int hours = minutes / 60;
Log.d(TAG, "hours:" + hours);
int days = hours / 24;
Log.d(TAG, "days:" + days);
int weeks = days / 7;
Log.d(TAG, "weeks:" + weeks);
//months.. another way calculating data due not equal amount of days per month
Calendar temp = ((Calendar) then.clone());
temp.add(Calendar.MONTH, -now.get(Calendar.MONTH));
int months = temp.get(Calendar.MONTH);
Log.d(TAG, "months:" + months);
StringBuilder sb = new StringBuilder();
String format = "%d months, %d days, %d weeks";
String formatStr = String.format(format, months, days, weeks);
String result = sb.append(formatStr).toString();
Log.d(TAG, sb.toString());
return result;
}
private Calendar setDate(int day, int month, int year) {
Calendar c = Calendar.getInstance();
c.set(Calendar.DAY_OF_MONTH, day);
c.set(Calendar.MONTH, month);
c.set(Calendar.YEAR, year);
c.set(Calendar.HOUR, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
Log.d(TAG, c.getTime().toString());
return c;
}
答案 2 :(得分:0)
日历c = calendar.getInstance();
和DatePickerDialog d
@覆盖 public void onDateSet(DatePicker视图,int Year,int mont of Year,int day of month){
吐司
c.get(Calendar.Year),c.get(的Calendar.MONTH),c.get(Calendar.Day_of_Month);
d.show
答案 3 :(得分:0)
this code is to find week from selected date,it's proper work.
Calendar date1 = Calendar.getInstance();
Calendar date2 = Calendar.getInstance();
date1.clear();
date1.set(Integer.parseInt(selected_year), Integer.parseInt(selected_month), Integer.parseInt(selected_date)); // set date 1 (yyyy,mm,dd)
System.out.println("Selected Date==>>" + date1);
date2.clear();
date2.set(Integer.parseInt(current_year), Integer.parseInt(current_month), Integer.parseInt(current_date));
System.out.println("Current Date==>>" + date2);
long diff = date2.getTimeInMillis() - date1.getTimeInMillis();
float dayCount = (float) diff / (24 * 60 * 60 * 1000);
week = (int) (dayCount / 7);
if (week <= 0) {
Toast.makeText(this, "Sry System Error", Toast.LENGTH_SHORT).show();
System.out.println("Week==>>" + week);
test = false;
} else {
Toast.makeText(this, "Done", Toast.LENGTH_SHORT).show();
System.out.println("Week==>>" + week);
test = true;
}