tl;博士
LocalDateTime ldt = LocalDateTime.parse( "2012-01-10 23:13:26".replace( " " , "T" ) );
……和……</p>
LocalDate localDate = LocalDate.parse ( "January 13, 2012" , DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG ).withLocale ( Locale.US ) );
细节
Jonik的回答基本上是正确的,但遗漏了一些重要问题。
java.time
如果有什么比 Joda 更好的东西,也请告诉我。
是的,有更好的东西,java.time框架。Joda-Time 团队建议迁移到 java.time 作为其继任者。
java.time框架内置于 Java 8 及更高版本中。这些类取代了旧的麻烦的日期时间类,例如java.util.Date
, .Calendar
, & java.text.SimpleDateFormat
。
要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。
许多 java.time 功能在 ThreeTen-Backport 中向后移植到 Java 6 和 7,并在ThreeTenABP中进一步适应 Android 。
约会时间
您的第一个输入是日期加上一天中的时间。它缺少任何与 UTC 的偏移量或时区信息,因此我们将其解析为LocalDateTime
对象。“本地……”是指任何地方,没有特定的地方。所以这不是时间线上的实际时刻,而只是一个关于时刻的粗略概念。
为了解析输入字符串2012-01-10 23:13:26
,我们可以将中间的空格替换为 aT
以符合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