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

Posted

技术标签:

【中文标题】如何将日期字符串转换为日期或日历对象?【英文标题】:How to convert a date String to a Date or Calendar object? 【发布时间】:2010-09-07 19:29:58 【问题描述】:

我有一个日期的String 表示,我需要从中创建一个DateCalendar 对象。我查看了DateCalendar API,但除了创建自己的丑陋解析方法之外,没有发现任何可以做到这一点的方法。我知道一定有办法,有人知道解决办法吗?

【问题讨论】:

仅供参考,麻烦的旧日期时间类,如 java.util.Datejava.util.Calendarjava.text.SimpleTextFormat 现在是 legacy,被 java.time 类取代。见Tutorial by Oracle。 【参考方案1】:

简而言之:

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

【讨论】:

如果原始字符串可以是 MM/dd/yy 或 yy/MM/dd 怎么办? 克里斯蒂娜我也面临同样的问题。我不知道服务器发送什么格式。现在@Matt Sheppard 你对此有什么建议吗?【参考方案2】:

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

【讨论】:

优秀的概述!这个答案应该被接受。【参考方案3】:

备受推崇的Joda Time library也值得一看。这是为 Java 7 编写的新 date and time api 的基础。设计简洁、直观、well documented 并避免了许多原始 java.util.Date / java.util.Calendar 类的笨拙。

Joda 的 DateFormatter 可以将 String 解析为 Joda DateTime

【讨论】:

虽然 Joda-Time 作为第一个优秀的日期时间库取得了巨大成功,但 Joda-Time 团队现在建议迁移到 java.time 框架。【参考方案4】:

试试这个:

DateFormat.parse(String)

【讨论】:

【参考方案5】:

DateFormat 类有一个parse 方法。

更多信息请参见DateFormat。

【讨论】:

以上是关于如何将日期字符串转换为日期或日历对象?的主要内容,如果未能解决你的问题,请参考以下文章

使用php从字符串中显示日历上的日期

将日期对象转换为日历对象 [重复]

如何将日期字符串转换为没有时区的日期对象

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

Java日期类题目

如何将 Java 日期字符串/对象转换为 JFreeChart 日期格式?