Вопрос по timezone, gwt-rpc, google-app-engine, gwt, java – Отправка даты и часового пояса с сервера GAE клиенту GWT

6

Ладно, ребята, я обходил эту проблему уже около 2 недель, пробуя все, что я могу придумать, и просматривая здесь тонны ответов, которые чувствуют, что они собираются на них ответить, но я просто не могу понять, как я должен делай то, что я пытаюсь сделать, и это сводит меня с ума! Похоже, ни у кого нет ответа, везде есть половина ответов, но, похоже, никто не делает то, что мне нужно, конечно, кто-то уже решил эту проблему раньше! Пожалуйста, извините за ДЕЙСТВИТЕЛЬНО длинный вопрос, но важно, чтобы вопрос был задан правильно, чтобы ответы действительно отвечали потребностям! : D

Также, пожалуйста, не читайте дальше, если вы, вероятно, предоставите какой-либо ответ, который не учитывает, что моим хранилищем данных / сервером является Google App Engine (GAE), а мой клиент написан в Google Web Toolkit (GWT) и все такое написано на Java, я ничего не знаю о Python или MySQL или PHP или что-нибудь подобное

Наконец, если кто-нибудь знает, где лучше разбираться, как это, ПОЖАЛУЙСТА, дайте мне знать, поскольку я продолжаю придумывать подобные проблемы, и не знаю, как найти решение, кроме как здесь, или тратить часы на поиск в Google. для кого-то еще, кто уже сумел понять это. Я также не понимаю, как понять что-нибудь из JavaDocs - извините, но пока кто-то не объяснит мне, я просто не собираюсь это получить

У меня есть дата и время на сервере (очевидно, в UTC). Я также сохранил на сервере временную зону для каждого владельца бизнеса, хранящуюся в виде строки (например,"America/New_York"). Эта строка получается с помощьюjava.util.TimeZone.getAvailableIDs() на сервере и заставляя владельца бизнеса выбрать соответствующий часовой пояс для своего бизнеса (по умолчанию"Europe/London" если они ничего не выбирают - не нужно зацикливаться на этом бите) Мне нужно в какой-то момент в будущем передавать любые даты и времени на клиентские ПК, игнорируя местный часовой пояс на их ПК, потому что дата и время должны быть отображается в соответствии с часовым поясом владельца бизнеса.

Например, владелец бизнеса - парикмахер в Лондоне, и у них есть расписание онлайн-встреч, которое доступно для просмотра любому потенциальному клиенту. Один из этих клиентов (также в Лондоне) хочет записаться на прием, видит место в 9:00 BST в понедельник 3 сентября и заказывает его.

Затем он сохраняется в хранилище данных как время UTC (которое на самом деле 0800, так как BST - UTC + 1), и, конечно, владелец бизнеса выбрал"Europe/London" как их часовой пояс. Пока все хорошо.

ТЕПЕРЬ, в какой-то момент в будущем, клиент находится на деловой встрече в Нью-Йорке и понимает, что на следующей неделе у него назначена встреча для стрижки в Лондоне, и они хотят перенести ее на неделю, поэтому они затем пытаются ПРОСМОТРЕТЬ встречу (в книге встреч парикмахеров), но они не хотят видеть это как 4:00 по нью-йоркскому времени, они хотят видеть это как 9:00 по британскому времени.

Поэтому моя проблема заключается в том, что, когда клиент нажимает на ПРОСМОТР встреч, 3 сентября, сервер может отправить дату UTC 08:00 иjava.util.TimeZone Строка удостоверения личности"Europe/London"

Но потому что на клиенте я могу использовать только

com.google.gwt.i18n.client.TimeZone

это не позволяет мне использовать функцию

TimeZone bizTimeZone=TimeZone.getTimeZone("Europe/London")
(which works for `java.util.TimeZone`)

как это вызывает ошибку

"The method getTimeZone(String) is undefined for the type TimeZone"

предлагает изменить его на

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

но эта версия ожидает GWTcom.google.gwt.i18n.client.TimeZoneConstants & Quot; объект & Quot; (пример показан в конце этого сообщения), а не простая строка,java.util.TimeZone.createTimeZone() приму.

Я могу создать это с помощью:

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

Но я не знаю, как это сделать, когда я начинаю с"Europe/London" и / или я не знаю, как сохранить этот объект в базе данных App Engine, а затем извлечь его позже.

Между прочим, среди прокомментированного текста я также попытался использовать следующие строки:

//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)

ОБЯЗАТЕЛЬНО должен быть стандартный способ сделать это, я действительно не могу быть первым человеком, который когда-либо должен был решить эту проблему!

constTz.europeLondon()={"transitions": [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], "names": ["GMT", "Greenwich Mean Time", "BST", "British Summer Time"], "id": "Europe/London", "std_offset": 0}

Нет проблем, я сейчас проверяю это, как минимум, как временное решение! Тем не менее удивлен, что нет лучшего решения, хотя .... johnvdenley
Глядя на документ, я вижу другое решение - использование TimeZone и TimeZoneConstants из пакета com.google.gwt.i18n.client. Может быть, что-то вроде TimeZone.createTimeZone (timeZoneConstants.europeLondno ())? jrochette
Возможно, что-то пропущено, но вы не можете просто преобразовать дату на стороне сервера с помощью java.util.TimeZone и отправить конвертированную дату клиенту? jrochette
да, это почти то, что я имел в виду (извините за неясность) jrochette
Я не думаю, что вы можете сделать это, не так ли? конечно, часовой пояс - это только форматирующая вещь, применяемая к самой дате, если вы не предлагаете мне применить часовой пояс, отформатировать как строку, затем проанализировать ее и отправить обратно в виде массива строк? НАПРИМЕРstring[]={"2012","09","03","09","00","00"}; johnvdenley

Ваш Ответ

2   ответа
2

Я думаю, что Райли Ларк права.

TimeZone.createTimeZone("Asia/Tokyo") не работал в GWT 2.4

Однако я обнаружил, что могу получить зону Токио, используя настройки браузера по умолчанию:

Date d = new Date();
TimeZone timezone = TimeZone.createTimeZone(d.getTimezoneOffset());

Это действительно то, что Райли Ларк предлагает вам, так как europeLondon имеет & quot; std_offset & quot ;: 0 ...

TimeZone timezone = TimeZone.createTimeZone(0);

Смещение меняется в зависимости от даты. В результате вы можете получить неправильный часовой пояс.
0

TimeZone.createTimeZone("Europe/London");? По крайней мере, в более новых версиях GWT этот метод принимает целую кучу имен, явно подготовленных «из базы данных часовых поясов Олсона [sic]». В документации конкретно упоминается ваш вариант использования: передача часового пояса через json.

Увидетьфайл свойств - похоже, у него есть все стандартные названия часовых поясов.

Если это не для вас, вы можете передать смещение часового пояса в минутах, а затем создать свой часовой пояс сTimeZone.createTimeZone(offsetInMinutes).

Да, я не знаю, в какой версии он стал доступен. Может стоит попробовать ~
Я теперь обновил до GWT 2.4 (последняя версия) и линииcom.google.gwt.i18n.client.TimeZone.createTimeZone("Europe/London") все еще вылетает мой клиент GWT и документация гласит:com.google.gwt.i18n.client.TimeZone.createTimeZone(String tzJSON) а такжеThis factory method creates a time zone instance from a JSON string that contains the time zone information for desired time zone. Applications can get such a string from the TimeZoneConstants class johnvdenley
Я пробовал TimeZone.createTimeZone (& quot; Европа / Лондон & quot;); и это не работает на моей текущей версии GWT 2.2, но я отмечаю, что v2.4 доступен для обновления до, так что я мог попробовать это ... johnvdenley

Похожие вопросы