簡體   English   中英

使用SimpleDateFormat解析日期不一致

[英]Inconsistent date parsing using SimpleDateFormat

我真的在這個問題上摸不着頭腦。 我一直在使用SimpleDateFormat並沒有麻煩,但是現在,使用SimpleDateFormat來解析日期(僅有時)只是完全錯誤。

特別:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = sdf.parse("2009-08-19 12:00:00");
System.out.print(date.toString());

打印字符串Wed Aug 19 00:00:00 EDT 2009 有沒有搞錯? - 它甚至不會一直解析錯誤的日期!


更新:這很好地修復了它。 你不知道嗎,在其他一些地方也被誤用了。 得愛調試其他人的代碼:)

我想你想要使用HH格式,而不是'hh',這樣你就可以在00-23之間使用小時。 'hh'以12小時為增量采用格式,因此它假設它在AM中。

所以這

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse("2009-08-19 12:00:00");
System.out.print(date.toString());

應打印出來

2009年8月19日星期三12:00:00 EDT 2009

小時應指定為HH而不是hh。 請查看http://java.sun.com/javase/6/docs/api/java/text/SimpleDateFormat.html中的日期和時間模式部分。

您打印出日期的toString()表示,而不是格式的表示。 您可能還想檢查小時表示。 H和h意味着不同的東西。 H表示24小時制(0-23),h表示12小時制(1-12),(k和K分別表示1-24和0-11的時間)

你需要做一些事情:

//in reality obtain the date from elsewhere, e.g. new Date()
Date date = sdf.parse("2009-08-19 12:00:00"); 

//this format uses 12 hours for time
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//this format uses 24 hours for time
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

System.out.print(sdf.format(date));
System.out.print(sdf2.format(date));

TL;博士

LocalDateTime ldt = LocalDateTime.parse( "2009-08-19 12:00:00".replace( " " , "T" ) );

java.time

其他答案是正確的,但使用舊的日期時間類。 那些麻煩的舊類已經被java.time類所取代。

您的輸入字符串接近標准ISO 8601格式。 通過用T替換中間的SPACE來調整。 然后可以在不指定格式化模式的情況下解析它。 解析/生成字符串時,java.time類在默認情況下使用ISO 8601。

String input = "2009-08-19 12:00:00".replace( " " , "T" );

輸入數據沒有關於UTC或時區偏移的信息。 所以我們解析為LocalDateTime

LocalDateTime ldt = LocalDateTime.parse( input );

如果在上下文中您知道預期的偏移量,請應用它。 也許它是用於UTC (零偏移),我們可以使用常量ZoneOffset.UTC

OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC );

或許您知道它是針對特定時區的。 時區是偏移量加上一組用於處理諸如夏令時(DST)等異常的規則。

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

關於java.time

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

現在處於維護模式Joda-Time項目建議遷移到java.time。

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

大部分的java.time功能后移植到Java 6和7 ThreeTen,反向移植 ,並進一步適應的AndroidThreeTenABP (見如何使用...... )。

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目是未來可能添加到java.time的試驗場。

暫無
暫無

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

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