我需要将日期的时间更改为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,但快速时间仍然相同。
我该怎么办?
答案 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]
课程Date
和Calendar
已经过时了。 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
方法,这是一种在毫秒值的最后位置获取零的简单方法。