【问题标题】:How can i reset the day or date如何重置日期或日期
【发布时间】:2023-04-06 18:07:02
【问题描述】:
DatePickerDialog.OnDateSetListener listener = new DatePickerDialog.OnDateSetListener(){
    @Override
    public void onDateSet(DatePicker view,int year,int monthOfYear,int dayOfMonth){
        //Use Datepicker to pick the date i want.
        String date1 = dayOfMonth+"/"+(monthOfYear+1)+"/"+year;
        //get the current date.
        String date2 = new SimpleDateFormat("dd/MM/yyyy").format(new Date());

        Date d1 = new Date(date1);
        Date d2 = new Date(date2);

        Calendar cal1 = Calendar.getInstance();cal1.setTime(d1);
        Calendar cal2 = Calendar.getInstance();cal2.setTime(d2);

            //Compare two date.
            long calq = (d2.getTime() - d1.getTime()) / (24 * 60 * 60 * 1000);
            long caq = calq / 30;

            String c = Long.toString(calq);
            String b = Long.toString(caq);
            e1.setText(c);
            test1.setText(b + " month");


    }
};

代码实际上是有效的,但问题是当我再次选择日期时,剩余的最早月份将+剩余的最新月份。谁能告诉我问题是什么??

【问题讨论】:

    标签: java date android-studio datepicker


    【解决方案1】:

    tl;博士

    Period.between(
        LocalDate.now() ,
        LocalDate.of( 
            myDatePicker.getYear() , 
            myDatePicker.getMonth() , 
            myDatePicker.getDayOfMonth() 
        )
    )
    

    详情

    您的问题不清楚,但您似乎正在尝试计算所选日期和当前日期(今天)之间经过的时间。

    避免使用旧的日期时间类

    不要使用麻烦的旧日期时间类,例如 java.util.Datejava.util.Calendar。这些现在是遗留的,被 java.time 类所取代。大部分 java.time 功能在ThreeTen-Backport 中向后移植到 Java 6 和 7,并在 ThreeTenABP 中进一步适应 Android。

    另外,DateCalendar 表示带有时间的日期。您需要一个仅用于您的目的的日期。

    LocalDate

    LocalDate 类表示没有时间和时区的仅日期值。

    时区

    时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因区域而异。例如,Paris France 中午夜过后几分钟是新的一天,而 Montréal Québec 中仍然是“昨天”。

    您可以使用当前的默认时区,或者,如果很重要,请询问用户他们的预期/预期时区。

    continent/region 的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用 3-4 个字母的缩写,例如 ESTIST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。

    ZoneId z = ZoneId.systemDefault();  // or ZoneId.of( "America/Montreal" );
    LocalDate today = LocalDate.now( z );
    

    不要费心构造字符串来构建日期。只需向 DatePicker 对象询问其数据即可。

    int year = myDatePicker.getYear() ;
    int month = myDatePicker.getMonth() ;
    int dayOfMonth = myDatePicker.getDayOfMonth() ;
    

    从这些中创建一个LocalDate

    LocalDate ld = LocalDate.of( year , month , dayOfMonth ) ;
    

    Period

    要表示所选日期与今天之间的时间跨度,请使用 Period 类。

    Period period = Period.between( today , ld );  
    

    生成String 作为输出

    要将该值视为standard ISO 8601 format 中的字符串,请调用toString。您将在三天内产生这样的PT3D。如果您的用户可以接受培训以理解这种紧凑的格式,请考虑使用它。

    要构建您自己的字符串作为输出,请查询 Period 对象中的天数、月数和年数。

    int days = period.getDays();
    int days = period.getMonths();
    int years = period.getYears();
    
    String output = "years: " + years + "months: " + months + "days: " + days ;
    

    关于java.time

    java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

    Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

    要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

    从哪里获得 java.time 类?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多