将纪元时间转换为小时

时间:2017-12-14 01:01:49

标签: java datetime math epoch

给定一个纪元时间:例如(1513213212)我应该从现在的凌晨1点开始获得1。我如何将它转换成一天中的小时?是否有可能只使用数学(除法,mod)?

2 个答案:

答案 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