使用什么 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 zone
即 Pacific Standard Time
或 PST
或 GMT-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
我从 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 zone
即 Pacific Standard Time
或 PST
或 GMT-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