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

时间:2017-06-06 08:26:51

标签: 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();

版本2:

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

return Date.from(i.toInstant());

版本3:

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

return new Date(i.toEpochSecond());

2 个答案:

答案 0 :(得分:7)

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

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

版本3也具有版本2的优点,但在转换为Date之前转换为自纪元以来的毫秒数。在版本2中通过Instant进行的转换更自然,因此稍微偏爱。

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

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

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

答案 1 :(得分:-2)

如果我选择版本1

ZonedDateTime是新常用的不常用的