GMT +字符串转换为Date Java

时间:2016-07-04 12:52:25

标签: java datetime gmt

我正在尝试转换字符串格式为" Wed Jun 01 00:00:00 GMT-400 2016"到ISO8601" 2016-06-01T00:00:00.000Z"。我收到错误"无法解析日期"。我不确定我做错了什么。

    DateFormat startDate = new SimpleDateFormat("EEE MMM dd HH:mm:ss 'GMT'Z yyyy", Locale.US);
    startDate.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));

    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'", Locale.US);
    formatter.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));

    Date aParsedDate = null;
    try {
        // give the date in that format
        aParsedDate = (Date) startDate.parse(inputDateAsString);
        System.out.println(aParsedDate.toString());

        // convert Date to ISO8601
        String nowAsISO = formatter.format(aParsedDate);
        System.out.println("ISO date = " + nowAsISO);
        return nowAsISO;

    } catch (ParseException e) {
        e.printStackTrace();
    }

1 个答案:

答案 0 :(得分:2)

java.time

时区偏移的 ISO 8601 标准是用两位数字表示 HOUR。 HOUR 和 MINUTE 的分隔符是可选的。 MINUTE 为零时也是可选的。但是,在您的日期时间字符串中,Wed Jun 01 00:00:00 GMT-400 2016,HOUR 只有一位数。

没有为日期时间字符串的模式定义 OOTB(开箱即用)DateTimeFormatterWed Jun 01 00:00:00 GMT-400 2016 em> 是。幸运的是,java.time,现代日期时间 API 为您提供了一种使用复杂模式定义/构建解析/格式化类型的方法。

演示:

import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtf = new DateTimeFormatterBuilder()
                                .appendPattern("E MMM d H:m:s")
                                .appendLiteral(' ')
                                .appendZoneId()
                                .appendOffset("+Hmm", "")
                                .appendLiteral(' ')
                                .appendPattern("u")
                                .toFormatter(Locale.ENGLISH);
                                
        String strDateTime = "Wed Jun 01 00:00:00 GMT-400 2016";
        
        OffsetDateTime odt = OffsetDateTime.parse(strDateTime, dtf);
        System.out.println(odt);
    }
}

输出:

2016-06-01T00:00-04:00

如您所见,对于时区偏移,我使用了模式 +Hmm(一位代表 HOUR,两位代表 MINUTE)。

Trail: Date Time 了解有关现代日期时间 API 的更多信息。

请注意,旧的日期时间 API(java.util 日期时间类型及其格式类型 SimpleDateFormat)已过时且容易出错。建议完全停止使用,改用java.timemodern date-time API*

出于任何原因,如果您需要将 OffsetDateTime 的这个对象转换为 java.util.Date 的对象,您可以这样做:

Date date = Date.from(odt.toInstant());

* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project