Java TimeZone和时区名称的快捷方式问题

时间:2013-03-21 16:07:24

标签: java timezone

我有一个linux应用程序,它以iOS-XR格式显示时区: tech system clock status local-time-string“10:16:12.523 CDT Thu Mar 21 2013”​​

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

  

zdump -v America / Havana | grep 2013   America / Havana Sun Mar 10 04:59:59 2013 UTC = Sat Mar 9 23:59:59 2013 CST isdst = 0 gmtoff = -18000   America / Havana Sun Mar 10 05:00:00 2013 UTC = Sun Mar 10 01:00:00 2013 CDT isdst = 1 gmtoff = -14400   America / Havana Sun 11月3日04:59:59 UTC =太阳11月3日00:59:59 CDT isdst = 1 gmtoff = -14400   America / Havana Sun Nov 3 05:00:00 2013 UTC = Sun Nov 3 00:00:00 2013 CST isdst = 0 gmtoff = -18000

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

  1. 任何人都可以解释Java timeZone对象中存在快捷方式的标准是什么?
  2. 我在哪里可以找到一个用于将时间字符串转换为“Date”对象的开源代码...当前的解析器我在Java Calendar,SimpleDateFormat和Date上使用中继但是因为Java TimeZone不识别“CDT”它解析这个字符串,因为它是GMT时间......

3 个答案:

答案 0 :(得分:1)

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()中使用'时区ID',其余为SimpleDateFormat'z'通用时区

2)对于SimpleDateFormat,CDT没问题,请尝试

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

它有效

答案 1 :(得分: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个字符的伪时区代码就是这样一个糟糕的选择。切勿使用诸如CDTESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的( !)。

相反,您应该以{{1​​}}的格式指定proper time zone name,例如America/MontrealAfrica/Casablancacontinent/region

ISO 8601

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

示例:

  • 2017年1月23日
  • 14时56分○○秒
  • 2017-01-23T14:56:00Z
  • 2017-01-23T07:56:00-07:00 [美国/洛杉矶]

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

关于java.time

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

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

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 2 :(得分:0)

我会尝试回答你问题的第二部分。试试Joda-time

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

请告诉我们是否有帮助。