2014-09-19 54 views
5

我想序列化/反序列化日期從/到一個JavaScript應用程序。分析ISO8601日期字符串與UTC時區datetime

服務器端,我用java,JodaTime就裝上了。 我發現如何使用UTC時區序列化爲ISO,但無法找到如何執行反向操作。

這裏是我的代碼

public static String getIsoDate(Date date) 
{ 
    SimpleDateFormat dateToIsoDateString = new SimpleDateFormat(ISO_8601_DATE_FORMAT); 
    TimeZone tz = TimeZone.getTimeZone("UTC"); 
    dateToIsoDateString.setTimeZone(tz); 
    return dateToIsoDateString.format(date); 
} 

// this will return a date with GMT timezone 
public static Date getDateFromIsoDateString(String iso8601date) 
{ 
    DateTimeFormatter jodaParser = ISODateTimeFormat.dateTimeNoMillis(); 
    return jodaParser.parseDateTime(iso8601date).toDate(); 
} 

我不介意使用或不喬達,只是需要一個快速和工作液,

感謝

+0

[轉換符合ISO 8601字符串到java.util.Date(可能重複http://stackoverflow.com/questions/2201925/轉換-iso-8601-compliant-string-to-java-util-date) – 2014-09-19 17:07:03

+0

你的問題不清楚。您應該提供輸入樣本和期望的輸出。 – 2014-09-19 17:31:19

回答

14

如果您使用的是Java 7或更早版本,則可以參考此post

如果您使用的是Java 8,你可以這樣做:

DateTimeFormatter timeFormatter = DateTimeFormatter.ISO_DATE_TIME; 
    TemporalAccessor accessor = timeFormatter.parse("2015-10-27T16:22:27.605-07:00"); 

    Date date = Date.from(Instant.from(accessor)); 
    System.out.println(date); 
+0

謝謝! Java 8解決方案始終是首選。 – anon58192932 2017-08-30 16:55:47

3

你的問題不明確和具體。也許這些小例子會有所幫助。將舊的java.util.Date和.Calendar類與Joda-Time混合可能會讓你感到困惑。喬達時間完全取代這些類而不是增補。

對於字符串,Joda-Time默認爲ISO 8601,它們都是解析和生成的。 Joda-Time內置了用於ISO 8601的默認解析器,因此只需將您的兼容字符串傳遞給構造函數或靜態parse方法即可。

java.util.Date date = new DateTime("2010-01-01T12:00:00+01:00Z").toDate(); 

儘可能避免java.util.Date和.Calendar,並堅持使用喬達時間和它的類,如DateTime。僅在其他類需要的地方使用.Date。

DateTime dateTimeUtc = new DateTime(someJavaDotUtilDotDate, DateTimeZone.UTC); // Joda-Time can convert from java.util.Date type which has no time zone. 
String output = dateTime.toString(); // Defaults to ISO 8601 format. 
DateTime dateTimeUtc2 = new DateTime(output, DateTimeZone.UTC); // Joda-Time can parse ISO 8601 strings. 

對於演示文稿,請根據用戶期望的時區進行調整。

DateTime dateTimeMontréal = dateTimeUtc.withZone(DateTimeZone.forID("America/Montreal")); 
相關問題