specific - Validación de TimeZone en Java
timezone ids (8)
Puede usar TimeZone.getAvailableIDs()
para obtener la lista de Id soportado
for (String str : TimeZone.getAvailableIDs()) {
if(str.equals("UTC")){
//found
}
}
Tengo una cadena, necesito verificar si es un identificador de zona horaria estándar o no. No estoy seguro de qué método necesito usar.
String timeZoneToCheck = "UTC";
Me gustaría comprobar si representa una zona horaria válida o no.
Si TimeZone.getAvailableIDs()
contiene ID en cuestión, es válido:
public boolean validTimeZone(String id) {
for (String tzId : TimeZone.getAvailableIDs()) {
if(tzId.equals(id))
return true;
}
return false;
}
Desafortunadamente, el método TimeZone.getTimeZone()
descarta silenciosamente las ID inválidas y en su lugar devuelve GMT:
Devoluciones:
la zona horaria especificada, o la zona GMT si la identificación dada no puede ser entendida.
Me gustaría proponer la siguiente solución:
public static final String GMT_ID = "GMT";
public static TimeZone getTimeZone(String ID) {
if (null == ID) {
return null;
}
TimeZone tz = TimeZone.getTimeZone(ID);
// not nullable value - look at implementation of TimeZone.getTimeZone
String tzID = tz.getID();
// check if not fallback result
return GMT_ID.equals(tzID) && !tzID.equals(ID) ? null : tz;
}
Como resultado, en caso de una identificación de zona horaria no válida o de una zona horaria no válida y personalizada, recibirá un nulo . Además, puede introducir el controlador de valor nulo correspondiente (dependiendo del caso de uso) - lanzar excepción, etc.
Puede obtener la ID admitida utilizando getAvailableIDs ()
Luego haz un bucle en la matriz supportedID y compárala con tu String.
Ejemplo:
String[] validIDs = TimeZone.getAvailableIDs();
for (String str : validIDs) {
if (str != null && str.equals("yourString")) {
System.out.println("Valid ID");
}
}
Puedes escribirlo en una línea
public boolean validTimeZone(String timezone) {
return Arrays.asList(TimeZone.getAvailableIDs()).contains(timezone);
}
private boolean isValidTimeZone(final String timeZone) {
final String DEFAULT_GMT_TIMEZONE = "GMT";
if (timeZone.equals(DEFAULT_GMT_TIMEZONE)) {
return true;
} else {
// if custom time zone is invalid,
// time zone id returned is always "GMT" by default
String id = TimeZone.getTimeZone(timeZone).getID();
if (!id.equals(DEFAULT_GMT_TIMEZONE)) {
return true;
}
}
return false;
}
El método devuelve verdadero para lo siguiente:
assertTrue(this.isValidTimeZone("JST"));
assertTrue(this.isValidTimeZone("UTC"));
assertTrue(this.isValidTimeZone("GMT"));
// GMT+00:00
assertTrue(this.isValidTimeZone("GMT+0"));
// GMT-00:00
assertTrue(this.isValidTimeZone("GMT-0"));
// GMT+09:00
assertTrue(this.isValidTimeZone("GMT+9:00"));
// GMT+10:30
assertTrue(this.isValidTimeZone("GMT+10:30"));
// GMT-04:00
assertTrue(this.isValidTimeZone("GMT-0400"));
// GMT+08:00
assertTrue(this.isValidTimeZone("GMT+8"));
// GMT-13:00
assertTrue(this.isValidTimeZone("GMT-13"));
// GMT-13:59
assertTrue(this.isValidTimeZone("GMT+13:59"));
// NOTE: valid time zone IDs (see TimeZone.getAvailableIDs())
// GMT-08:00
assertTrue(this.isValidTimeZone("America/Los_Angeles"));
// GMT+09:00
assertTrue(this.isValidTimeZone("Japan"));
// GMT+01:00
assertTrue(this.isValidTimeZone("Europe/Berlin"));
// GMT+04:00
assertTrue(this.isValidTimeZone("Europe/Moscow"));
// GMT+08:00
assertTrue(this.isValidTimeZone("Asia/Singapore"));
... Y falso con las siguientes zonas horarias:
assertFalse(this.isValidTimeZone("JPY"));
assertFalse(this.isValidTimeZone("USD"));
assertFalse(this.isValidTimeZone("UTC+8"));
assertFalse(this.isValidTimeZone("UTC+09:00"));
assertFalse(this.isValidTimeZone("+09:00"));
assertFalse(this.isValidTimeZone("-08:00"));
assertFalse(this.isValidTimeZone("-1"));
assertFalse(this.isValidTimeZone("GMT+10:-30"));
// hours is 0-23 only
assertFalse(this.isValidTimeZone("GMT+24:00"));
// minutes 00-59 only
assertFalse(this.isValidTimeZone("GMT+13:60"));
Esta es una solución más simple, que recorrer todos los ID posibles. Comprueba si la salida es la zona horaria predeterminada (GMT) y si esa fue la entrada real del usuario.
public boolean isValidTimeZone(String timeZoneID) {
return (timeZoneID.equals("GMT") || !TimeZone.getTimeZone(timeZoneID).getID().equals("GMT"));
}
O si desea utilizar la zona horaria válida sin llamar a getTimeZone dos veces:
TimeZone myCurrentTimeZone;
TimeZone temp = TimeZone.getTimeZone(input);
if(input.equals("GMT") || !temp.getID().equals("GMT"))
myCurrentTimeZone = temp; //valid timezone set
//else
// System.out.println("Invalid timezone.");
Como TimeZone#getTimeZone(String id)
devuelve un valor predeterminado si el valor no es válido (en lugar de devolver un huso horario no válido), si el valor reinterpretado no coincide con el valor inicial, no era válido.
private static boolean isValidTimeZone(@Nonnull String potentialTimeZone)
{
// If the input matches the re-interpreted value, then the time zone is valid.
return TimeZone.getTimeZone(potentialTimeZone).getID().equals(potentialTimeZone);
}