将datestringparsing为某个Java对象
我在一个读取文件和处理数据的项目中工作。 在那里我需要用date工作,例如:
- 2012-01-10 23:13:26
- 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
, .Calendar
和java.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
我们可以用T
replace中间的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