将datestringparsing为某个Java对象

我在一个读取文件和处理数据的项目中工作。 在那里我需要用date工作,例如:

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

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

我能够parsing第一个例子到DateTime对象(Joda)reg-ex和string操作。 (例如:用“ – ”replace空格并将其传递给构造函数。

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

我猜想它的工作,但问题是与第二种格式。 我怎样才能使用这样的input来提取一个对象,最好是乔达对象。 我当然可以编写一个函数来改变Joda支持的格式,但是想知道是否会有其他方法(甚至是一些本地的Java库)来执行它。

如果还有比乔达更好的东西,请让我知道。

谢谢。

使用Joda-Time,看看DateTimeFormat ; 它允许parsing你提到的两种datestring(以及几乎任何其他任意格式)。 如果您的需求更复杂,请尝试使用DateTimeFormatterBuilder 。

parsing#1:

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

编辑:实际上LocalDateTime是一个更适合的date时间types没有时区:

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

是的,就Javadate和时间处理而言,Joda-Time绝对是一种可行的方法。 🙂

由于大多数人都会同意,乔达是一个非常方便用户的图书馆。 例如,我之前从来没有对Joda进行过这种parsing,但是花了我几分钟的时间才从API中parsing出来并写下来。

更新(2015)

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

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

parsing#1:

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

你不能把它parsing成ZonedDateTime或OffsetDateTime(这是我原来的答案中使用的Joda的DateTime的对应物),但这样做有道理,因为parsing的string中没有时区信息。

parsing#2:

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

这里的LocalDate是最适合parsing的types(就像Joda-Time一样)。

SimpleDateFormat将parsingdate到Javadate对象:

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

我想可以想像乔达有一个格式化的东西为你做这个。 我发现这与谷歌快速search: 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>"); 

用于评估模式的语法可以在X-Zero的链接中find 。

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

为了从string获取JodaTimedate,您将要查看DateTimeFormat类。

最简单的就是按照你期望的格式正确设置SimpleDateFormat,并使用它的分析方法为你提供一个Date对象

TL;博士

 LocalDateTime ldt = LocalDateTime.parse( "2012-01-10 23:13:26".replace( " " , "T" ) ); 

…和…

 LocalDate localDate = LocalDate.parse ( "January 13, 2012" , DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG ).withLocale ( Locale.US ) ); 

细节

Jonik的答案基本上是正确的,但忽略了一些重要的问题。

java.time

如果还有比乔达更好的东西,请让我知道。

是的,有更好的东西, java.time框架。 Joda-Time团队build议将移植到java.time作为其后继者。

java.time框架内置于Java 8及更高版本中。 这些类取代了旧的麻烦date时间类,如java.util.Date.Calendarjava.text.SimpleDateFormat

要了解更多信息,请参阅Oracle教程 。 并search堆栈溢出了很多例子和解释。

大部分的java.timefunction在ThreeTen- Backport中被移植到Java 6&7中,并在ThreeTenABP中进一步适应Android。

约会时间

你的第一个input是一个date加上一个时间。 它没有任何UTC或时区信息的偏移量 ,所以我们将其parsing为LocalDateTime对象。 “本地…”是指任何地方,没有特定的地方。 所以这不是时间线上的实际时刻,而是关于时刻的粗略想法。

parsinginput的string2012-01-10 23:13:26我们可以用Treplace中间的SPACE,以符合ISO 8601标准格式的date – 时间值的规范样式。

在parsing和生成date时间值的文本表示时,java.time类默认使用ISO 8601格式。 所以不需要定义parsing模式。

 String input = "2012-01-10 23:13:26".replace( " " , "T" ); LocalDateTime ldt = LocalDateTime.parse( input ); 

如果从该值的上下文知道预期的时区,则应用它来定义时间轴上的实际时刻。

 ZoneId zoneId = ZoneId.of( "America/Montreal" ); ZonedDateTime zdt = ldt.atZone( zoneId ); 

转储到控制台。

 System.out.println ( "input: " + input + " | zdt: " + zdt ); 

input:2012-01-10T23:13:26 | zdt:2012-01-10T23:13:26-05:00 [美国/蒙特利尔]

date,只

您的第二个input是没有时间和没有时区的仅限date的值。 为此,我们需要LocalDate类。

我承认这种投入的格式符合美国的语言(英文)和文化规范。 所以不需要明确指定一个格式化模式。 我们可以简单地通过指定Locale来请求一个知道美国格式的格式化程序。 我们指定FormatStyle.LONG适当的格式的长度。

 String input = "January 13, 2012"; DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG ).withLocale ( Locale.US ); LocalDate localDate = LocalDate.parse ( input , formatter ); 

转储到控制台。

 System.out.println ( "input: " + input + " | localDate: " + localDate ); 

input:2012年1月13日| localDate:2012-01-13