我以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
什么模式会解析这个字符串?
答案 0 :(得分:3)
这应该有效:
new SimpleDateFormat("EEE',' dd MMM yyyy HH:mm:ss z", Locale.US)
小写' z'适用于General time zone
Pacific Standard Time
或PST
或GMT-08:00
答案 1 :(得分:1)
什么模式将解析此字符串?
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
基本上是旧的说法,它表示与UTC的偏移量为零时分-秒-秒。因此,您的输出没有理由比UTC(GMT -08
落后八小时。您可能会感到困惑,因为 java.util.Date::toString
会撒谎,动态地应用JVM的当前默认时区,从而在Date
中造成时区的错觉。永远不要使用这些旧式日期时间类的众多原因之一。
您的输入字符串Tue, 28 Apr 2015 06:17:40 GMT
符合RFC 1123(改编自RFC 822)。这种格式现在已经过时。
现代协议采用ISO 8601标准格式表示日期时间值,以文本表示。
在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