Java 使用什么SimpleDataFormat模式?

Java 使用什么SimpleDataFormat模式?,java,date,simpledateformat,Java,Date,Simpledateformat,我从API收到一个字符串形式的日期,格式如下:“.expires”:“2015年4月28日星期二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

我从API收到一个字符串形式的日期,格式如下:
“.expires”:“2015年4月28日星期二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           
    }
现在我发现了以下几点

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

然而,我的时区显示的是格林尼治标准时间。非
GMT-08

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

这应该可以:

new SimpleDateFormat("EEE',' dd MMM yyyy HH:mm:ss z", Locale.US)
小写字母“z”表示
一般时区,即
太平洋标准时间
太平洋标准时间
GMT-08:00

tl;博士 什么模式将解析此字符串

我从API收到一个字符串形式的日期,格式如下:“.expires”:“2015年4月28日星期二06:17:40 GMT”

仅使用java.time类

2015-04-28 06:17:40Z

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

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

2015-04-27T22:17:40-08:00[美国/安克雷奇]

GMT-08? 不知道你的意思

GMT
基本上是表示与UTC的偏移量为0小时分秒的老方法。因此,您的输出没有理由比UTC晚八小时(
GMT-08
)。您可能会对以下事实感到困惑:
java.util.Date::toString
撒谎,动态应用JVM的当前默认时区,从而在
日期中创建时区幻觉。从不使用这些遗留日期时间类的原因之一

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

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

java.time 虽然java中内置的java.time类在解析/生成字符串时默认使用ISO 8601格式,但
DateTimeFormatter
类为这种旧格式提供了预定义的格式化程序:

看这个

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


EEE,dd-MMM-yyyy-HH:mm:ss z
对我来说似乎效果不错me@MadProgrammer
hh
将在0-12小时内完成,所以我怀疑它是否会work@eis就OP提供的价值而言,它运行正常;)哦,小的
z
不是大的
z
@BasilBourque我知道。但是看看答案的日期。那是一个Java8非常新的时代。是的,我看到了日期,因此我使用了“now”这个词。我的评论只是给今天的读者的一个便条,让他们知道,虽然这个答案是正确的,但现在已经过时了。
ZonedDateTime
.parse(
    "Tue, 28 Apr 2015 06:17:40 GMT" ,
    DateTimeFormatter.RFC_1123_DATE_TIME
)
.withZoneSameInstant(
    ZoneId.of( "America/Anchorage" ) 
)
.toString()
String input = "Tue, 28 Apr 2015 06:17:40 GMT" ;
DateTimeFormatter f = DateTimeFormatter.RFC_1123_DATE_TIME ;
ZonedDateTime zdt = ZonedDateTime.parse( input , f ) ;