我不是专家程序员,但我已经在网上寻找解决方案,找不到任何帮助我的方法。
以下是我正在尝试为工作中的自动化项目做的事情。我被给予一个以毫秒为单位的时间值。我需要花费时间值,添加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)???
非常感谢任何帮助
答案 0 :(得分:1)
我认为在获取Calendar的实例时需要使用timezome参数,如下所示:
Calendar now = Calendar.getInstance(TimeZone.getTimeZone("America/New_York"));
答案 1 :(得分:0)
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类。
如果给定自1970年第一时刻的纪元参考以来,在UTC,1970-01-01T00:00Z中的毫秒数,则解析为Instant
。 Instant
类代表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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。