【问题标题】:Java TimeZone and shortcuts for time-zone names issueJava TimeZone 和时区名称的快捷方式问题
【发布时间】:2013-03-11 06:14:44
【问题描述】:

我有一个 linux 应用程序,它以 iOS-XR 格式显示带有时区的时间: 技术系统时钟状态本地时间字符串“10:16:12.523 CDT Thu Mar 21 2013”​​

我还看到在 linux“zdump”输出中使用了“CDT”快捷方式:

zdump -v 美国/哈瓦那 | 2013 年 美国/哈瓦那 2013 年 3 月 10 日星期日 04:59:59 UTC = 2013 年 3 月 9 日星期六 23:59:59 CST isdst=0 gmtoff=-18000 美国/哈瓦那 2013 年 3 月 10 日星期日 05:00:00 UTC = 2013 年 3 月 10 日星期日 01:00:00 CDT isdst=1 gmtoff=-14400 美国/哈瓦那 2013 年 11 月 3 日星期日 04:59:59 UTC = 2013 年 11 月 3 日星期日 00:59:59 CDT isdst=1 gmtoff=-14400 美国/哈瓦那 2013 年 11 月 3 日星期日 05:00:00 UTC = 2013 年 11 月 3 日星期日 00:00:00 CST isdst=0 gmtoff=-18000

但是当我运行 "System.out.println(TimeZone.getTimeZone("CDT"));" Java 命令我得到 GMT 时区...

  1. 谁能解释一下 Java timeZone 对象中存在快捷方式的标准是什么?
  2. 在哪里可以找到用于将时间字符串转换为“日期”对象的开源代码...我在 Java 日历、SimpleDateFormat 和日期上使用中继的当前解析器,但由于 Java 时区无法识别“CDT”它解析这个字符串,因为它是 GMT 时间......

【问题讨论】:

    标签: java timezone


    【解决方案1】:

    tl;博士

    在哪里可以找到将时间字符串转换为“日期”对象的开源代码

    在 java.time 类中内置于 Java。

    LocalDate.parse( "2017-01-23" )
    LocalTime.parse( "14:56:00" )
    LocalDateTime.parse( "2017-01-23T07:56:00" )
    OffsetDateTime.parse( "2017-01-23T07:56:00-07:00" )
    ZonedDateTime.parse( "2017-01-23T07:56:00-07:00[America/Los_Angeles]" )
    

    使用 java.time

    您正在使用麻烦的旧日期时间类,它们现在是遗留的,被 java.time 类所取代。

    ZoneId

    java.util.TimeZone 类被 java.time.ZoneIdjava.time.ZoneOffset 替换。时区是特定区域与 UTC 的偏移量的更改历史记录。

    在遗留的 java.time 类中有许多糟糕的设计决策。使用 3-4 个字符的伪时区代码是一种糟糕的选择。切勿使用 3-4 个字母的缩写,例如 CDTESTIST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。

    相反,您应该以continent/region 的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland

    ISO 8601

    避免使用设计糟糕的笨拙格式,例如“10:16:12.523 CDT Thu Mar 21 2013”​​人类难以阅读、机器难以解析、不必要地依赖英语以及使用模棱两可(差于没用!)伪时区。而是使用标准的ISO 8601 格式。 java.time 类默认使用这些格式。 ZonedDateTime 类通过在方括号中附加大陆/地区时区名称来扩展标准格式。

    例子:

    • 2017-01-23
    • 14:56:00
    • 2017-01-23T14:56:00Z
    • 2017-01-23T07:56:00-07:00[美国/洛杉矶]

    对于ISO 8601 以外的格式,请使用DateTimeFormatter 类。已经涵盖了数百次,因此请搜索 Stack Overflow 以获取更多信息和示例。


    关于java.time

    java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

    Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

    要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

    从哪里获得 java.time 类?

    ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

    【讨论】:

      【解决方案2】:

      1)看java.util.DateFormatSymbols.getZoneStrings,它返回一个数组

      •zoneStrings[i][0] - time zone ID
      •zoneStrings[i][1] - long name of zone in standard time
      •zoneStrings[i][2] - short name of zone in standard time
      •zoneStrings[i][3] - long name of zone in daylight saving time
      

      我们可以在 TimeZone.getTimeZone() 中使用 'time zone ID',其余为 SimpleDateFormat 'z' General Time Zone

      2) CDT 对于 SimpleDateFormat 是可以的,试试

      new SimpleDateFormat("z").parse("CDT");
      

      有效

      【讨论】:

      【解决方案3】:

      我会尝试回答您问题的第二部分。试试乔达时间

      http://joda-time.sourceforge.net/index.html

      如果有帮助,请告诉我们。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      • 2012-01-31
      • 2016-07-27
      • 1970-01-01
      相关资源
      最近更新 更多