使用什么 SimpleDateFormat 模式?

What SimpleDateFormat Pattern to use?

我从 API 收到一个字符串形式的日期,格式如下:".expires": "Tue, 28 Apr 2015 06:17:40 GMT"

现在我试图将它传递给 java 中的 Date 变量:

public static Date getExpireDate(String date) {
        if (date != null || (date.length() == 0)) {
            //Date is not null or empty so continue
            try {
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date dateNew = sdf.parse(date);
                return dateNew;
            }catch(Exception e){}
        }
        // return default timeout           
    }

现在我找到了以下documentation:

它有一个类似的例子,它呈现的模式如下: EEE, d MMM yyyy HH:mm:ss Z

但是我的时区只显示 GMT。不是 GMT -08

什么模式将解析这个字符串?

这应该有效:

new SimpleDateFormat("EEE',' dd MMM yyyy HH:mm:ss z", Locale.US)

小写 'z' 代表 General time zonePacific Standard TimePSTGMT-08:00

tl;博士

What pattern will parse this string?

DateTimeFormatter.RFC_1123_DATE_TIME

I am receiving a date as a String from an API in the following format: ".expires": "Tue, 28 Apr 2015 06:17:40 GMT"

仅使用 java.time classes.

ZonedDateTime
.parse(
    "Tue, 28 Apr 2015 06:17:40 GMT" ,
    DateTimeFormatter.RFC_1123_DATE_TIME
)
.toString()

2015-04-28T06:17:40Z

你可以看到同一时刻被调整到一个时区。

ZonedDateTime
.parse(
    "Tue, 28 Apr 2015 06:17:40 GMT" ,
    DateTimeFormatter.RFC_1123_DATE_TIME
)
.withZoneSameInstant(
    ZoneId.of( "America/Anchorage" ) 
)
.toString()

看到这个code run live at IdeOne.com

2015-04-27T22:17:40-08:00[America/Anchorage]

GMT -08?

不太清楚你的意思。

GMT 基本上是说零小时-分钟-秒的UTC偏移量的旧方法。因此,您的输出没有理由比 UTC (GMT -08) 晚八小时。您可能会混淆 java.util.Date::toString 撒谎 ,动态应用 JVM 当前默认时区,从而在 Date 中创建时区的错觉.从不使用这些遗留日期时间的众多原因之一 classes.

RFC 1123/RFC 822

您输入的字符串 Tue, 28 Apr 2015 06:17:40 GMT 符合 RFC 1123 (adapted from RFC 822)。这种格式现在已经过时了。

ISO 8601

现代协议采用 ISO 8601 标准格式来表示以文本表示的日期时间值。

java.time

虽然 java.time classes 内置于 Java 中,当 parsing/generating 字符串时默认使用 ISO 8601 格式, DateTimeFormatter class 带有此旧格式的预定义格式化程序:DateTimeFormatter.RFC_1123_DATE_TIME.

String input = "Tue, 28 Apr 2015 06:17:40 GMT" ;
DateTimeFormatter f = DateTimeFormatter.RFC_1123_DATE_TIME ;
ZonedDateTime zdt = ZonedDateTime.parse( input , f ) ; 

看到这个code run live at IdeOne.com

zdt.toString(): 2015-04-28T06:17:40Z