【问题标题】:How to Parse Timezone with Single Digit Offset? "Wed Dec 31 00:00:00 GMT-8 1969"如何用一位数偏移量解析时区? “1969 年 12 月 31 日星期三 00:00:00 GMT-8”
【发布时间】:2016-07-09 00:53:46
【问题描述】:

我有这个日期:

"Wed Dec 31 00:00:00 GMT-8 1969"

但是不能用这个 SimpleDateFormat 解析:

new SimpleDateFormat("EEE MMM dd hh:mm:ss zzz yyyy");

如何在格式字符串中指定-8?在阅读了 SDF 文档后,我尝试了 ZX,但无济于事。我应该使用什么?

【问题讨论】:

  • 注意:offset-from-UTC 使用单个数字不标准 (ISO 8601)。将导致各种库和协议出现问题,这些库和协议正确地期望两位数并为一位数值填充零。

标签: java date simpledateformat


【解决方案1】:

-8 的使用是非 ISO 标准格式。

预计会出现 -0800-08:00 之类的内容。这是因为时间偏移可以包括半小时。

您应该在将字符串传递给 SimpleDateFormat 之前对字符串运行预处理转换并将其更改为 "Wed Dec 31 00:00:00 GMT-0800 1969" 并使用:

new SimpleDateFormat("EEE MMM dd hh:mm:ss Z yyyy");

如果您想让它更简单,只需创建一个方法将-8 替换为America/Los_Angeles 并使用ZZZ

【讨论】:

  • 这用作预处理转换:s = s.replaceFirst("([\\-\\+])(\\d)\\b(?!:)", "$10$200").replaceFirst("([\\-\\+])(\\d\\d)\\b(?!:)", "$1$200");。它处理 - 或 + 后跟 1 位或 2 位数字,但仅保留 3 位或更多位的序列以及后跟 : 的序列。
【解决方案2】:

如果你使用的是java 8,你可以试试DateTimeFormatter,模式为"EEE MMM d HH:mm:ss O yyyy"喜欢:

    String date = "Wed Dec 31 00:00:00 GMT-8 1969";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM d HH:mm:ss O yyyy");
    LocalDateTime dateTime = LocalDateTime.parse(date, formatter);

O 表示本地化的区域偏移量,可以格式化区域偏移量,如 GMT+8、GMT+08:00、UTC-08:00。您可以在DateTimeFormatter 中查看Offset O 了解更多详情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多