【问题标题】:Converting epoch time to the hour将纪元时间转换为小时
【发布时间】:2018-05-28 00:22:40
【问题描述】:

给定一个纪元时间:例如(1513213212)我应该得到 1,因为它现在是 UTC 凌晨 1 点。我将如何将其转换为一天中的时间?是否可以仅使用数学(除法,模)来做到这一点?

【问题讨论】:

  • 你可以使用 Math,当然,但是 LocalTime 类的存在是有原因的
  • “是否可以仅使用数学(除法,模)来做到这一点?” - 严格来说,是的,但你不应该,因为日期/时间数学是复杂并且必须涵盖大量边缘情况(并不总是一天 24 小时或一年 365 天)。你最好使用 Java 8+ 中提供的日期/时间 API,或者如果你真的卡住了,Calendar 或 java.util.Date
  • 从Unix时间转换的问题已经很多了。为了您自己的利益,最好在询问之前进行搜索。如果您发现不足,请说明方法,我们可以更好地指导您。参见例如thie question: Java: Date from unix timestamp。

标签: java datetime math epoch


【解决方案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

【讨论】:

  • 请不要教年轻人使用早已过时的Calendar类。今天我们在java.time, the modern Java date and time API 中做得更好。
  • 当询问“一天中的时间”时,我们是否对问题有不同的解释?如果第二个值是 1513260000,我将 14 理解为正确答案。您的代码打印 2.
  • 我不确定OP是否年轻,它只能证明我老了:)。你是对的,我使用的是 12 小时格式。还添加了 24 小时格式。
【解决方案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,因为现在是 UTC 时间凌晨 1 点。”在您看来,上述代码 sn-ps 中哪一个最清楚地表达了这种意图?这就是我用来挑选的。

虽然 MadProgrammer 在 his/her comment 中肯定是正确的,即日期和时间算术很复杂,因此您应该将其留给日期和时间 API,但我相信这是罕见的情况之一,其中不太复杂的数学给出了正确答案。忽略闰秒问题是否安全取决于是否安全,如果要使用数学解决方案,则应确保检查此假设。反正我个人是不会用的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 2012-09-06
    • 2012-08-12
    • 2019-04-09
    • 2014-05-03
    • 2018-04-24
    • 2013-06-27
    相关资源
    最近更新 更多