如何更改日期和快速时间

时间:2017-12-14 10:52:46

标签: java calendar

我需要将日期的时间更改为23.59。 我可以做到,但快速时间保持不变,所以日期实际上没有改变。

* start是我的开始日期,例如2017年12月6日上午9点13分

    Calendar calendar = Calendar.getInstance();
    calendar.setTime(start);
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE,0);
    calendar.set(Calendar.SECOND,0);
    start = calendar.getTime();

我的开始日期是2017年12月6日凌晨23.59,但快速时间仍然相同。

我该怎么办?

1 个答案:

答案 0 :(得分:2)

我建议您停止使用Calendar类并使用java.time,这是您的任务的现代Java日期和时间API:

    ZonedDateTime dateTime = ZonedDateTime.of(
            2017, 12, 6, 9, 31, 0, 0, ZoneId.of("Canada/Newfoundland"));

    // to change time to 0:00:00
    dateTime = dateTime.truncatedTo(ChronoUnit.DAYS);
    System.out.println("Changed to 0:00:       " + dateTime);
    // to change to end of day
    dateTime = dateTime.with(LocalTime.MAX);
    System.out.println("Changed to end of day: " + dateTime);
    // if you need it without seconds
    dateTime = dateTime.truncatedTo(ChronoUnit.MINUTES);
    System.out.println("Changed to 23:59:      " + dateTime);

打印

Changed to 0:00:       2017-12-06T00:00-03:30[Canada/Newfoundland]
Changed to end of day: 2017-12-06T23:59:59.999999999-03:30[Canada/Newfoundland]
Changed to 23:59:      2017-12-06T23:59-03:30[Canada/Newfoundland]

课程DateCalendar已经过时了。 java.time使用起来非常好(它也被称为JSR-310)。

我建议你明确指定你想要的时区。所以请填写你的,除非恰好是加拿大/纽芬兰。要使用JVM的时区设置,请使用ZoneId.systemDefault(),但请注意,此设置可能会被程序的其他部分或在同一JVM中运行的其他程序更改。

如果start是来自您不想立即更改的旧版API的Date,请先将其转换为java.time.Instant并执行剩余的操作从那里:

    ZonedDateTime dateTime = start.toInstant().atZone(ZoneId.of("Canada/Newfoundland"));

其余与上述相同。如果情况恰恰相反,您需要在最后将Date传递给旧版API,相反的转换是:

    start = Date.from(dateTime.toInstant());

您的代码出了什么问题?

您的代码没有任何问题。至少在我的电脑上,它的行为符合预期。如果没有你的话,我会非常惊讶。一点推测:您可能已经注意到start.fastTime的值的第一个和最后一个数字是相同的,这可能会让您误以为该值没有改变。如果这是问题,它可能会帮助您添加此行:

    calendar.set(Calendar.MILLISECOND, 0);

这将确保fastTime以至少五个零结束,例如1513206000000,并且它已经发生变化将更加明显。幸运的是,现代API提供了truncatedTo方法,这是一种在毫秒值的最后位置获取零的简单方法。

链接