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

时间:2011-01-31 04:48:08

标签: java unix-timestamp hour

我使用以下代码尝试获取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'。有没有人对我的代码有什么问题有任何想法?

谢谢!

4 个答案:

答案 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来保持秒数。输入以下程序来检查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

答案 3 :(得分:0)

TL;博士

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]

32位与64位整数

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

java.time

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

现在位于Joda-Timemaintenance 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的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuarter等。