Java:CALENDAR.HOUR不返回我设置的值?

时间:2013-06-06 15:20:48

标签: java

我不是专家程序员,但我已经在网上寻找解决方案,找不到任何帮助我的方法。

以下是我正在尝试为工作中的自动化项目做的事情。我被给予一个以毫秒为单位的时间值。我需要花费时间值,添加6分钟,然后检索小时,分钟和AM_PM值,这样我就可以进行测试了。

问题是,在我检索时间之后,然后我用CALENDAR设置它,进行添加,当我去检索分钟和小时时,它们没有正确设置。

例如,这是我的代码:

    _logger.info("Get current system time in milliseconds");
    long currentTime = TimeApi.getCurrentSystemTime(_deviceUnderTestPIN);
    _logger.info("Current device time is : " + Long.toString(currentTime));

    _logger.info("Set Calendar object with device time");
    Calendar now = Calendar.getInstance();
    now.setTimeInMillis(currentTime);

    long timeSet = now.getTimeInMillis();
    _logger.info("Calendar object is set to : " + Long.toString(timeSet));

    _logger.info("add mintuesToAdd to current time");
    now.add(Calendar.MINUTE, minutesToAdd);

    long timeAdd = now.getTimeInMillis();
    _logger.info("Calendar Time after Add: " + Long.toString(timeAdd));

    _logger.info("set hour and minute");
    // if the hour is 12am or 12pm the Calendar object will return 0, we need to pass  in 12 so we will set it to 12 below if it returns 0
    hour = now.get(Calendar.HOUR);
    if (hour == 0) {
        hour = 12;
    }
    minutes = now.get(Calendar.MINUTE);

    _logger.info("set amPM");
    if (now.get(Calendar.AM_PM) == 0) {
        amPM = false;
    } else {
        amPM = true;
    }

    _logger.info("Setting alarm hour to: " + Integer.toString(hour));
    _logger.info("Setting the alarm minutes to: " + Integer.toString(minutes));
    _logger.info("Setting alarm AM_PM to: " + Boolean.toString(amPM));

以下是我的测试运行的输出:

2013-06-06  13:15:36.007  INFO Current device time is : 1370524535000
2013-06-06  13:15:36.007  INFO Set Calendar object with device time
2013-06-06  13:15:36.007  INFO Calendar object is set to : 1370524535000
2013-06-06  13:15:36.007  INFO add mintuesToAdd to current time
2013-06-06  13:15:36.007  INFO Calendar Time after Add: 1370524895000
2013-06-06  13:15:36.007  INFO set hour and minute
2013-06-06  13:15:36.007  INFO set amPM
2013-06-06  13:15:36.023  INFO Setting alarm hour to: 1
2013-06-06  13:15:36.023  INFO Setting the alarm minutes to: 21
2013-06-06  13:15:36.023  INFO Setting alarm AM_PM to: true

你可以看到我所拥有的时间价值,并且正试图设定它.Thu Jun 06 2013 09:15:35 GMT-0400(东部夏令时间)。所以我不明白的部分是为什么我现在打电话给服务器时间.get(Calendar.HOUR)???

非常感谢任何帮助

2 个答案:

答案 0 :(得分:1)

我认为在获取Calendar的实例时需要使用timezome参数,如下所示:

Calendar now = Calendar.getInstance(TimeZone.getTimeZone("America/New_York"));

答案 1 :(得分:0)

TL;博士

Instant.ofEpochMilli( 1_370_524_535_000L )                      // Parse count-of-milliseconds-since-epoch as a `Instant`. 
    .plus( Duration.ofMinutes( 6 ) )                            // Calculate six minutes later.
    .atZone( ZoneId.of( "Asia/Kolkata" ) )                      // Adjust from UTC of a `Instant` to the time zone of a `ZonedDateTime` object.
    .toLocalTime()                                              // Extract the time-of-day, without the date and without the time zone.
    .format(                                                    // Generate a string.
        DateTimeFormatter.ofLocalizedTime( FormatStyle.MEDIUM ) // Automatically localize using…
                         .withLocale( Locale.US )               // …the human language and cultural norms of a given locale.
     )
  

下午6:51:35

java.time

你正在使用现在遗留下来的麻烦的旧日期时间类,取而代之的是java.time类。

如果给定自1970年第一时刻的纪元参考以来,在UTC,1970-01-01T00:00Z中的毫秒数,则解析为InstantInstant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

Instant instant = Instant.ofEpochMilli( 1_370_524_535_000L ) ;
  

instant.toString():2013-06-06T13:15:35Z

将您的六分钟时间段表示为Duration

Duration d = Duration.ofMinutes( 6 ) ; // Span of time (hours-minutes-seconds) unattached to the timeline.

做数学。

Instant sixMinutesLater = instant.plus( d ) ; // Add the duration of six minutes to the UTC moment.

转换为更灵活的OffsetDateTime,以完成我们的其他工作。

OffsetDateTime odt = OffsetDateTime.ofInstant( sixMinutesLater , ZoneOffset.UTC ) ;

要获取时间,没有日期且没有时区,请提取LocalTime

LocalTime lt = odt.toLocalTime() ;

要问是否是早上,请与代表中午的另一个LocalTime比较,12:00。

Boolean isBeforeNoon = lt.isBefore( LocalTime.NOON ) ;

您可以询问这些部分:getHour(0-23),getMinute,依此类推。

您可能希望生成表示此值的字符串。指定格式设置模式,或自动本地化。

DateTimeFormatter f = DateTimeFormatter.ofLocalizedTime( FormatStyle.MEDIUM ).withLocale( Locale.US ) ;
String output = lt.format( f ) ;

上述代码假定您希望在UTC中工作。如果您想要某个地区的人在挂钟上看到的时间,则必须指定一个时区(ZoneId)来获取ZonedDateTime对象。

ZoneId z = ZoneId.of( "Africa/Tunis" );
ZonedDateTime zdtAfricaTunis = instant.atZone( z );
LocalTime ltAfricaTunis = zdtAfricaTunis.toLocalTime();

转储到控制台。

System.out.println( "instant.toString(): " + instant + " and sixMinutesLaterInstant: " + sixMinutesLaterInstant );
System.out.println( "odt.toString(): " + odt + " and lt.toString(): " + lt + " is morning: " + isBeforeNoon + " with output: " + output );
System.out.println( "zdtAfricaTunis.toString(): " + zdtAfricaTunis + " and ltAfricaTunis.toString(): " + ltAfricaTunis );
  

instant.toString():2013-06-06T13:15:35Z和sixMinutesLaterInstant:2013-06-06T13:21:35Z

     

odt.toString():2013-06-06T13:21:35Z和lt.toString():14:21:35是早晨:假输出:1:21:35 PM

     

zdtAfricaTunis.toString():2013-06-06T14:21:35 + 01:00 [非洲/突尼斯]和ltAfricaTunis.toString():14:21:35

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

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