2014-09-19 118 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"));