什么SimpleDateFormat模式使用?

时间:2015-04-28 06:21:45

标签: java date simpledateformat

我以API格式从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:

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

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

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

2 个答案:

答案 0 :(得分:3)

这应该有效:

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

小写' z'适用于General time zone Pacific Standard TimePSTGMT-08:00

答案 1 :(得分:1)

tl; dr

  

什么模式将解析此字符串?

DateTimeFormatter.RFC_1123_DATE_TIME

  

我从API接收的日期是字符串,格式如下:“。expires”:“星期二,2015年4月28日06:17:40 GMT”

仅使用 java.time 类。

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 [美国/安克雷奇]

GMT -08?

不确定您的意思。

GMT基本上是旧的说法,它表示与UTC的偏移量为零时分-秒-秒。因此,您的输出没有理由比UTC(GMT -08落后八小时。您可能会感到困惑,因为 java.util.Date::toString会撒谎,动态地应用JVM的当前默认时区,从而在Date中造成时区的错觉。永远不要使用这些旧式日期时间类的众多原因之一。

RFC 1123 / RFC 822

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

ISO 8601

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

java.time

在Java中内置的 java.time 类在解析/生成字符串时默认使用ISO 8601格式,而DateTimeFormatter类则为该传统格式预定义了格式化程序: 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