【问题标题】:Java get Time parts from a Long representation efficientlyJava 有效地从 Long 表示中获取时间部分
【发布时间】:2017-05-22 12:12:02
【问题描述】:

我知道我可以使用以下代码将 long 转换为 Data 并获取其小时部分:

Calendar c = Calendar.getInstance();
c.setTimeInMillis(long-variable);
c.get(Calendar.HOUR_OF_DAY);

但这确实效率不高,而且由于这段代码从多个线程运行,我不能只重用 Calendar 对象,有没有更有效的方法从日期的长表示中获取小时部分?

谢谢!

【问题讨论】:

  • long 表示没有与之关联的时区 - Calendar 有。 long 表示只是一个瞬间。在英国,当前时间对我来说一天中有 13 个小时,但它可能完全适合您……您对哪个时区感兴趣?您当前的代码使用系统默认时区 - 您确定这是您想要的吗?
  • (longvar/1000/60/60)%24 ?当然,你会得到 GMT 的时间。

标签: java


【解决方案1】:

Calendar 不是线程安全的,所以Calendar 实例应该在多线程时同步。当然,使用ThreadLocal 性能好。像这样:

private ThreadLocal<Calendar> calendar=new ThreadLocal<Calendar>(){
    @Override
    protected Calendar initialValue() {
        return Calendar.getInstance();
    }
};

public void foo(){
    Calendar c = calendar.get();
    c.setTimeInMillis(new Date().getTime());
    System.out.println(c.get(Calendar.HOUR_OF_DAY));
}

【讨论】:

    【解决方案2】:

    使用 java 8 的 LocalTime

    LocalTime time = Instant.ofEpochMilli(longValue)
        .atZone(ZoneId.systemDefault())
        .toLocalTime();
    System.out.println(time.getHour());
    

    【讨论】:

      【解决方案3】:

      这不是关于效率,而是关于线程安全。 Calendar 类不是线程安全的,这意味着跨多个线程修改同一个 Calendar 类实例可能会导致不确定的结果。只要每个线程都有专用的日历实例(不与其他线程共享),一切都应该没问题。

      关于线程安全的几句话: http://www.javaworld.com/article/2076747/core-java/design-for-thread-safety.html

      关于日历类: https://stackoverflow.com/a/6245086/1529940

      您可能还想看看 Joda-Time 库或 Java8 中的新 Time API

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 2015-11-19
        • 1970-01-01
        • 2017-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多