簡體   English   中英

java中的SimpleDateFormat(“ yyyy-MM-dd'T'HH:mm:ssZ”)解析給出錯誤的日期?

[英]SimpleDateFormat(“yyyy-MM-dd'T'HH:mm:ssZ”) parse in java gives wrong date?

我使用了此SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ") 。因此,當我通過日期2016-01-01T10:30:00-0800大於或等於10:30:00-0800時間,然后它將解析(日期)響應,這是預期的第二天日期2016-01-02T00:00:00 + 0530。它將日期更改一天。如果我給出2016-01-01T10:20:00- 0800然后給出確切的日期。因此,如果時間應該少於t10:30:00-0800,則獲得預期結果,否則第二天為日期。

完整代碼:

SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
public Date deserialize(JsonParser jsonparser, DeserializationContext arg1)   {
  String date = jsonparser.getText();
  dt.parse(date);
}

重要的是要了解類java.util.Date的實例不是日歷日期,而是時刻。

java.util.Date與字符串表示形式進行轉換始終會涉及時區。

您的輸入是2016-01-01T10:30:00-0800 ,指示區域偏移為-8小時(這是美國洛杉磯的時區)。 該時間點對應於偏移量為0小時(例如倫敦,GB)的區域中的2016-01-01T18:30:00+0000或對應於您所在時區的2016-01-02T00:00:00+0530

如果您想存儲洛杉磯會議開始的時間並在不同時區顯示該時間,那就很好。

如果要表示沒有固有時間信息的日期(例如生日),則最好使用java.time.LocalDate (如果使用的是Java 8)或org.joda.time.LocalDate (如果沒有Java 8的選項) 。

java.time

您使用的是過時的過時的日期時間類,事實證明它們的設計不正確,令人困惑且麻煩。 使用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-反向移植並且還適於在到Android ThreeTenABP

ISO 8601

您的輸入字符串符合ISO 8601標准。 這些標准格式默認在java.time類中使用。 因此,無需指定格式化模式。

偏移量

您的輸入值有一個UTC偏移量,比UTC落后8小時。

OffsetDateTime類表示此類值。

OffsetDateTime odt = OffsetDateTime.parse( "2016-01-01T10:30:00-0800" );

時區

時區是從UTC偏移的時間, 再加上一組用於處理異常的規則,例如夏令時(DST)。 如果您確定時區將用作此值的上下文,請應用它以獲取ZonedDateTime

通過正確的時區名稱continent/region格式指定時區( ZoneId )。 切勿使用ESTIST等3-4個字母的縮寫,因為它們不是真實的時區,不是標准化的,甚至也不是唯一的(!)。

ZoneId zoneId = ZoneId.of( "America/Los_Angeles" );
ZonedDateTime zdt = odt.atZone( zoneId );

變更時區

如果要通過印度當地時間查看此值,則可以應用其他時區來創建新的ZonedDateTime java.time類使用不可變對象模式。 因此請注意,java.time類不是更改(“突變”)現有對象上的時區設置,而是根據原始對象的成員創建一個帶有其某些成員的新對象。

ZonedDateTime zdt_Kolkata = zdt.withZoneSameInstant( ZoneId.of( "Asia/Kolkata" ) ) ;

暫無
暫無

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

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