Java有效地从Long表示中获取Time部分

时间:2017-05-22 12:12:02

标签: java

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

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

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

谢谢!

3 个答案:

答案 0 :(得分:2)

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));
}

答案 1 :(得分:1)

使用java 8的LocalTime

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

答案 2 :(得分:0)

它与线程安全的效率无关。 Calendar类不是线程安全的,这意味着跨多个线程修改相同的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