2012-08-16 10 views
6

OK amigos, he estado solucionando este problema durante 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 ¡Responda, pero simplemente no puedo entender cómo debo hacer lo que estoy tratando de hacer y me está impulsando 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. : DEnviando una fecha y zona horaria desde el servidor GAE al cliente GWT

También por favor, no se moleste en seguir leyendo si usted es probable que proporcione una respuesta que no toma 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 por el estilo

Por último, si alguien sabe de un mejor lugar para entender cosas como esta, POR FAVOR avísenme mientras sigo surgiendo problemas como este y no tengo idea de cómo encontrar una solución que no sea aquí, o me paso horas y horas buscando en google a alguien más que ya haya logrado descifrarlo. 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 almacenada como una cadena (por ejemplo, "America/New_York"). Esta cadena se obtiene usando java.util.TimeZone.getAvailableIDs() en el servidor y haciendo que el propietario de la empresa seleccione la zona horaria correspondiente para su empresa (por defecto es "Europe/London" si no eligen nada, no es necesario colgarlo) Necesito pasar cualquier las fechas de regreso 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.

Por ejemplo, el propietario 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 cuando 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 está 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 cambiarla por una semana, entonces luego intentan ver la cita (en el libro de citas 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 las citas el 3 de septiembre, el servidor puede devolver una fecha y hora UTC de 0800 y una cadena java.util.TimeZone Identificación de "Europe/London"

Pero debido a que en el cliente sólo puedo usar

com.google.gwt.i18n.client.TimeZone 

no me permite utilizar 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" 

que sugiere cambiar a

com.google.gwt.i18n.client.TimeZone.createTimeZone("Europe/London") 

pero esta versión, está esperando un GWT com.google.gwt.i18n.client.TimeZoneConstants "objeto" (ejemplo que se muestra al final de este mensaje) y no la cadena simple que la java.util.TimeZone.createTimeZone() se aceptar.

puedo crear mediante el uso de:

final TimeZoneConstants constTz = GWT.create(TimeZoneConstants.class); 
final TimeZone timeZoneCali = TimeZone.createTimeZone(constTz.europeLondon()); 

pero no sé cómo hacer esto cuando estoy empezando con "Europe/London" y/o no sé cómo almacenar este objeto en la Base de Datos de App Engine y luego recuperar eso mas 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 hacer esto sin duda, yo realmente no puedo ser la primera persona que alguna vez ha de 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, 392857, 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", "Hora del meridiano de Greenwich", "BST", "horario de verano británico"], "id": "Europa/Londres", "std_offset" : 0}

+0

Probablemente haya algo que me falta, pero ¿no puedes simplemente convertir la fecha en el servidor con java.util.TimeZone y enviar la fecha convertida al cliente? – jrochette

+0

No creo que puedas hacer eso ¿verdad? seguramente la zona horaria es solo una cuestión de formato aplicada a la fecha misma, a menos que esté sugiriendo que aplique la zona horaria, el formato como una cadena, luego lo analice y envíe de regreso como una matriz de cadenas. EG 'string [] = {" 2012 "," 09 "," 03 "," 09 "," 00 "," 00 "};' – johnvdenley

+0

Sí, eso es más o menos lo que quise decir (lo siento por no ser más claro) – jrochette

Respuesta

0

¿Ha intentado, 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.

Consulte the properties file - parece que tiene todos los nombres estándar para 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).

+0

He intentado TimeZone.createTimeZone ("Europa/Londres"); y no funciona en mi versión actual GWT 2.2, pero noto que v2.4 está disponible para actualizar, así que podría intentarlo ... – johnvdenley

+0

Sí, no sé en qué versión estuvo disponible. Podría valer la pena intentarlo ~ –

+0

Ahora me he actualizado a GWT 2.4 (última versión) y la línea 'com.google.gwt.i18n.client.TimeZone.createTimeZone (" Europa/Londres ")' todavía bloquea mi cliente GWT y el documentación indica: 'com.google.gwt.i18n.client.TimeZone.createTimeZone (String tzJSON)' y 'Este método de fábrica crea una instancia de zona horaria a partir de una cadena JSON que contiene la información de zona horaria para la zona horaria deseada. Las aplicaciones pueden obtener una cadena de la clase TimeZoneConstants' – johnvdenley

2

Tengo un problema similar con v2.4.

Creo que Riley Lark tiene razón.

TimeZone.createTimeZone ("Asia/Tokio") no funcionaba en GWT 2.4

Sin embargo, descubrí que podía conseguir 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 está sugiriendo para usted ya tiene europeLondon "std_offset": 0 ...

zona horaria zona horaria = TimeZone.createTimeZone (0);

+0

El desplazamiento cambia dependiendo de una fecha. Puede obtener el huso horario incorrecto como resultado. –

Cuestiones relacionadas