【发布时间】:2016-11-17 18:28:54
【问题描述】:
我需要创建由以下格式定义的 POSIX 格式的 TimeZone。
std offset dst [offset],start[/time],end[/time]
例如“America/New_York”的 POSIX 格式是 EST+5EDT,M3.2.0/2,M11.1.0/2
现在值 M3.2.0/2 以 Mm.w.d/t 的形式表示。
这指定了 m 月 w 周的第 d 天。 d 天必须介于 0(星期日)和 6 之间。周 w 必须介于 1 和 5 之间;第 1 周是第 d 天出现的第一周,第 5 周指定该月的最后 d 天。 m 月份应该在 1 到 12 之间。我从下面的链接中借用了上面的解释
http://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html
所以上面的例子说明,与 UTC 的正常偏移量是 5 小时;因为这是本初子午线以西,所以符号为正。夏季时间从 3 月的第二个星期日凌晨 2:00 开始,到 11 月的第一个星期日凌晨 2:00 结束。
当我在 Linux 时区文件 /usr/share/zoneinfo/America/New_York 中检查时,它与上述值匹配
EST5EDT,M3.2.0,M11.1.0
但是,当我在 java 中为时区“America/New_York”构造它时,我得到以下字符串
EST-5EDT+1,M2.1.1/2,M10.1.1/2
我通过从以下代码的输出中提取信息来构造上述字符串。
TimeZone timezone = TimeZone.getTimeZone("America/New_York");
System.out.println(timezone.toString());
输出如下
sun.util.calendar.ZoneInfo[id="America/New_York",offset=-18000000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=America/New_York,offset=-18000000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]
注意值 endMonth=10 与 Linux 输出相比应该是 11。
【问题讨论】:
-
你能发布一个指向这种格式的 POSIX 文档的链接吗?我很好奇。
-
是的,我在描述中提到过,如下gnu.org/software/libc/manual/html_node/TZ-Variable.html
-
谢谢,但不,这不是官方的 POSIX 文档。那只是 gnu.org 上的一些库。谷歌搜索让我找到了其他来源,记录了这种假定的 POSIX 日期时间格式的不同定义。所以我希望有人可以发布一个权威来源。