Java有效地从长表示中获取时间部分

Java有效地从长表示中获取时间部分,java,Java,我知道我可以使用以下代码将long转换为数据并获得其小时部分: Calendar c = Calendar.getInstance(); c.setTimeInMillis(long-variable); c.get(Calendar.HOUR_OF_DAY); 但是这真的不是很有效,因为这段代码是从多个线程运行的,我不能只重用日历对象,有没有更有效的方法从一个日期的长表示中获取小时部分 谢谢 这不是效率问题,而是线程安全问题。Calendar类不是线程安全的,这意味着跨多个线程修改同一Cal

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

Calendar c = Calendar.getInstance();
c.setTimeInMillis(long-variable);
c.get(Calendar.HOUR_OF_DAY);
但是这真的不是很有效,因为这段代码是从多个线程运行的,我不能只重用日历对象,有没有更有效的方法从一个日期的长表示中获取小时部分


谢谢

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

关于线程安全的几句话:

关于日历类:


您可能还想了解一下Java8中的Joda时间库或新的时间API,这与效率无关,而是与线程安全有关。Calendar类不是线程安全的,这意味着跨多个线程修改同一Calendar类实例可能会导致不确定的结果。只要每个线程都有专用的日历实例(不与其他线程共享),一切都应该正常

关于线程安全的几句话:

关于日历类:


您可能还想使用Java8的LocalTime查看Java8中的Joda时间库或新的时间API

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

使用Java8的LocalTime

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

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));
}
private ThreadLocal calendar=new ThreadLocal(){
@凌驾
受保护的日历初始值(){
返回Calendar.getInstance();
}
};
公共图书馆{
Calendar c=Calendar.get();
c、 setTimeInMillis(新日期().getTime());
System.out.println(c.get(日历小时/天));
}

日历不是线程安全的,因此在多线程时应同步日历实例。当然,使用
线程本地
在性能上很好。如下所示:

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));
}
private ThreadLocal calendar=new ThreadLocal(){
@凌驾
受保护的日历初始值(){
返回Calendar.getInstance();
}
};
公共图书馆{
Calendar c=Calendar.get();
c、 setTimeInMillis(新日期().getTime());
System.out.println(c.get(日历小时/天));
}

A
long
表示没有与之关联的时区-A
日历有。
long
表示只是时间上的一瞬间。在英国,当前的瞬间对我来说是一天中的13个小时,但它可能是完全适合你的另一个地方。。。你对哪个时区感兴趣?您当前的代码使用系统默认时区-您确定这是您想要的吗?
(longvar/1000/60/60)%24
?当然,你会得到格林尼治标准时间的小时数。
long
表示法没有与之关联的时区,
日历有。
long
表示只是时间上的一瞬间。在英国,当前的瞬间对我来说是一天中的13个小时,但它可能是完全适合你的另一个地方。。。你对哪个时区感兴趣?您当前的代码使用系统默认时区-您确定这是您想要的吗?
(longvar/1000/60/60)%24
?当然,你会得到格林尼治标准时间的小时数。