我知道我可以使用以下代码将long转换为Data并获取其小时部分:
Calendar c = Calendar.getInstance();
c.setTimeInMillis(long-variable);
c.get(Calendar.HOUR_OF_DAY);
但这实际上效率不高,而且由于此代码从多个线程运行,我不能重用Calendar对象,是否有更有效的方法从日期的长表示中获取小时部分?
谢谢!
答案 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