[英]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));
LocalDateTime ldt = LocalDateTime.parse( "2009-08-19 12:00:00".replace( " " , "T" ) );
其他答案是正確的,但使用舊的日期時間類。 那些麻煩的舊類已經被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 8及更高版本中。 這些類取代了舊的麻煩的日期時間類,如java.util.Date
, .Calendar
和java.text.SimpleDateFormat
。
現在處於維護模式的Joda-Time項目建議遷移到java.time。
要了解更多信息,請參閱Oracle教程 。 並搜索Stack Overflow以獲取許多示例和解釋。
大部分的java.time功能后移植到Java 6和7 ThreeTen,反向移植 ,並進一步適應的Android在ThreeTenABP (見如何使用...... )。
ThreeTen-Extra項目使用其他類擴展了java.time。 該項目是未來可能添加到java.time的試驗場。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.