【问题标题】:date time joda api is displaying incorrect zone code for some zone ids日期时间 joda api 为某些区域 ID 显示不正确的区域代码
【发布时间】:2015-01-09 04:05:04
【问题描述】:

我正在尝试使用格式化程序 yyyy-MM-dd HH:mm z 格式化日期时间,并使用 joda api for id Australia/Yancowinna 。我的期望是,它应该为区域显示 3 个字母的短代码(例如:IST、GMT、EDT 等),而不是显示 +10:30。它如何为大多数其他 ID 显示正确的区域代码。

这是我的代码

package com.rais;

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;

public class DateClient {

    public static void main(String[] args) {
        DateTimeZone.setDefault(DateTimeZone.forID("Australia/Yancowinna"));        
        DateTime datetime = new DateTime("2015-01-13T14:30:00.000+10:30");
        System.out.println("Original time = "+datetime);
        System.out.println("Original time zone = "+datetime.getZone());
        System.out.println("Original time toString(yyyy-MM-dd HH:mm z)= "+datetime.toString("yyyy-MM-dd HH:mm z"));   

    }
}

这是输出

Original time = 2015-01-13T14:30:00.000+10:30
Original time zone = Australia/Broken_Hill
Original time toString(yyyy-MM-dd HH:mm z)= 2015-01-13 14:30 +10:30

如果我们使用区域 id Asia/Amman,它会在 windows 中显示正确的区域代码,但在 linux 中不显示区域代码。

【问题讨论】:

    标签: java datetime calendar timezone jodatime


    【解决方案1】:

    Joda-Time 是正确的

    +10:30 的偏移量对于 DST IN Australia/Yancowinna 确实是正确的。

    将时区报告为Australia/Broken_Hill 也是正确的。 That name is primaryAustralia/Yancowinna 是次要的。

    避免使用 3 和 4 字母代码

    那些 3 或 4 个字母的代码既不标准化也不唯一。

    IST 是指爱尔兰标准时间还是印度标准时间?这只是一个例子。

    此外,这些代码指的是标准时间和夏令时。这些不是时区,它们是应用时区的结果。时区是与 UTC(小时和分钟)的偏移量一组异常规则,例如过去、现在和未来日期时间值所需的夏令时 (DST)。

    Joda-Time 和 java.time 都明智地避免使用那些 3/4 字母代码。你也应该这样。

    这些库确实会尝试将此类代码解析为输入。但鉴于他们的问题,我建议避免此类进口。坚持使用ISO 8601 标准格式字符串,在 Joda-Time 和 java.time 中默认使用。除了偏移量之外,java.time 库还通过在括号中附加 proper time zone name 来扩展该标准格式。一种明智的方法,因为所有信息都包含在时区之间来回转换。

    【讨论】:

    • 嗨@Basil Bourque,感谢您的精彩解释。我明白你给出的解释。我的问题是,我必须进行网络服务调用,这将需要该短代码,如果不存在或不正确,则发送失败报告。我需要通过请求发送这些短代码
    • @RaisAlam 首先要提防这样的网络服务。如果这些开发人员不知道要避免使用 3 个字母的代码,那么他们可能会在日期时间处理方面遇到其他问题。其次,您可以在 Joda-Time 中尝试使用小写的 z 格式化代码。但由于那些非标准化代码中的所有重复值,这是偶然的。也许仔细阅读 Joda-Time 的源代码,看看它如何将z 转换为代码。如果您的数据涉及一组有限的此类代码,我将使用您自己的代码将其硬编码到字符串中。
    猜你喜欢
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多