![](/img/trans.png)
[英]Change date from MM/dd to yyyy-MM-dd'T'HH:mm:ss.SSZ in Java
[英]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 8及更高版本中。 這些類取代了麻煩的舊日期時間類,例如java.util.Date
, .Calendar
和java.text.SimpleDateFormat
。 Joda-Time小組還建議遷移到java.time。
要了解更多信息,請參見Oracle教程 。 並在Stack Overflow中搜索許多示例和說明。
多的java.time功能后移植到Java 6和7在ThreeTen-反向移植並且還適於在到Android ThreeTenABP 。
您的輸入字符串符合ISO 8601標准。 這些標准格式默認在java.time類中使用。 因此,無需指定格式化模式。
您的輸入值有一個UTC偏移量,比UTC落后8小時。
OffsetDateTime
類表示此類值。
OffsetDateTime odt = OffsetDateTime.parse( "2016-01-01T10:30:00-0800" );
時區是從UTC偏移的時間, 再加上一組用於處理異常的規則,例如夏令時(DST)。 如果您確定時區將用作此值的上下文,請應用它以獲取ZonedDateTime
。
通過正確的時區名稱以continent/region
格式指定時區( ZoneId
)。 切勿使用EST
或IST
等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.