我想设置日期实例的小时和分钟。我有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());
答案 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是新常用的不常用的