繁体   English   中英

java HOUR和HOUR_OF_DAY都返回12小时的时间

[英]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));

TL;博士

Instant.ofEpochSecond( 1_296_442_971L )
       .atZone( ZoneId.of( "America/New_York" ) )
       .getHour()

23

......价值: 2011-01-30T23:02:51-04:00[America/New_York]

32位与64位整数

正确注意到其他答案,您必须使用64位longLong来跟踪自1970年以来UTC的毫秒数。 您的电话号码1296442971是UTC中1970年以来的整秒数。 当乘以1,000以获得毫秒 - 自 - 纪元时,您将溢出32位intInteger的限制。

java.time

另一个问题是你正在使用麻烦的旧遗留日期时间类,现在由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.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧日期时间类,如java.util.Date.Calendarjava.text.SimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time。

要了解更多信息,请参阅Oracle教程 并搜索Stack Overflow以获取许多示例和解释。

大部分的java.time功能后移植到Java 6和7 ThreeTen,反向移植 ,并进一步适应的AndroidThreeTenABP (见如何使用...... )。

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如IntervalYearWeekYearQuarter等。

这分别为我打印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来保持秒数。 键入以下检查intlong

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM