tl;博士
LocalDateTime ldt = LocalDateTime.parse( "2012-01-10 23:13:26".replace( " " , "T" ) );
……和……
LocalDate localDate = LocalDate.parse ( "January 13, 2012" , DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG ).withLocale ( Locale.US ) );
详情
Answer by Jonik 基本正确,但遗漏了一些重要问题。
java.time
如果有什么比 Joda 更好的东西,也请告诉我。
是的,有更好的东西,java.time 框架。 Joda-Time 团队建议迁移到 java.time 作为其继任者。
java.time 框架内置于 Java 8 及更高版本中。这些类取代了旧的麻烦的日期时间类,例如 java.util.Date、.Calendar 和 java.text.SimpleDateFormat。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。
大部分 java.time 功能在ThreeTen-Backport 中向后移植到 Java 6 和 7,并在 ThreeTenABP 中进一步适应 Android。
日期时间
您的第一个输入是日期加上时间。它缺少任何offset-from-UTC 或time zone 信息,因此我们将其解析为LocalDateTime 对象。 “Local…”是指任何的地方,没有具体的地方。所以这不是时间线上的实际时刻,而只是一个关于时刻的粗略概念。
要解析输入字符串2012-01-10 23:13:26,我们可以用T 替换中间的空格,以符合ISO 8601 日期时间值标准格式的规范样式。
在解析和生成日期时间值的文本表示时,java.time 类默认使用 ISO 8601 格式。所以不需要定义解析模式。
String input = "2012-01-10 23:13:26".replace( " " , "T" );
LocalDateTime ldt = LocalDateTime.parse( input );
如果您从该值的上下文中知道预期的时区,则应用它来定义时间轴上的实际时刻。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );
转储到控制台。
System.out.println ( "input: " + input + " | zdt: " + zdt );
输入:2012-01-10T23:13:26 | zdt: 2012-01-10T23:13:26-05:00[美国/蒙特利尔]
仅限日期
你们中的第二个输入是一个仅日期值,没有时间和时区。为此,我们需要 LocalDate 类。
我认为该输入的格式符合美国的语言(英语)和文化规范。因此无需明确指定格式模式。我们可以简单地通过指定Locale 来请求一个知道美国格式的格式化程序。我们根据这种格式的长度指定FormatStyle.LONG。
String input = "January 13, 2012";
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG ).withLocale ( Locale.US );
LocalDate localDate = LocalDate.parse ( input , formatter );
转储到控制台。
System.out.println ( "input: " + input + " | localDate: " + localDate );
输入:2012 年 1 月 13 日 |本地日期:2012-01-13