java - fechas - Enviar una fecha y una zona horaria desde el servidor GAE al cliente GWT
date java (2)
OK amigos, he estado solucionando este problema por aproximadamente 2 semanas, ahora estoy probando todo lo que puedo pensar y estoy viendo un montón de respuestas aquí que sienten que van a responderlo, pero simplemente no puedo entender cómo debo hacerlo. ¡haz lo que estoy tratando de hacer y me está conduciendo absolutamente NUTS! Nadie parece tener una respuesta en ninguna parte, hay respuestas a medias por todos lados, pero ninguna parece hacer realmente lo que necesito que haga, seguramente ALGUIEN ha resuelto este problema antes. Disculpe la pregunta REALMENTE larga, pero es importante que la pregunta se haga correctamente, de modo que las respuestas realmente respondan a la necesidad. :RE
Además, no se moleste en leer más si es probable que proporcione alguna respuesta que no tenga en cuenta que mi almacén de datos / servidor es Google App Engine (GAE), y mi cliente está escrito en Google Web Toolkit (GWT) y todo está escrito en Java, no sé nada de Python o MySQL o PHP o algo así
Finalmente, si alguien sabe de un mejor lugar para entender cosas como esta, POR FAVOR házmelo saber, ya que sigo llegando con problemas como este y no tengo idea de cómo encontrar una solución que no sea aquí, o pasar horas y horas buscando en Google para alguien más que ya ha logrado resolverlo. Tampoco entiendo cómo descifrar nada de JavaDocs, lo siento, pero hasta que alguien me lo explique, no voy a conseguirlo.
Tengo una fecha y hora almacenada en el servidor (en UTC obviamente) También he almacenado en el servidor una TimeZone para cada propietario de negocio almacenado como una cadena (por ejemplo, "America/New_York"
). Esta cadena se obtiene utilizando java.util.TimeZone.getAvailableIDs()
en el servidor y haciendo que el propietario de la empresa seleccione la zona horaria correspondiente para su empresa (el valor predeterminado es "Europe/London"
si no eligen nada, no es necesario obsérvense con eso) Necesito pasar cualquier fecha y hora a la PC del cliente en algún momento en el futuro, IGNORANDO la zona horaria local en su PC, porque la fecha y hora debe mostrarse de acuerdo con la zona horaria del propietario de la empresa.
Entonces, como ejemplo, el dueño del negocio es un peluquero en Londres y tiene un calendario de citas en línea que está disponible para ser visto por cualquier cliente potencial suyo. Uno de estos clientes (también en Londres) quiere reservar una cita, ve un espacio a las 9 a.m. BST el lunes 3 de septiembre y lo reserva.
Esto se almacena en el almacén de datos como la hora UTC (que en realidad es 0800 ya que BST es UTC + 1) y, por supuesto, el propietario de la empresa ha seleccionado "Europe/London"
como su zona horaria. Todo bien hasta ahora.
AHORA, en algún momento en el futuro, el cliente se encuentra en una reunión de negocios en Nueva York, y se da cuenta de que tienen una cita la semana siguiente para un corte de pelo en Londres y quieren mudarse por una semana, entonces intentan VEA la cita (en el libro de cita de peluqueros), pero no quieren verla como a las 4 a. M., Hora de Nueva York, quieren verla como a las 9 am, hora británica.
Así que mi problema es que cuando el cliente hace clic para VER citas el 3 de septiembre, el servidor puede devolver una fecha de salida UTC de 0800 y una cadena de identificación java.util.TimeZone
de "Europe/London"
Pero porque en el cliente solo puedo usar
com.google.gwt.i18n.client.TimeZone
no me permite usar la función
TimeZone bizTimeZone=TimeZone.getTimeZone("Europe/London")
(which works for `java.util.TimeZone`)
ya que causa el error
"The method getTimeZone(String) is undefined for the type TimeZone"
sugiere cambiarlo a
com.google.gwt.i18n.client.TimeZone.createTimeZone("Europe/London")
pero esta versión espera un "objeto" com.google.gwt.i18n.client.TimeZoneConstants
GWT (ejemplo que se muestra al final de este mensaje) y no la cadena simple que aceptará java.util.TimeZone.createTimeZone()
.
Puedo crear esto usando:
final TimeZoneConstants constTz = GWT.create(TimeZoneConstants.class);
final TimeZone timeZoneCali = TimeZone.createTimeZone(constTz.europeLondon());
Pero no sé cómo hacerlo cuando comienzo con "Europe/London"
y / o no sé cómo almacenar este objeto en la base de datos de App Engine y luego lo recupero más tarde.
Por cierto, entre el texto comentado también he intentado usar las siguientes líneas:
//Calendar tmad = new GregorianCalendar(TimeZone.getTimeZone("Europe/London"));
//Calendar cal = Calendar.getInstance(someTimeZone);
//DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//df1.setTimeZone(TimeZone.getTimeZone("Europe/London"));
//final TimeZone timeZoneClient = TimeZone.createTimeZone("Europe/London");
//dtf.format(date,timeZoneClient)
DEBE haber una forma estándar de hacerlo SEGURAMENTE, ¡realmente no puedo ser la primera persona en tener que resolver este problema!
constTz.europeLondon () = {"transiciones": [19394, 60, 24770, 0, 28130, 60, 33506, 0, 36866, 60, 42242, 0, 45602, 60, 50978, 0, 54506, 60, 59714, 0, 63242, 60, 68450, 0, 71978, 60, 77354, 0, 80714, 60, 86090, 0, 89450, 60, 94826, 0, 98521, 60, 103561, 0, 107257, 60, 112297, 0, 115993, 60, 121033, 0, 124729, 60, 129937, 0, 133633, 60, 138673, 0, 142369, 60, 147409, 0, 151105, 60, 156145, 0, 159841, 60, 164881, 0, 168577, 60, 173785, 0, 177313, 60, 182521, 0, 186217, 60, 191257, 0, 194953, 60, 199993, 0, 203689, 60, 208729, 0, 212425, 60, 217465, 0, 221161, 60, 226201, 0, 230065, 60, 235105, 0, 238801, 60, 243841, 0, 247537, 60, 252577, 0, 256273, 60, 261481, 0, 265009, 60, 270217, 0, 273745, 60, 278953, 0, 282649, 60, 287689, 0, 291385, 60, 296425, 0, 300121, 60, 305329, 0, 308857, 60, 314065, 0, 317593, 60, 322801, 0, 326329, 60, 331537, 0, 335233, 60, 340273, 0, 343969, 60, 349009, 0, 352705, 60, 357913, 0, 361441, 60, 366649, 0, 370177, 60, 375385, 0, 379081, 60, 384121, 0, 387817, 60, 3 92857, 0, 396553, 60, 401593, 0, 405289, 60, 410497, 0, 414025, 60, 419233, 0, 422761, 60, 427969, 0, 431665, 60, 436705, 0, 440401, 60, 445441, 0, 449137, 60, 454345, 0, 457873, 60, 463081, 0, 466609, 60, 471817, 0, 475513, 60, 480553, 0, 484249, 60, 489289, 0, 492985, 60, 498025, 0, 501721, 60, 506929, 0, 510457, 60, 515665, 0, 519193, 60, 524401, 0, 528097, 60, 533137, 0, 536833, 60, 541873, 0, 545569, 60, 550777, 0, 554305, 60, 559513, 0, 563041, 60, 568249, 0, 571777, 60, 576985, 0, 580681, 60, 585721, 0, 589417, 60, 594457, 0], "nombres": ["GMT", "Greenwich Mean Time "," BST "," horario de verano británico "]," id ":" Europa / Londres "," std_offset ": 0}
¿Has probado, por ejemplo, TimeZone.createTimeZone("Europe/London");
? Al menos en las versiones más nuevas de GWT, este método acepta un montón de nombres, evidentemente preparados "de la base de datos de la zona horaria CLDR y Olson [sic]". La documentación hace referencia específicamente a su caso de uso: la transferencia de la zona horaria a través de json.
Vea el archivo de propiedades , parece que tiene todos los nombres estándar para las zonas horarias.
Si eso no lo hace por usted, podría transmitir el desplazamiento de la zona horaria en minutos y luego crear su zona horaria con TimeZone.createTimeZone(offsetInMinutes)
.
Tengo un problema similar con v2.4.
Creo que Riley Lark tiene razón.
TimeZone.createTimeZone ("Asia / Tokio") no funcionó en GWT 2.4
Sin embargo, descubrí que podría obtener la zona de Tokio utilizando la configuración predeterminada del navegador a través de:
Date d = new Date();
TimeZone timezone = TimeZone.createTimeZone(d.getTimezoneOffset());
Eso es realmente lo que Riley Lark sugiere para ti, ya que europeLondon tiene "std_offset": 0 ...
TimeZone timezone = TimeZone.createTimeZone (0);