[英]java HOUR and HOUR_OF_DAY both returning 12-hr time
我使用以下代码尝试获取unix时间戳的HOUR_OF_DAY(0-23),转换为毫秒。 时间戳'1296442971'将转换为2011年1月30日星期日22:02:51 GMT-0500(美国东部时间)。
我正在运行以下代码以尝试获取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'和'DecemberHour'的值都是10,而'hour'的值应该是'22'。 有没有人对我的代码有什么问题有任何想法?
谢谢!
假设ts是包含值1296442971的变量。 我相信你没有宣称它是长型的,因此可能会溢出
将ts改为long类型后,下面的工作原理
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));
Instant.ofEpochSecond( 1_296_442_971L )
.atZone( ZoneId.of( "America/New_York" ) )
.getHour()
23
......价值: 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时间轴上的一个时刻,分辨率为纳秒 。
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项目建议迁移到java.time。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。
大部分的java.time功能后移植到Java 6和7 ThreeTen,反向移植 ,并进一步适应的Android在ThreeTenABP (见如何使用...... )。
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如Interval
, YearWeek
, YearQuarter
等。
这分别为我打印22和10。 对于NY来说这看起来是正确的(因为你提到了东部时间)。
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);
几乎可以肯定你的问题就是使用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.