tl;博士
LocalDate.parse( "2015-01-02" )
java.time
Java 8 及更高版本有一个新的java.time 框架,它使这些其他答案过时了。该框架受到Joda-Time 的启发,由JSR 310 定义,并由ThreeTen-Extra 项目扩展。请参阅Tutorial。
旧的捆绑类 java.util.Date/.Calendar 是出了名的麻烦和混乱。避开他们。
LocalDate
与 Joda-Time 一样,java.time 有一个类 LocalDate 来表示没有时间和时区的仅日期值。
ISO 8601
如果您的输入字符串是标准的ISO 8601 格式yyyy-MM-dd,您可以要求该类直接解析字符串,而无需指定格式化程序。
java.time 中默认使用 ISO 8601 格式,用于解析和生成日期时间值的字符串表示形式。
LocalDate localDate = LocalDate.parse( "2015-01-02" );
格式化程序
如果您有不同的格式,请从java.time.format 包中指定一个格式化程序。您可以指定自己的格式模式,也可以让 java.time 根据需要自动本地化为 Locale,指定用于翻译的人类语言和用于决定句点与逗号等问题的文化规范。
格式化模式
阅读DateTimeFormatter 类文档,了解格式模式中使用的代码的详细信息。它们与旧的过时 java.text.SimpleDateFormat 类模式略有不同。
注意 parse 方法的第二个参数是 method reference,语法添加到 Java 8 及更高版本。
String input = "January 2, 2015";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "MMMM d, yyyy" , Locale.US );
LocalDate localDate = LocalDate.parse ( input , formatter );
转储到控制台。
System.out.println ( "localDate: " + localDate );
本地日期:2015-01-02
自动本地化
或者,与其指定格式模式,不如让 java.time 为您本地化。调用 DateTimeFormatter.ofLocalizedDate,并确保指定所需/预期的 Locale,而不是依赖 JVM 的当前默认值,该默认值可以在运行时随时更改(!)。
String input = "January 2, 2015";
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG );
formatter = formatter.withLocale ( Locale.US );
LocalDate localDate = LocalDate.parse ( input , formatter );
转储到控制台。
System.out.println ( "input: " + input + " | localDate: " + localDate );
输入:2015 年 1 月 2 日 |本地日期:2015-01-02