Java有效地从长表示中获取时间部分
我知道我可以使用以下代码将long转换为数据并获得其小时部分:Java有效地从长表示中获取时间部分,java,Java,我知道我可以使用以下代码将long转换为数据并获得其小时部分: Calendar c = Calendar.getInstance(); c.setTimeInMillis(long-variable); c.get(Calendar.HOUR_OF_DAY); 但是这真的不是很有效,因为这段代码是从多个线程运行的,我不能只重用日历对象,有没有更有效的方法从一个日期的长表示中获取小时部分 谢谢 这不是效率问题,而是线程安全问题。Calendar类不是线程安全的,这意味着跨多个线程修改同一Cal
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(日历小时/天));
}
Along
表示没有与之关联的时区-A日历有。long
表示只是时间上的一瞬间。在英国,当前的瞬间对我来说是一天中的13个小时,但它可能是完全适合你的另一个地方。。。你对哪个时区感兴趣?您当前的代码使用系统默认时区-您确定这是您想要的吗?(longvar/1000/60/60)%24
?当然,你会得到格林尼治标准时间的小时数。long
表示法没有与之关联的时区,日历有。long
表示只是时间上的一瞬间。在英国,当前的瞬间对我来说是一天中的13个小时,但它可能是完全适合你的另一个地方。。。你对哪个时区感兴趣?您当前的代码使用系统默认时区-您确定这是您想要的吗?(longvar/1000/60/60)%24
?当然,你会得到格林尼治标准时间的小时数。