java - paises - ¿Hay alguna manera de obtener una zona horaria con(solo) un código de país(código ISO-3166 válido)?
norma iso 3166 2 ar (7)
Estoy tratando de obtener un TimeZone para un usuario.
Para esto tengo un código de país que es un código de país ISO válido. Estos códigos son los códigos de dos letras en mayúsculas definidos por ISO-3166. Puede encontrar una lista completa de estos códigos en varios sitios, tales como: http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html
Creo que la respuesta es "no porque es una relación entre muchos ... puede haber muchas zonas horarias para un país como Estados Unidos ...". Ese es el problema...
He intentado algo así como:
//CountryEnum contains ISO_3166 values (http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html)
//List all country to test timezone:
for (int i = 0; i < CountryEnum.values().length; i++) {
String isoCountryCode = CountryEnum.values()[i].name();// Get the iso country code
Locale locale = new Locale(isoCountryCode);// Build a country specific locale
Calendar calendar = Calendar.getInstance(locale);// Build a calendar with the specific locale
String timeZone = calendar.getTimeZone().getDisplayName();// Build a timeZone with the calendar
System.out.println("LOCALE : "+locale+" / COUNTRY: "+isoCountryCode+" / TIMEZONE: "+timeZone);
}
Pero siempre devuelve el servidor TimeZone ...
Algunas ideas ?
¿Has probado la gema TZInfo ?
Puede obtener las zonas horarias de un país de esta manera:
>> TZInfo::Country.get("DE").zone_identifiers
=> ["Europe/Berlin", "Europe/Busingen"]
>> TZInfo::Country.get("CN").zone_identifiers
=> ["Asia/Shanghai", "Asia/Harbin", "Asia/Chongqing", "Asia/Urumqi", "Asia/Kashgar"]
>> TZInfo::Country.get("US").zone_identifiers
=> ["America/New_York", "America/Detroit", "America/Kentucky/Louisville", "America/Kentucky/Monticello", "America/Indiana/Indianapolis", "America/Indiana/Vincennes", "America/Indiana/Winamac", "America/Indiana/Marengo", "America/Indiana/Petersburg", "America/Indiana/Vevay", "America/Chicago", "America/Indiana/Tell_City", "America/Indiana/Knox", "America/Menominee", "America/North_Dakota/Center", "America/North_Dakota/New_Salem", "America/North_Dakota/Beulah", "America/Denver", "America/Boise", "America/Phoenix", "America/Los_Angeles", "America/Anchorage", "America/Juneau", "America/Sitka", "America/Yakutat", "America/Nome", "America/Adak", "America/Metlakatla", "Pacific/Honolulu"]
Aquí la solución que estás buscando:
public String getTimeZoneByLocale(final String languageTag){
final Locale locale = Locale.forLanguageTag(languageTag);
final Calendar cal = Calendar.getInstance(locale);
final TimeZone timeZone = cal.getTimeZone();
return timeZone.getID();
}
El languageTag es un código como en_US o ru_RU
La base de datos olson contiene todas las asignaciones. Enlazar
Busque el archivo zone.tab.
No estoy al tanto de nada que te dé esto (como señaló Jon que el caso de uso es bastante limitado) pero podrías construir un Mapa usando esta información . La lista sería un mapa múltiple, por lo que tal vez lo usaría de Google Collections o usaría su propio mapa ISO-> List <String>
map.
Dada la cadena de zona horaria, puede crear un objeto TimeZone e ir desde allí. Sin embargo, si el país tiene más de una zona horaria, debe decidir cómo manejarla.
Puedes usar ICU4J para esto ... Ver http://helpdesk.objects.com.au/java/can-i-find-all-available-timezones-for-a-country
Tienes exactamente razón. No hay una zona horaria única para los EE. UU. - o Rusia, u otros países "grandes" (en términos de Este / Oeste).
Estados Unidos es ciertamente un ejemplo simple: ¿qué zona horaria quieres usar? America/Los_Angeles
? America/New_York
? ¿Algo más?
Un Locale
no es un TimeZone
, y viceversa. Compruebe el Javadoc para el método que está utilizando, la primera línea dice
Obtiene un calendario utilizando la zona horaria predeterminada y la configuración regional especificada.
Es por eso que obtienes la zona horaria predeterminada, ya que no especificaste una cuando obtuviste un Calendario.
Piensa en lo que dijo Jon: si sabes qué zona horaria quieres usar en la situación en la que crees que un usuario es de los EE. UU., Entonces puedes llamar al método Calendar.getInstance
que toma una zona horaria y una configuración regional. Por otro lado, si no puede decir con certeza qué haría aquí, vuelva a la pizarra y piense un poco más sobre sus requisitos, en lugar de observar su implementación.
Si no puede responder la pregunta anterior, creo que el recurso estándar de la mayoría de los sitios web es permitir que los usuarios especifiquen su zona horaria preferida (si tienen una cuenta persistente en el servidor) y los predeterminan en la zona horaria del servidor si no lo han hecho. dijo lo contrario. Si no tienen cuentas persistentes, y le están entregando información en momentos (por ejemplo, una carga XML), entonces tendrán que especificar qué zona horaria están utilizando en la solicitud, o (probablemente mejor) Usted ordena el uso de UTC todo el tiempo.