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)
版本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
类.