到Java时区?

到Java时区?,java,timezone,Java,Timezone,我需要从Unix TZ环境变量转换为以下形式: stdoffset[dst[offset][,start[/time],end[/time]]] 转换为Java时区对象 例如,将AEST-10AEDT-11、M10.1.0/02:00:00、M4.1.0/03:00:00转换为表示“澳大利亚\悉尼”的Java时区对象。在我亲自编写代码之前,我想知道我不会再发明轮子了,那么有人知道是否已经有一个库可以做到这一点吗?编写这样的转换程序真的很难。在Unix上,您可以自定义日光规则,而Java不提供此

我需要从Unix TZ环境变量转换为以下形式:

stdoffset[dst[offset][,start[/time],end[/time]]]
转换为Java时区对象


例如,将AEST-10AEDT-11、M10.1.0/02:00:00、M4.1.0/03:00:00转换为表示“澳大利亚\悉尼”的Java时区对象。在我亲自编写代码之前,我想知道我不会再发明轮子了,那么有人知道是否已经有一个库可以做到这一点吗?

编写这样的转换程序真的很难。在Unix上,您可以自定义日光规则,而Java不提供此类功能。在tzfile中搜索以查找匹配项是可能的,但您必须将TZ规则转换为tzfile使用的格式,这是一项艰巨的任务

为什么不使用Java中使用的相同区域id?例如,可以将TZ设置为

出口TZ=澳大利亚/悉尼

大多数现代Unix系统(如Linux、Mac OS X)都支持这一点。搜索
/etc/zoneinfo
/usr/share/zoneinfo
。如果你能找到一个你所在时区的文件,这个ID就会起作用


我也开始使用自定义时区来处理旧的TZ格式,但我能够说服系统管理员使用区域id,所以我没有完成它。困难的部分是实现
useDaylightTime()
,因为TZ中使用的规则非常复杂。

感谢您的反馈,我也这么认为。顺便说一下,在现代Java(8+)中,时区将用类表示:
ZoneId.of(“Australia/Sydney”)
。注意这个答案中的正斜杠,但与问题中的反斜杠相反。这个答案是正确的。供参考,在现代Java中,请参见
ZoneId
ZoneRules
类。您可以获得有关偏移和过渡(夏令时转换等)的信息。但由于许多时区可能同时共享同一偏移量,因此您无法确定您想要的是哪个时区。