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

Ziy*_*een 33 java datetime jodatime date-parsing

我正在一个读取文件和处理数据的项目中工作.我在那里工作日期例如:

  1. 2012-01-10 23:13:26
  2. 2012年1月13日

我找到了包Joda,有点有趣的包但不知道它是否是最容易的.

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

new DateTime("2012-01-10 23:13:26".replace(' ', '-'))
Run Code Online (Sandbox Code Playgroud)

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

如果有比Joda更好的东西,请告诉我.

谢谢.

Jon*_*nik 39

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

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

LocalDateTime dateTime = f.parseLocalDateTime("2012-01-10 23:13:26");
Run Code Online (Sandbox Code Playgroud)

对于#2:

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

是的,就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"));
Run Code Online (Sandbox Code Playgroud)

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

解析#2:

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

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

  • 对于使用非英语语言环境但解析美国日期的用户,`format = format.withLocale(Locale.US); `否则解析`January`会失败.//乔达 - 新手 (3认同)
  • 正确答案,但缺少两件事。[a] **语言环境**,如第一条评论中所述。[b] **时区。** 如果省略,JVM 的当前默认时区将分配给 DateTime 对象。最好明确说明该数据源预期的时区。在格式化程序对象上调用 `withZone`,传递 `DateTimeZone.UTC` 或 `DateTimeZone.forID( "Europe/Helsinki")` 的结果。 (2认同)

chu*_*ubs 23

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


nic*_*ild 7

我想像Joda有一些Formatter为你做这件事.我通过快速谷歌搜索找到了这个:http: //johannburkard.de/blog/programming/java/date-time-parsing-formatting-joda-time.html

DateTimeFormatter parser1 =
    DateTimeFormat.forPattern("dd/MMM/yyyy:HH:mm:ss Z");

DateTimeFormatter parser2 =
    DateTimeFormat.forPattern("yyyy-MM-dd HH:mm");

DateTime time = parser1.parseDateTime("<data>");
Run Code Online (Sandbox Code Playgroud)

可以在X-Zero的链接中找到用于评估模式的语法.


Clo*_*use 5

JodaTime在很大程度上被认为是Java中日期时间处理的事实上的标准-他们正在努力将其添加到Java库的下一个版本中(有效)。

为了从字符串获取JodaTime日期,您将需要研究DateTimeFormat类。