我该如何重置日期或日期

时间:2017-02-05 17:13:18

标签: java date android-studio datepicker

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");


    }
};

代码实际上是可行的,但问题是当我再次选择日期时,最早的剩余月份将是+最新的剩余月份。任何人都可以告诉我问题是什么?

1 个答案:

答案 0 :(得分:0)

TL;博士

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

详细

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

避免遗留日期时间类

请勿使用麻烦的旧版日期时间类,例如java.util.Datejava.util.Calendar。这些现在是遗留的,取而代之的是java.time类。许多java.time功能都被反向移植到Java 6& ThreeTen-Backport中的7,并在ThreeTenABP中进一步适应Android。

此外,DateCalendar代表一个包含时间的日期。您只需要一个日期用于您的目的。

LocalDate

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

时区

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

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

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

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.DateCalendar和& SimpleDateFormat

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

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?