将GMT+字符串转换为日期Java



我正在尝试将"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();
    }

java.time

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

日期-时间字符串Wed Jun 01 00:00:00 GMT-400 2016所在的模式没有定义OOTB(现成的)DateTimeFormatter。幸运的是,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.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+可用的API,通过desugaring和如何在Android项目中使用ThreeTenABP。

相关内容

  • 没有找到相关文章

最新更新