【问题标题】:how to get MONTHS, DAYS and weeks (android datepicker)如何获取 MONTHS、DAYS 和 week (android datepicker)
【发布时间】:2014-11-09 15:51:09
【问题描述】:

更新

我正在创建怀孕截止日期倒计时,因此我使用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: 结束时刻必须大于或等于开始

在 org.joda.time.base.Abstraction.checkInterval(AbstractInterval.java.63)

在 org.joda.time.base.BaseInterval(BaseInterval.java:94)

在 org.joda.time.Interval.(Interval.java.122)

在 com.date.androin.Profile$1.onDataset(Profile.java:168)

在 android.app.DatePickerDialog.tryNotifyDataSet(DatePickerDialog.java.148)

在 android.app.DatePickerDialog.onClick(DatePickerDialog.java.116)

在 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)

在 java.lang.reflect.Method.invokeNative(Native Method)

在 java.lang.reflect.Method.invoke(Method.java:511)

在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)

在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)

在 dalvik.system.NativeStrat.main(Native Method)

【问题讨论】:

  • 发帖前请先搜索 StackOverflow。数百个问题和答案已经解决了这个话题。例如,如果在网页上查看,请注意右侧的“相关”问题。提示:专门搜索“joda”和“period”。
  • 我尝试搜索我的问题,但我仍然找不到正确的答案。所以我尝试并决定发布一个问题。但我仍然会尝试寻找更多答案...

标签: java android date datepicker countdown


【解决方案1】:

有一个图书馆 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 ,您可以从中提取月/日/周的差异

Period duePeriod = interval.toPeriod();

// get difference in months

duePeriod.getMonths();

// get difference in weeks

duePeriod.getWeeks();

请参阅下面的 Period Javadoc 以获取 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());
}

【讨论】:

  • 你能帮我如何使用joda time吗?我只是 android 编程的新手
  • 我尝试了您的代码,但我在这部分出现错误 DateTime end = new DateTime(arg0.getYear(), arg0.getMonth(), arg0.getDayOfMonth(), chrono);它说“构造函数 DateTime(int, int, int, Chronology) 是未定义的”所以我试图通过这样做 DateTime end = new DateTime(arg0.getYear(), arg0.getMonth(), arg0.getDayOfMonth 来修复它(), 日, 月, 年, chrono);但是当我运行我的代码时,我的应用程序强制关闭或停止。它说“java.lang.IllegealArgumentExecption:结束时刻必须大于或等于开始”
  • 很抱歉,我已更正了代码。现在应该可以正常工作了。问题是因为构造函数的参数比实际参数少,这就是为什么你得到构造函数未定义错误的原因。但请参阅 javadoc 以查找类支持的构造函数及其参数的列表,以备将来使用。还要确保用户通过 datepicker 选择的日期在当前日期之后。您可以通过仅将日期选择器的日历初始化为当前和未来日期来轻松实现这一点。因此,用户无法选择过去的日期。
  • 我试过你说的,但我仍然有同样的错误。有没有机会我需要改变我的编码风格来初始化日期选择器?
  • 您遇到什么错误?在此处粘贴整个堆栈跟踪
【解决方案2】:
//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;
}

【讨论】:

    【解决方案3】:

    日历 c = calendar.getInstance();

    和 DatePickerDialog d

    @覆盖 public void onDateSet(DatePicker view,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

    【讨论】:

      【解决方案4】:
      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;
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-02
        • 2020-01-10
        • 1970-01-01
        • 1970-01-01
        • 2017-02-20
        • 1970-01-01
        相关资源
        最近更新 更多