【问题标题】:What SimpleDateFormat Pattern to use?使用什么 SimpleDateFormat 模式?
【发布时间】:2015-04-28 06:21:44
【问题描述】:

我从 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

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

【问题讨论】:

  • EEE, dd MMM yyyy HH:mm:ss z 对我来说似乎工作得很好
  • @MadProgrammer hh 将是 0-12 小时,所以我怀疑它会起作用
  • @eis 对于 OP 提供的价值来说它工作得很好;)
  • 哦,小 z 不大 Z

标签: java date simpledateformat


【解决方案1】:

这应该可行:

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

小写“z”代表General time zone,即Pacific Standard TimePSTGMT-08:00

【讨论】:

  • @BasilBourque 我知道。但请参阅答案的日期。那是一个 java 8 非常新的时代。
  • 是的,我看到了日期,因此我使用了“现在”这个词。我的评论只是给今天的读者的一个注释,所以他们知道,虽然正确,但这个答案现在已经过时了。
【解决方案2】:

tl;博士

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

DateTimeFormatter.RFC_1123_DATE_TIME

我从 API 接收一个字符串形式的日期,格式如下:".expires": "Tue, 28 Apr 2015 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[美国/安克雷奇]

格林威治标准时间 -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 类为这种传统格式提供了预定义的格式化程序:@987654326 @。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多