tl;博士
您的格式不正确,使用了错误的大小写并省略了逗号。
此外,您正在使用多年前被 java.time 类取代的麻烦类。
LocalDateTime.parse( // Create a `LocalDateTime` object as the input string lacks any time zone or offset-from-UTC.
"20/03/2018, 18:20:44" ,
DateTimeFormatter.ofPattern( "dd/MM/uuuu, HH:mm:ss" ) // Define a formatting pattern to match the input.
)
.atZone( // Assign a time zone to the `LocalDateTime` to create a `ZonedDateTime` object.
ZoneId.of( "America/Los_Angeles" ) // Specify time zone to be assigned. Always use proper zone names `continent/region`; never use 3-4 character pseudo-zones.
)
2018-03-20T18:20:44-07:00[美国/洛杉矶]
java.time
您正在使用麻烦的旧日期时间类,这些类现在已被 java.time 类取代。
将您的字符串解析为LocalDateTime,因为它缺少time zone 或offset-from-UTC 的指示符。
String input = "20/03/2018, 18:20:44" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu, HH:mm:ss" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;
ldt.toString(): 2018-03-20T18:20:44
缺少时区或与 UTC 的偏移意味着这 不 代表一个时刻,不是时间线上的一个点。如果没有区域/偏移的上下文,这仅代表关于 26-27 小时范围内潜在时刻的模糊概念。
显然,您确定此输入实际上是在某个时区。将ZoneId 应用于此LocalDateTime 以获取ZonedDateTime 对象。
以continent/region 的格式指定proper time zone name,例如America/Montreal、Africa/Casablanca 或Pacific/Auckland。切勿使用 3-4 个字母的缩写,例如 EST 或 IST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。
ZoneId z = ZoneId.of( "America/Los_Angeles" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;
转化
最好避免麻烦的遗留类。但是如果您必须生成一个java.util.Date 以与尚未针对java.time 更新的旧代码进行互操作,您可以进行转换。要来回转换,请在旧类上调用新方法。
java.util.Date 表示时间线上的一个点,采用 UTC,分辨率为毫秒。所以它在 java.time 中的替换是Instant。 Instant 也是 UTC 时间线上的一个点,具有更精细的纳秒分辨率。要获得Date,我们需要一个Instant,我们可以从ZonedDateTime 中提取它。
Instant instant = zdt.toInstant() ; // Same moment, same point on the timeline, different wall-clock time.
现在我们可以通过调用Date.from 来获取遗留类对象Date。
java.util.Date date = Date.from( instant ) ; // Do this only if you *must* work with `Date` class.
关于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 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。