从时区偏移获取时区?
Getting Time Zone from Time Zone offset?
JodaTime 中是否有一个选项,一旦用时区偏移量解析了 ISO 有效字符串,我就可以取回时区?
String dateTime = "2012-11-29T23:08:56.23-04:00"
其中 -04:00
是时区偏移量
解析后,是否有任何内置的 Joda API 可以为我提供上述已解析字符串的时区?
例如。 America/Dominica
或者,根据讨论 here
,这甚至是一个有效的问题吗?
您无法获得单个时区,因为在给定时间点可以有(并且通常有)多个具有该偏移量的时区。但是您可以获得它们的列表:
public void printZonesByOffset() {
DateTime dateTime = DateTime.parse("2012-11-29T23:08:56.23-04:00");
Set<DateTimeZone> matchingTimeZones = getTimeZonesByOffset(dateTime);
System.out.println(matchingTimeZones);
}
public Set<DateTimeZone> getTimeZonesByOffset(DateTime dateTime) {
int dateTimeOffset = dateTime.getZone().getOffset(dateTime);
Set<String> timeZoneIds = DateTimeZone.getAvailableIDs();
Set<DateTimeZone> matchingTimeZones = new HashSet<>();
for (String timeZoneId : timeZoneIds) {
DateTimeZone timeZone = DateTimeZone.forID(timeZoneId);
int offset = timeZone.getOffset(dateTime);
if (dateTimeOffset == offset) {
matchingTimeZones.add(timeZone);
}
}
return matchingTimeZones;
}
打印
[America/Blanc-Sablon, America/Puerto_Rico, America/Goose_Bay, America/Guyana, America/Moncton, America/Porto_Velho, America/Halifax, America/Anguilla, America/Kralendijk, America/Curacao, America/Thule, America/Grenada, America/Martinique, America/Guadeloupe, Atlantic/Bermuda, Etc/GMT+4, America/Manaus, America/Antigua, America/Eirunepe, America/Tortola, America/Rio_Branco, America/Boa_Vista, America/St_Thomas, America/Port_of_Spain, America/Aruba, America/St_Vincent, America/Montserrat, America/Marigot, America/Santo_Domingo, America/La_Paz, America/St_Kitts, America/Barbados, America/Glace_Bay, America/Lower_Princes, America/St_Lucia, America/Dominica, America/St_Barthelemy]
注意 "synthetic" 时区,例如 Etc/GMT+4
JodaTime 中是否有一个选项,一旦用时区偏移量解析了 ISO 有效字符串,我就可以取回时区?
String dateTime = "2012-11-29T23:08:56.23-04:00"
其中 -04:00
是时区偏移量
解析后,是否有任何内置的 Joda API 可以为我提供上述已解析字符串的时区?
例如。 America/Dominica
或者,根据讨论 here
,这甚至是一个有效的问题吗?您无法获得单个时区,因为在给定时间点可以有(并且通常有)多个具有该偏移量的时区。但是您可以获得它们的列表:
public void printZonesByOffset() {
DateTime dateTime = DateTime.parse("2012-11-29T23:08:56.23-04:00");
Set<DateTimeZone> matchingTimeZones = getTimeZonesByOffset(dateTime);
System.out.println(matchingTimeZones);
}
public Set<DateTimeZone> getTimeZonesByOffset(DateTime dateTime) {
int dateTimeOffset = dateTime.getZone().getOffset(dateTime);
Set<String> timeZoneIds = DateTimeZone.getAvailableIDs();
Set<DateTimeZone> matchingTimeZones = new HashSet<>();
for (String timeZoneId : timeZoneIds) {
DateTimeZone timeZone = DateTimeZone.forID(timeZoneId);
int offset = timeZone.getOffset(dateTime);
if (dateTimeOffset == offset) {
matchingTimeZones.add(timeZone);
}
}
return matchingTimeZones;
}
打印
[America/Blanc-Sablon, America/Puerto_Rico, America/Goose_Bay, America/Guyana, America/Moncton, America/Porto_Velho, America/Halifax, America/Anguilla, America/Kralendijk, America/Curacao, America/Thule, America/Grenada, America/Martinique, America/Guadeloupe, Atlantic/Bermuda, Etc/GMT+4, America/Manaus, America/Antigua, America/Eirunepe, America/Tortola, America/Rio_Branco, America/Boa_Vista, America/St_Thomas, America/Port_of_Spain, America/Aruba, America/St_Vincent, America/Montserrat, America/Marigot, America/Santo_Domingo, America/La_Paz, America/St_Kitts, America/Barbados, America/Glace_Bay, America/Lower_Princes, America/St_Lucia, America/Dominica, America/St_Barthelemy]
注意 "synthetic" 时区,例如 Etc/GMT+4