简而言之
ZonedDateTime.of(
LocalDate.now( ZoneId.of( "Pacific/Auckland" ) )
.plusDays( 1 ) ,
LocalTime.parse(
"6:51:35 PM" ,
DateTimeFormatter.ofPattern( "h:m:s a" ).withLocale( Locale.US )
) ,
ZoneId.of( "Pacific/Auckland" )
)
.toString()
2018年02月02日18:51:35 +13:00 [太平洋/奥克兰]
java.time
将传入的字符串按12小时制解析为
LocalTime
对象。
String input = "6:51:35 PM" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "h:m:s a" ).withLocale( Locale.US ) ;
LocalTime lt = LocalTime.parse( input , f ) ;
要设置闹钟,您需要将日期与这个时间结合起来,并加上时区以确定实际时间。
LocalDate
类表示仅具有日期值而没有时间和时区的值。
时区在确定日期方面非常重要。对于任何给定的时刻,日期因时区而异。例如,在法国巴黎午夜后几分钟是新的一天,而在魁北克蒙特利尔仍然是“昨天”。
如果未指定时区,则JVM隐式地应用其当前默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好将所需/预期的时区明确指定为参数。
请以大陆/地区
的格式指定一个正确的时区名称,例如 {{link2:America/Montreal
}}、{{link3:Africa/Casablanca
}} 或 Pacific/Auckland
。绝不要使用三到四个字母缩写,如EST
或IST
,因为它们不是真正的时区,没有标准化,并且甚至不是唯一的!
ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
如果您想使用JVM的当前默认时区,请请求并将其作为参数传递。如果省略,则隐式应用JVM的当前默认值。最好明确指出。
ZoneId z = ZoneId.systemDefault() ; // Get JVM’s current default time zone.
通过增加一天来确定明天。
LocalDate tomorrow = today.plusDays( 1 ) ;
应用当天时间和所需时区来生成一个
ZonedDateTime
。如果由于夏令时(DST)等异常情况,您的当天时间在该时区中对于该日期无效,则该类会自动进行调整。请阅读文档以确保您理解并同意这些调整的行为。
ZonedDateTime zdt = ZonedDateTime.of( tomorrow , lt , z ) ; // Get a specific moment in time given a particular date, time-of-day, and zone.
关于 java.time
java.time 框架是内置于 Java 8 及更高版本中的。这些类取代了令人头疼的老式遗留日期时间类,如 java.util.Date
、Calendar
和 SimpleDateFormat
。
Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。
欲了解更多信息,请参阅 Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范为 JSR 310。
如何获取 java.time 类?