我使用以下代码尝试获取unix时间戳的HOUR_OF_DAY(0-23),转换为毫秒。时间戳'1296442971'将转换为2011年1月30日格林威治标准时间-0500(美国东部时间)22:02:51。
我正在运行以下代码以尝试获取24小时时间戳:
//calculate the hour for this timestamp
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone(tz));
calendar.setTimeInMillis(ts * 1000);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int twelveHour = calendar.get(Calendar.HOUR);
在此示例中,'hour'和'twelveHour'的值均为10,而'hour'的值应为'22'。有没有人对我的代码有什么问题有任何想法?
谢谢!
答案 0 :(得分:7)
假设 ts 是包含值 1296442971 的变量。我相信你不宣称它是长类型,因此可能会溢出
将 ts 更改为长类型
后,工作正常long l = 1296442971;
calendar.setTimeInMillis(l * 1000);
out.println(calendar.getTime());
out.println(calendar.get(Calendar.HOUR_OF_DAY));
out.println(calendar.get(Calendar.HOUR));
答案 1 :(得分:0)
分别为我打印22和10。对于纽约来说这看起来是正确的(因为你提到东部时间)。
long ts = 1296442971;
Calendar calendar = Calendar.getInstance();
TimeZone tz = TimeZone.getTimeZone("America/New_York");
calendar.setTimeZone(tz);
calendar.setTimeInMillis(ts*1000);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int twelveHour = calendar.get(Calendar.HOUR);
System.out.println("hour:"+hour);
System.out.println("twelvehour:"+twelveHour);
答案 2 :(得分:0)
您的问题几乎肯定是您使用int
来保持秒数。输入以下程序来检查int
和long
:
import java.util.Calendar;
import java.util.TimeZone;
public class scratch {
public static void main (String args[]) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone("America/New_York"));
int intval = 1296442971;
calendar.setTimeInMillis(intval * 1000);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int twelveHour = calendar.get(Calendar.HOUR);
System.out.println (hour);
System.out.println (twelveHour);
long longval = 1296442971L;
calendar.setTimeInMillis(longval * 1000);
hour = calendar.get(Calendar.HOUR_OF_DAY);
twelveHour = calendar.get(Calendar.HOUR);
System.out.println (hour);
System.out.println (twelveHour);
}
}
你得到:
10
10
22
10
答案 3 :(得分:0)
Instant.ofEpochSecond( 1_296_442_971L )
.atZone( ZoneId.of( "America/New_York" ) )
.getHour()
23
... for value:2011-01-30T23:02:51-04:00[America/New_York]
正确注意到其他答案时,您必须使用64位long
或Long
来跟踪自1970年以来的UTC时间内的毫秒数。您的号码1296442971
是UTC自1970年以来的整秒数。当乘以1,000以获得毫秒 - 自 - 纪元时,您会溢出32位int
或Integer
的限制。
另一个问题是你正在使用麻烦的旧遗留日期时间类,现在由java.time类取代。
Instant
Instant
类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds。
Instant
类有一个工厂方法,用于导入自纪元以来的整数秒。
Instant instant = Instant.ofEpochSecond( 1_296_442_971L );
instant.toString():2011-01-31T03:02:51Z
ZonedDateTime
要查看美国东海岸的挂钟时间,请为ZoneId
等时区应用America/New_York
来获取ZonedDateTime
个对象。
ZoneId z = ZoneId.of( "America/New_York" );
ZonedDateTime zdt = instant.atZone( z );
zdt.toString():2011-01-30T23:02:51-04:00 [America / New_York]
通过拨打getHour
,在24小时编号为0-23的情况下查询当天的小时。
int hourOfDay = zdt.getHour();
23
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧日期时间类,例如java.util.Date
,.Calendar
和& java.text.SimpleDateFormat
。
现在位于Joda-Time的maintenance mode项目建议迁移到java.time。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。
大部分java.time功能都被反向移植到Java 6& ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP(见How to use…)。
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
等。