给定一个纪元时间:例如(1513213212)我应该从现在的凌晨1点开始获得1。我如何将它转换成一天中的小时?是否有可能只使用数学(除法,mod)?
答案 0 :(得分:2)
使用java.time
,现代Java日期和时间API,也称为JSR-310:
LocalTime timeOfDay = Instant.ofEpochSecond(1513213212L)
.atOffset(ZoneOffset.UTC)
.toLocalTime();
System.out.println(timeOfDay);
int hourOfDay = timeOfDay.getHour();
System.out.println(hourOfDay);
打印:
01:00:12
1
即使你只是想做数学,我仍然更喜欢使用标准库方法:
long epochSeconds = 1513213212L;
// convert the seconds to days and back to seconds to get the seconds in a whole number of days
long secondsInWholeDays = TimeUnit.DAYS.toSeconds(TimeUnit.SECONDS.toDays(epochSeconds));
long hourOfDay = TimeUnit.SECONDS.toHours(epochSeconds - secondsInWholeDays);
System.out.println(hourOfDay);
这也会打印1
。
你的意图是“给定一个纪元时间:例如(1513213212)我应该得到1,因为它现在是凌晨1点UTC。”你认为上述哪些代码片段最清楚地表达了这个意图?这就是我用来挑选的东西。
虽然MadProgrammer在his/her comment中肯定是正确的,但日期和时间算术很复杂,因此你应该将它留给日期和时间API,我相信这是一个罕见的情况,其中没有太复杂的数学给出了正确的答案。这取决于忽略闰秒问题是安全的,如果要求数学解决方案,你应该确保检查这个假设。我个人也不会用它。
答案 1 :(得分:1)
通过仅使用数学来完成它几乎是不可能的。 (闰年和所有)。最好使用既定的API来完成所有艰苦的工作。
您可以使用以下方法执行此操作。
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(1513213212* 1000L);
cal.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(cal.get(Calendar.HOUR));//12 hour clock
System.out.println(cal.get(Calendar.HOUR_OF_DAY));//24 hour clock