我使用joda的DateTimeZone及其所有功能。
我从第3方获得了一个java标准的TimeZone。
然后我将其转换为DateTimeZone,如下所示:
TimeZone timeZone = TimeZone.getTimeZone(3rd_party_timezone_string_id);
DateTimeZone dateTimeZone = DateTimeZone.forTimeZone(timeZone);
我注意到有几个时区被映射到同一个DateTimeZone。例如:
“澳大利亚/阿德莱德” - > “澳大利亚/阿德莱德”
“澳大利亚/南方” - > “澳大利亚/阿德莱德”
我想知道,当我有DateTimeZone时,如何获得映射到它的TimeZone列表?
答案 0 :(得分:2)
如果您从IANA(tzcode
和tzdata
截至2014年11月11日)获得时区数据和代码,则在tzdata
内您可以找到backward
文件,提供时区当前名称与旧名称之间的链接。
例如,在该文件中,您可以找到您提到的那个:
(...)
Link Australia/Adelaide Australia/South
(...)
如果您想拥有ID的“地图”,可以迭代可用的ID并使用DateTimeZone.forID()
获取当前名称。
groovy中的这个小脚本可以满足您的需求(您可以轻松将其移植到java):
@Grapes(
@Grab(group='joda-time', module='joda-time', version='2.5')
)
import org.joda.time.*
import org.joda.time.format.*
Map<String, List<String>> equivalentZones = new HashMap<String, List<String>>()
DateTimeZone.getAvailableIDs().each { id ->
DateTimeZone dtz = DateTimeZone.forID(id)
zonesForID = equivalentZones.get(dtz.ID, [])
if (id != dtz.ID) {
zonesForID << id
}
equivalentZones.put(dtz.ID, zonesForID)
}
equivalentZones.each { k,v ->
println "$k -> $v"
}
它产生:
(...)
Africa/Maputo -> [Africa/Blantyre, Africa/Bujumbura, Africa/Gaborone, Africa/Harare, Africa/Kigali, Africa/Lubumbashi, Africa/Lusaka]
(...)
Asia/Shanghai -> [Asia/Chongqing, Asia/Chungking, Asia/Harbin, PRC]
(...)
Australia/Adelaide -> [Australia/South]
(...)
Europe/London -> [Europe/Belfast, Europe/Guernsey, Europe/Isle_of_Man, Europe/Jersey, GB, GB-Eire]
(...)