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

63
我有一个日期的字符串表示,需要创建一个 DateCalendar 对象。我查看了 DateCalendar 的API文档,但是没有找到其他方法,只能自己编写解析方法。我知道一定有其他方法,有人知道解决方案吗?

2
请注意,旧的日期时间类(例如java.util.Datejava.util.Calendarjava.text.SimpleTextFormat)现在已经成为遗留系统,被Java.time类所取代。请参阅Oracle的教程 - Basil Bourque
5个回答

126

简而言之:

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

查看更多信息,请参阅SimpleDateFormat javadoc

要将其转换为Calendar,请执行以下操作:

Calendar calendar = Calendar.getInstance();
calendar.setTime(date);

1
如果原始字符串可以是 MM/dd/yy 或 yy/MM/dd 呢? - Cris
Cristina,我也遇到了同样的问题。我不知道服务器发送的是什么格式。现在,@Matt Sheppard,你有什么建议吗? - Zar E Ahmer

15

简而言之

LocalDate.parse( "2015-01-02" )

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" );

格式化程序

如果您有不同的格式,请从java.time.format包中指定格式化程序。您可以指定自己的格式化模式,或者让java.time根据Locale指定翻译人类语言和文化习惯以决定问题(例如周期与逗号)。

格式化模式

详见DateTimeFormatter类文档,其中列出了格式模式中使用的代码。它们与过时的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 );

输出到控制台。

System.out.println ( "localDate: " + 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 );

输入:January 2, 2015 | 当地日期:2015-01-02


非常好的概述!这个答案应该被接受。 - Twonky

9

非常受推崇的Joda Time库也值得一看。这是Java 7中新日期和时间API的基础。设计精巧、直观,文档齐全,避免了原始的java.util.Date / java.util.Calendar类的许多笨拙之处。

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


2
虽然Joda-Time作为第一个好的日期时间库非常成功,但Joda-Time团队现在建议迁移到java.time框架。 - Basil Bourque

0

试试这个:

DateFormat.parse(String)

0

DateFormat类有一个parse方法。

更多信息请参见DateFormat


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接