Использование часового пояса, отличного от зоны браузера в Javascript - PullRequest
4 голосов
/ 24 июня 2010

У меня есть страница, которая позволяет пользователю просматривать и редактировать время (с датами), хранящееся в базе данных.Время хранится в базе данных в формате UTC и привязывается к местоположению с другим часовым поясом.Когда пользователь просматривает время, которое они показывают в прикрепленном часовом поясе и не обязательно часовом поясе браузера.Затем пользователь должен иметь возможность отредактировать время и сделать запрос AJAX.Мне нужно иметь возможность преобразовывать введенное время из произвольного часового пояса в UTC в javascript, но единственное, что позволяет javascript для преобразования, это из часового пояса браузера в UTC.Передача абсолютного смещения в javascript не сработает, потому что пользователь должен иметь возможность редактировать время до или после перехода на летнее время.Похоже, что это должна быть проблема, которая была решена раньше ... какие-либо указатели?

Ответы [ 3 ]

3 голосов
/ 24 июня 2010

Это очень неприятная проблема.Пока пользователь представлен в своем часовом поясе (или в GMT), у вас не будет проблем.Но просить JS предоставить точные локальные значения летнего времени для разных языков - это неприятно.Браузер знает время по Гринвичу и местное время и (благодаря ОС) он также знает, когда DST запускается локально.Но, не изменяя информацию о часовом поясе системы пользователя, JS не может определить, когда DST вступает в действие в другой локали.Правила вступления в силу ТЛЧ отличаются не только от страны к стране, дата может неожиданно измениться со временем (помните, когда страны Северной Америки недавно перенесли даты ТЛЧ?).Скорее всего, вы можете довольно легко выяснить локаль DST на вашем сервере и сообщить об этом браузеру.Но, вероятно, не практично пытаться сделать это полностью в браузере.В вашем приложении может быть своего рода массив DST_changeover_by_locale, но вам нужно будет периодически обновлять его.

[РЕДАКТИРОВАТЬ] Кажется, есть некоторая путаница о том, как объект JS Date работает в отношении часовых поясов.Вот несколько полезных моментов:

Смещения часовых поясов

// Create a time in winter (Standard time)
dt = new Date('Jan 1 2010 12:00:00 GMT-0000'); 
alert(dt.getTimezoneOffset()); 
// In Japan right now, users would see "-540"
// In New York right now, users would see "300"

// Create a time in summer (DST)
dt = new Date('Jul 1 2010 12:00:00 GMT-0000'); 
alert(dt.getTimezoneOffset()); 
// In Japan right now, users would see "-540"
// In New York right now, users would see "240"
// NOTE: Japan has no DST while NY does

Разбор дат по местному времени

// The following will all return the same time string, which will be 
// the time according to the user's OS time settings and locale
alert((new Date('Jun 25 2010 13:30:00 GMT-0230'))); // Newfoundland time
alert((new Date('Jun 25 2010 13:00:00 GMT-0300'))); // Atlantic time
alert((new Date('Jun 25 2010 12:00:00 GMT-0400'))); // Eastern time
alert((new Date('Jun 25 2010 11:00:00 GMT-0500'))); // Central time
alert((new Date('Jun 25 2010 10:00:00 GMT-0600'))); // Mountain time
alert((new Date('Jun 25 2010 9:00:00 GMT-0700'))); // Pacific time

Отметки времени

// If you don't want to work with strings, use numbers instead. 
// These return the JS timestamp for the same values above. 
// The value is a *delta*, so it is unaffected by DST.
alert((new Date('Jun 25 2010 13:30:00 GMT-0230')).getTime()); // Newfoundland time
alert((new Date('Jun 25 2010 13:00:00 GMT-0300')).getTime()); // Atlantic time
alert((new Date('Jun 25 2010 12:00:00 GMT-0400')).getTime()); // Eastern time
alert((new Date('Jun 25 2010 11:00:00 GMT-0500')).getTime()); // Central time
alert((new Date('Jun 25 2010 10:00:00 GMT-0600')).getTime()); // Mountain time
alert((new Date('Jun 25 2010 9:00:00 GMT-0700')).getTime()); // Pacific time
0 голосов
/ 24 июня 2010

Не уверен, стоит ли указывать это в качестве ответа, но я не могу оставить комментарий, поскольку я не связывал временную учетную запись с этим идентификатором ...

К сожалению, похоже, что выполняется на стороне сервера вычисления часового пояса.это единственный чистый способ сделать это, однако я все еще надеюсь, что у кого-то может быть другое решение.По соглашению в этом коде все времена должны отправляться в UTC, и я хотел бы избежать нарушения этого соглашения (и, если это возможно, запутать в других местах, мы могли бы использовать сервисный вызов), если это возможно.

0 голосов
/ 24 июня 2010

Я не думаю, что вам нужно конвертировать часовой пояс в браузере.Вы можете просто отобразить «непрозрачное» время даты на клиенте, позволить ему изменить его, а затем отправить на сервер, чтобы преобразовать его в UTC, при необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...