将日期字符串解析为某些 Java 对象

2022-09-01 04:56:10

我正在一个读取文件和处理数据的项目工作。在那里,我必须使用日期,例如:

  1. 2012-01-10 23:13:26
  2. 一月 13, 2012

我发现了包Joda,有点有趣的包,但不知道它是否是最简单的。

我能够将第一个示例解析为DateTime对象(Joda)reg-ex和String操作。(例如:将空格替换为“-”并将其传递给构造函数。

new DateTime("2012-01-10 23:13:26".replace(' ', '-'))

我想它有效,但问题在于第二种格式。如何使用这样的输入来提取对象,最好是Joda对象。我当然可以编写一个函数来将格式更改为Joda支持的格式,但我想知道是否有其他方法(甚至是一些本机Java库)来做到这一点。

如果有什么比Joda更好的东西,也请告诉我。

谢谢。


答案 1

使用Joda-Time,看看DateTimeFormat;它允许解析您提到的两种日期字符串(以及几乎任何其他任意格式)。如果您的需求更加复杂,请尝试DateTimeFormatterBuilder

解析 #1:

DateTimeFormatter f = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
DateTime dateTime = f.parseDateTime("2012-01-10 23:13:26");

编辑:实际上LocalDateTime对于没有时区的日期时间来说是一种更合适的类型:

LocalDateTime dateTime = f.parseLocalDateTime("2012-01-10 23:13:26");

对于#2:

DateTimeFormatter f = DateTimeFormat.forPattern("MMMM dd, yyyy");
LocalDate localDate = f.parseLocalDate("January 13, 2012");

是的,就Java日期和时间处理而言,Joda-Time绝对是要走的路。:)

正如大多数人都会同意的那样,Joda是一个非常用户友好的库。例如,我以前从未使用Joda进行过这种解析,但是我只花了几分钟时间从API中找出并编写它。

更新 (2015)

如果您使用的是Java 8,在大多数情况下,您应该简单地使用java.time而不是Joda-Time。它包含了Joda几乎所有的好东西 - 或者它们的等价物。对于那些已经熟悉Joda API的人来说,Stephen Colebourne的Joda-Time to java.time迁移指南派上了用场。

以下是上述示例的 java.time 版本。

解析 #1:

DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.from(f.parse("2012-01-10 23:13:26"));

你不能把它解析为ZonedDateTime或OffsetDateTime(它们是Joda的DateTime的对应物,在我的原始答案中使用),但这有点有意义,因为解析的字符串中没有时区信息。

解析 #2:

DateTimeFormatter f = DateTimeFormatter.ofPattern("MMMM dd, yyyy");
LocalDate localDate = LocalDate.from(f.parse("January 13, 2012"));

在这里,LocalDate是最合适的解析类型(就像Joda-Time一样)。


答案 2

SimpleDateFormat 会将日期解析为 Java Date 对象:

http://docs.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html

SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); // first example
SimpleDateFormat format2 = new SimpleDateFormat("MMMMM dd,yyyy"); // second example

Date d1 = format1.parse( dateStr1 );
Date d2 = format2.parse( dateStr2 );