简短概述
java.util.Date.from (
LocalDateTime.parse(
"Wed, 09 Feb 2011 12:34:27" ,
DateTimeFormatter.ofPattern( "EEE, dd MMM uuuu HH:mm:ss" , Locale.US )
).atZone( ZoneId.of( "America/Montreal" ) )
.toInstant()
)
详情
问题和其他答案都使用过时的、麻烦的旧日期时间类,这些类现在已经被 java.time 类所取代。
使用 java.time
输入字符串缺乏任何关于时区或UTC偏移量的指示。因此我们将其解析为 OffsetDateTime
。
指定一个 Locale
来确定 (a) 用于翻译星期几、月份名称等人类语言,以及 (b) 决定缩写、大写、标点符号、分隔符等文化规范。
String input = "Wed, 09 Feb 2011 12:34:27" ;
Locale l = Locale.US ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE, dd MMM uuuu HH:mm:ss" , l ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;
ldt.toString(): 2011-02-09T12:34:27
时区
问题和其他答案都忽略了关键的时区问题。
输入字符串缺少时区或偏移量。我们解析为一个LocalDateTime
,它不是时间线上的瞬间,只是可能瞬间的模糊概念。就像说“圣诞节在2017年12月25日午夜开始”,这在没有放置在特定时区的上下文中是没有意义的。在奥克兰新西兰,圣诞节比在巴黎法国早得多,在蒙特利尔魁北克则更晚。
如果您知道所需的时区,请分配一个ZoneId
以生成一个ZonedDateTime
。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ldt.atZone( z ); // Assigning a time zone to determine an actual moment on the timeline.
转换
最好避免使用麻烦的旧日期时间类。但是如果您必须与尚未更新为java.time类型的旧代码交互,您可以在旧类中查找新方法并在旧类和java.time之间进行转换。
java.util.Date
是UTC时间轴上的一个时刻。因此,我们需要从ZonedDateTime
中提取一个Instant
。Instant
类表示UTC时间轴上的一个时刻,具有纳秒的分辨率(最多九(9)位小数)。
Instant instant = zdt.toInstant() ;
java.util.Date d = java.util.Date.from( instant ) ; // Convert from java.time to legacy class.
朝另一个方向。
Instant instant = d.toInstant() ;
ZonedDateTime zdt = instant.atZone( z ) ;
关于java.time
java.time框架已内置于Java 8及更高版本中。这些类替代了旧的legacy日期时间类,例如java.util.Date
, Calendar
, 和 SimpleDateFormat
。
Joda-Time项目现在处于维护模式,建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程。并搜索Stack Overflow以获取许多示例和解释。规范为JSR 310。
您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。无需字符串,无需java.sql.*
类。
如何获取java.time类?
ThreeTen-Extra项目扩展了java.time的附加类。该项目是java.time可能未来新增的一个实验场。您可能会在这里找到一些有用的类,例如Interval
, YearWeek
, YearQuarter
和更多。
java.util.Date
、java.util.Calendar
和java.text.SimpleTextFormat
)现在已被认定为遗留系统,并已被 java.time 类所取代。请参阅 Oracle 教程。 - Basil Bourque