如何将日期字符串转换为日期或日历对象?

Aar*_*ron 63 java calendar date

我有一个String日期的表示,我需要从中创建一个Date或一个Calendar对象.我已经通过看DateCalendarAPI,但没有发现任何可以比创建我自己的丑陋的解析方法做其他.我知道必须有办法,有没有人知道解决方案?

Mat*_*ard 126

简单来说:

DateFormat formatter = new SimpleDateFormat("MM/dd/yy");
try {
  Date date = formatter.parse("01/29/02");
} catch (ParseException e) {
  e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅SimpleDateFormatjavadoc.

把它变成a Calendar,做:

Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 14

TL;博士

LocalDate.parse( "2015-01-02" )
Run Code Online (Sandbox Code Playgroud)

java.time

Java 8及更高版本有一个新的java.time框架,使这些其他答案过时了.该框架的灵感来自Joda-Time,由JSR 310定义,并由ThreeTen-Extra项目扩展.请参阅教程.

旧的捆绑类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" );
Run Code Online (Sandbox Code Playgroud)

格式化

如果您使用不同的格式,请从java.time.format包中指定格式化程序.您可以指定自己的格式模式,也可以让java.time自动本地化,以Locale指定用于翻译的人类语言和用于决定句点与逗号等问题的文化规范.

格式化模式

DateTimeFormatter有关格式模式中使用的代码的详细信息,请阅读类doc.它们与旧的过时java.text.SimpleDateFormat类模式略有不同.

请注意该parse方法的第二个参数是如何添加到Java 8及更高版本的方法引用.

String input = "January 2, 2015";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "MMMM d, yyyy" , Locale.US );
LocalDate localDate = LocalDate.parse ( input , formatter );
Run Code Online (Sandbox Code Playgroud)

转储到控制台.

System.out.println ( "localDate: " + localDate );
Run Code Online (Sandbox Code Playgroud)

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 );
Run Code Online (Sandbox Code Playgroud)

转储到控制台.

System.out.println ( "input: " + input + " | localDate: " + localDate );
Run Code Online (Sandbox Code Playgroud)

输入:2015年1月2日| localDate:2015-01-02


ser*_*g10 9

备受推崇的乔达时间图书馆也值得一看.这是Java 7中新的日期和时间api的基础.该设计简洁,直观,文档齐全,避免了原始java.util.Date/ java.util.Calendar类的大量笨拙.

Joda DateFormatter可以将字符串解析为Joda DateTime.

  • 虽然 Joda-Time 作为第一个好的日期时间库非常成功,但 Joda-Time 团队现在建议迁移到 [java.time](http://docs.oracle.com/javase/8/docs/api/ java/time/package-summary.html) 框架。 (2认同)