簡體   English   中英

將日期字符串解析為某些Java對象

[英]Parse Date String to Some Java Object

我正在一個讀取文件和處理數據的項目中工作。 我在那里工作日期例如:

  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(' ', '-'))

我猜它有用,但問題在於第二種格式。 如何使用這樣的輸入來提取對象,最好是Joda對象。 我確定可以編寫一個函數來將格式更改為Joda支持的格式,但是想知道是否會有其他方式(甚至是一些本機Java庫)來完成它。

如果有比Joda更好的東西,請告訴我。

謝謝。

使用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一樣)。

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

我想像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>");

可以在X-Zero的鏈接中找到用於評估模式的語法。

JodaTime在很大程度上被認為是Java中日期時間處理的事實上的標准 - 他們正在努力將它添加到下一版本的Java庫中(好吧,有效)。

為了從字符串中獲取JodaTime日期,您將要查看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

如果有比Joda更好的東西,請告訴我。

是的,有一些更好的東西, java.time框架。 Joda-Time團隊建議遷移到java.time作為其后繼者。

java.time框架內置於Java 8及更高版本中。 這些類取代了舊的麻煩的日期時間類,如java.util.Date.Calendarjava.text.SimpleDateFormat

要了解更多信息,請參閱Oracle教程 並搜索Stack Overflow以獲取許多示例和解釋。

大部分java.time功能都在ThreeTen- Backport中反向移植到Java 6和7,並進一步適用於ThreeTenABP中的 Android。

約會時間

您的第一個輸入是日期加上一個時間。 它沒有任何來自UTC時區信息的偏移 ,因此我們將其解析為LocalDateTime對象。 “本地......”表示任何地點,沒有特定地點。 所以它不是時間軸上的實際時刻,而是一個關於片刻的粗略想法。

要解析輸入字符串2012-01-10 23:13:26我們可以用T替換中間的SPACE,以符合ISO 8601標准格式的日期時間值的規范樣式。

在解析和生成日期時間值的文本表示時,java.time類默認使用ISO 8601格式。 因此無需定義解析模式。

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

輸入:2012-01-10T23:13:26 | zdt:2012-01-10T23:13:26-05:00 [美國/蒙特利爾]

日期,只

您輸入的第二個是僅限日期的值,沒有時間和沒有時區。 為此,我們需要LocalDate類。

我認為該輸入的格式符合美國的語言(英語)和文化規范。 因此無需明確指定格式化模式。 我們可以通過指定Locale來簡單地詢問一個知道US格式的格式化程序。 我們根據此格式的長度指定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 );

輸入:2012年1月13日| localDate:2012-01-13

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM