tl;博士
LocalDateTime.of(
LocalDate.parse(
"31/01/2012" ,
DateTimeFormatter.ofPattern( "dd/MM/uuuu" )
) ,
LocalTime.parse( "20:00" )
).atZone( ZoneId.of( "Africa/Tunis" ) )
2012-01-31T20:00+01:00[非洲/突尼斯]
看到这个code run live at IdeOne.com。
使用 java.time
您正在使用麻烦的旧日期时间类,现在已被 java.time 类所取代。
您不需要连接字符串。解析每一个,一个作为LocalDate,一个作为LocalTime。
DateTimeFormatter fDate = DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ;
LocalDate ld = LocalDate.format( "31/01/2012" , fDate ) ;
LocalTime lt = LocalTime.parse( "20:00" ) ; // Built-in formatter handles standard ISO 8601 formats.
您可以将这两个部分组合成LocalDateTime。 LocalDateTime 没有 time zone 和 offset-from-UTC 的概念。
LocalDateTime ldt = LocalDateTime.of( ld , lt ) ;
我们没有关于与 UTC 的偏移量或时区的指示。所以我们确实没有有一个特定的时刻,关于可能的时刻的想法。例如,晚上 8 点在新西兰 (Pacific/Auckland) 比在印度 (Asia/Kolkata) 早得多,而在法国 (Europe/Paris) 晚几个小时。
要确定特定时刻,我们必须将 LocalDateTime 放在时区的上下文中。也许您打算将那一刻用于 UTC。
OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;
或者你的意思是魁北克时代。
以continent/region 的格式指定proper time zone name,例如America/Montreal、Africa/Casablanca 或Pacific/Auckland。切勿使用 3-4 个字母的缩写,例如 EST 或 IST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;
关于java.time
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。