使用日历或日期时间设置日期

nim*_*o23 3 java java-8 java-date

我想设置日期实例的小时和分钟.我有3个解决方案.

我该拿哪个,为什么?:

版本1:

Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.MILLISECOND, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 8);
calendar.set(Calendar.HOUR, 30);

return calendar.getTime();
Run Code Online (Sandbox Code Playgroud)

版本2:

ZonedDateTime i = date.toInstant()
.atZone(ZoneId.systemDefault())
.withHour(8)
.withMinute(30);

return Date.from(i.toInstant());
Run Code Online (Sandbox Code Playgroud)

版本3:

ZonedDateTime i = date.toInstant()
.atZone(ZoneId.systemDefault())
.withHour(8)
.withMinute(30);

return new Date(i.toEpochSecond());
Run Code Online (Sandbox Code Playgroud)

Ole*_*.V. 7

版本1使用长期过时的Calendar类.它的另一个问题是它正在使用JVM的当前时区设置,而没有在代码中明确说明这一点,这种特性可能在将来某个时候给某人带来不愉快的惊喜.

版本2尽可能地利用了较新的类,并且明确了如何使用JVM的时区设置.好的解决方案.

版本3也具有版本2的优点,但是自转换之前的纪元以来转换为毫秒Date.Instant版本2中的转换更自然,因此稍微偏爱.

正如评论中提到的那样,问题中写的第2版和第3版并没有摆脱秒和秒的分数.简单的解决方案(假设你想要这个)是使用truncatedTo():

    ZonedDateTime i = date.toInstant()
            .atZone(ZoneId.systemDefault())
            .withHour(8)
            .withMinute(30)
            .truncatedTo(ChronoUnit.MINUTES);
Run Code Online (Sandbox Code Playgroud)

最重要的是,如果你可以完全避免使用过时的Date类.