Существует простое решение: сделайте контейнер с предварительным тегом.
<textarea id="watched_textarea" rows="10" cols="45">test </textarea>
<pre class="default prettyprint prettyprinted"><code ><span class="pln" id="output_div">fdfdf</span></code></pre>
<script>
$("#watched_textarea").keyup(function() {
$("#output_div").html($(this).val());
});
</script>
Как правило, включают смещение местного времени (включая смещение летнего времени) в сохраненные временные метки: одного UTC недостаточно, если позднее вы захотите отобразить временную метку в ее исходном часовом поясе (и настройку летнего времени).
Имейте в виду, что смещение не всегда является целым числом часов (например, индийское стандартное время UTC + 05: 30).
Например, подходящими форматами являются кортеж (время unix, смещение в минутах) или ISO 8601 .
Для PHP:
Класс DateTimeZone в PHP> 5.2 уже основан на базе данных Olson, которую упоминают другие, поэтому, если вы выполняете преобразование часовых поясов в PHP, а не в DB, вы освобождаетесь от работы с (трудными для понимания) файлами Олсона.
Однако PHP обновляется не так часто, как БД Olson, поэтому простое использование преобразования часовых поясов PHP может привести к устаревшей информации о летнем времени и повлиять на правильность ваших данных. Хотя это не ожидается часто, это может случиться, и произойдет, если у вас будет много пользователей по всему миру.
Чтобы справиться с вышеуказанной проблемой, используйте пакет timezonedb pecl , функция которого заключается в обновлении данных часового пояса PHP. Установите этот пакет так часто, как он обновляется. (Я не уверен, что обновления этих пакетов следуют точно за обновлениями Олсона, но, похоже, они обновляются с частотой, по крайней мере, очень близкой к обновлениям Олсона.)
Деловые правила всегда должны работать в гражданское время (если иное не предусмотрено законодательством). Имейте в виду, что гражданское время - это беспорядок, но люди его используют, поэтому это то, что важно.
Внутренне храните метки времени в формате гражданского времени-секунд-с-эпохи. Эпоха не имеет особого значения (я предпочитаю эпоху Unix ), но она делает вещи проще, чем альтернатива. Представьте, что дополнительных секунд не существует, если только вы не делаете то, что действительно в них нуждается (например, отслеживание спутников). Сопоставление между отметками времени и отображаемым временем - единственная точка, в которой должны применяться правила DST ; правила меняются часто (на глобальном уровне, несколько раз в год; виноваты политики), поэтому вам следует убедиться, что вы не жестко кодируете отображение. База данных Олсона TZ бесценна.
Если у вас есть системы баз данных, которые работают с активным летним временем, внимательно проверьте, нужно ли их отключать во время перехода осенью. Мэнди DBS (как и другие системы) не любит передавать одну и ту же точку (местного) времени дважды, что и происходит, когда осенью вы переводите часы вспять. SAP решила это с помощью (ИМХО, действительно изящного) обходного пути - вместо того, чтобы повернуть время вспять, они просто позволили внутренним часам работать с половинной скоростью в течение двух часов ...
Я обнаружил это на двух типах систем: «системы планирования смен (например, заводские рабочие)» и «системы управления, зависящие от газа)…
23- и 25-часовой рабочий день - это боль, с которой нужно справиться, так же как и 8-часовые смены, которые занимают 7 или 9 часов. Проблема в том, что вы обнаружите, что каждый клиент или даже отдел клиента имеют разные правила, которые они создали (часто без документирования) о том, что они делают в этих особых случаях.
Некоторые вопросы лучше не задавать клиентам до тех пор, пока они не оплатят ваше готовое программное обеспечение. Очень редко можно найти клиента, который задумывается об этом типе проблемы заранее при покупке программного обеспечения.
Я думаю, что во всех случаях вы должны записывать время в формате UTC и конвертировать в / из местного времени, прежде чем сохранять дату / время. Однако даже узнать, какой период времени у вас есть, может быть сложно с переходом на летнее время и часовыми поясами.
Сделайте:
datetimeoffset
, который может хранить оба поля в одном поле. 1970-01-01T00: 00: 00Z
(исключая дополнительные секунды). Если вам требуется более высокая точность, используйте вместо этого миллисекунды. Это значение всегда должно быть основано на всемирном координированном времени без какой-либо корректировки часового пояса. DateTimeOffset
часто является лучшим выбором, чем DateTime
. DateTime
и DateTimeZone
. Будьте осторожны при использовании DateTimeZone :: listAbbreviations ()
- см. Ответ . Чтобы поддерживать PHP в актуальном состоянии с данными Olson, периодически устанавливайте пакет PECL timezonedb ; см. Ответ . > =
, <
).Запрещено:
America / New_York
, со «смещением часового пояса», например -05: 00
. Это разные вещи. См. вики-страницу с тегами часовых поясов . Date
для вычисления даты и времени в старых веб-браузерах, так как ECMAScript 5.1 и ниже имеет конструктивный недостаток , который может неправильно использовать летнее время. (Это было исправлено в ECMAScript 6/2015). Тестирование:
Ссылка:
часовой пояс
в Stack Overflow dst
часовой пояс
Другое:
Пересечение границы «компьютерного времени» и «человеческого времени» "это кошмар. Главная из них заключается в том, что не существует какого-либо стандарта для правил, регулирующих часовые пояса и летнее время. Страны могут изменять свой часовой пояс и правила летнего времени в любое время, и они это делают.
Некоторые страны, например Израиль и Бразилия каждый год решают, когда переходить на летнее время, поэтому невозможно знать заранее, когда (если) будет действовать летнее время. У других есть фиксированные правила относительно того, когда действует летнее время. В других странах летнее время не используется.
Часовые пояса не обязательно должны отличаться от GMT на целый час. Непал +5,45. Есть даже часовые пояса +13. Это означает, что:
SUN 23:00 in Howland Island (-12)
MON 11:00 GMT
TUE 00:00 in Tonga (+13)
все в одно и то же время, но 3 разных дня!
Также нет четкого стандарта в отношении сокращений часовых поясов и того, как они меняются при переходе на летнее время, так что в итоге получаются такие вещи:
AST Arab Standard Time UTC+03
AST Arabian Standard Time UTC+04
AST Arabic Standard Time UTC+03
Лучший совет - как можно больше избегать местного времени и придерживаться в UTC, где можно. Переводите на местное время только в самый последний момент.
При тестировании убедитесь, что вы тестируете страны в Западном и Восточном полушариях, где летнее время уже выполняется или нет, а также страну, в которой летнее время не используется (всего 6).
Недавно у меня возникла проблема в веб-приложении, когда при Ajax post-back время даты, возвращаемое в мой код на стороне сервера, отличалось от времени даты, передаваемого наружу.
Скорее всего, это было связано с моим JavaScript-кодом на клиенте, который строил дату для отправки обратно клиенту в виде строки, потому что JavaScript корректировал часовой пояс и переход на летнее время, и в некоторых браузерах расчет времени перехода на летнее время отличался от других.
В итоге я решил полностью убрать вычисления даты и времени на клиенте, и отправлял на сервер целочисленный ключ, который затем переводился в дату и время на сервере, чтобы обеспечить последовательные преобразования.
Мой вывод из этого: Не используйте JavaScript-вычисления даты и времени в веб-приложениях, если это АБСОЛЮТНО не нужно.
Хотя я не пробовал, подход к настройке часового пояса, который я считаю убедительным, будет следующим:
Хранить все в формате UTC.
Создайте таблицу TZOffsets
с тремя столбцами: RegionClassId, StartDateTime и OffsetMinutes (int, в минутах).
Сохраните в таблице список дат и времени , когда местное время изменилось, и на сколько. Количество регионов в таблице и количество дат будет зависеть от того, какой диапазон дат и областей мира вам нужно поддерживать. Думайте об этом как о «исторической» дате, даже если даты должны включать будущее до некоторого практического предела.
Если вам нужно вычислить местное время для любого времени в формате UTC, просто сделайте следующее:
SELECT DATEADD('m', SUM(OffsetMinutes), @inputdatetime) AS LocalDateTime
FROM TZOffsets
WHERE StartDateTime <= @inputdatetime
AND RegionClassId = @RegionClassId;
Возможно, вы захотите кэшировать эту таблицу в своем приложении и использовать LINQ или другие подобные средства для выполнения запросов, а не обращения к базе данных.
Эти данные можно извлечь из общедоступной базы данных tz .
Преимущества и сноски этого подхода:
Единственным недостатком этого подхода или любого другого является то, что преобразования из местного времени в GMT не идеальны, поскольку любое изменение летнего времени, которое имеет отрицательное смещение относительно часов повторяет заданное местное время. Боюсь, что с этим нелегко справиться, и это одна из причин, по которой сохранение местного времени - это, в первую очередь, плохие новости.
Установите для ваших серверов значение UTC и убедитесь, что все они настроены. настроен для ntp или аналога.
UTC позволяет избежать проблем с переходом на летнее время, а рассинхронизация серверов может привести к непредсказуемым результатам, на диагностику которых потребуется время.
Вам необходимо знать о базе данных Olson tz, которая доступна по адресу ftp://elsie.nci.nih.gov/pub http://iana.org/time-zones/. Она обновляется несколько раз в год, чтобы учесть часто происходящие в последнюю минуту изменения в том, когда (и нужно ли) переходить на зимнее и летнее (стандартное и летнее) время в разных странах мира. В 2009 году последний выпуск был 2009s, в 2010 - 2010n, в 2011 - 2011n, в конце мая 2012 - 2012c. Обратите внимание, что существует набор кода для управления данными и сами данные о часовых поясах в двух отдельных архивах (tzcode20xxy.tar.gz и tzdata20xxy.tar.gz). И код, и данные находятся в общественном достоянии.
Это источник названий часовых поясов, таких как America/Los_Angeles (и синонимов, таких как US/Pacific).
Если вам нужно отслеживать различные зоны, то вам нужна база данных Olson. Как уже советовали другие, вы также хотите хранить данные в фиксированном формате - обычно выбирается UTC - вместе с записью о часовом поясе, в котором были получены данные. Возможно, вы захотите провести различие между смещением от UTC в то время и названием часового пояса; это может иметь значение позже. Кроме того, знание того, что сейчас 2010-03-28T23:47:00-07:00 (США/Тихий океан), может помочь или не помочь вам в интерпретации значения 2010-11-15T12:30 - которое предположительно указано в PST (Тихоокеанское стандартное время), а не PDT (Тихоокеанское летнее время).
Стандартные интерфейсы библиотеки C не слишком полезны для таких вещей.
Данные Olson переехали, отчасти потому, что A D Olson скоро уйдет на пенсию, а отчасти потому, что против сопровождающих был подан судебный иск (сейчас он отклонен) за нарушение авторских прав. База данных часовых поясов теперь управляется под эгидой IANA, Internet Assigned Numbers Authority, и на главной странице есть ссылка на 'Time Zone Database'. Список рассылки для обсуждения теперь tz@iana.org
; список объявлений - tz-announce@iana.org
.
Это важный и удивительно сложный вопрос. На самом деле не существует полностью удовлетворяющего стандарта для настойчивого времени. Например, стандарта SQL и формата ISO (ISO 8601) явно недостаточно.
С концептуальной точки зрения обычно имеют дело с двумя типами данных времени и даты, и их удобно различать (в приведенных выше стандартах нет): « физическое время » и « ] гражданское время ".
«Физический» момент времени - это точка на непрерывной универсальной временной шкале, с которой имеет дело физика (конечно, без учета теории относительности). Эта концепция может быть адекватно закодирована и сохранена, например, в формате UTC (если вы можете игнорировать дополнительные секунды).
«Гражданское» время - это спецификация datetime, которая соответствует гражданским нормам: момент времени здесь полностью определяется набором полей datetime (Y, M, D, H, MM, S, FS) плюс TZ ( спецификация часового пояса) (на самом деле также «календарь»; но давайте предположим, что мы ограничим обсуждение григорианским календарем). Часовой пояс и календарь совместно позволяют (в принципе) отображать одно представление в другое. Но гражданские и физические моменты времени представляют собой принципиально разные типы величин, и их следует концептуально разделять и трактовать по-разному (аналогия: массивы байтов и символьные строки).
Проблема сбивает с толку, потому что мы говорим об этих типах событий как синонимы, и потому что гражданские времена подвержены политическим изменениям. Проблема (и необходимость различать эти концепции) становится более очевидной для событий в будущем. Пример (взят из моего обсуждения здесь .
Джон записывает в своем календаре напоминание о каком-то событии в datetime
27 июля 2019 г., 10:30:00
, TZ = Чили / Сантьяго
, (со смещением GMT-4,
, следовательно, соответствует UTC 2019-июл-27 14:30:00
). Но когда-нибудь
в будущем страна решит изменить смещение TZ на GMT-5.
Теперь, когда наступит день ... должно ли это напоминание сработать в
A) 2019-июл-27 10:30:00 Чили / Сантьяго
= UTC-время 2019-июль -27 15:30:00
?
или
B) 27 июля 2019 г. 9:30:00 Чили / Сантьяго
= всемирное координированное время 27 июля 2019 г. 14:30:00
?
Нет правильного ответа, если никто не знает, что Джон концептуально имел в виду
, когда сказал календарю: «Пожалуйста, позвоните мне по телефону 2019-июл-27, 10 : 30: 00
TZ = Чили / Сантьяго
".
Имеет ли он в виду "гражданскую дату-время" ("когда часы в моем городе показывают 10:30")? В этом случае правильный ответ - A).
Или он имел в виду «физический момент времени», точку в непрерывной временной линии нашей Вселенной, скажем, «когда произойдет следующее солнечное затмение ». В таком случае ответ B) правильный.
Несколько API даты / времени правильно понимают это различие: среди них Jodatime , который является основой следующего (третьего!) Java DateTime API (JSR 310).
Я не уверен, что могу добавить к ответам выше, но вот несколько пунктов от меня:
Есть четыре различных времени, которые вы должны рассмотреть:
Существует также историческое/альтернативное время. Они раздражают тем, что могут не совпадать со стандартным временем. Например: юлианские даты, даты по лунному календарю на Сатурне, клингонский календарь.
Хранение временных меток начала/окончания в UTC работает хорошо. Для 1, вам нужно имя часового пояса события + смещение, хранящееся вместе с событием. Для 2, вам нужен идентификатор местного времени, хранящийся для каждого региона, и имя местного часового пояса + смещение, хранящееся для каждого зрителя (можно получить это из IP, если вы в затруднении). Для 3, храните в секундах UTC и нет необходимости в часовых поясах. 4 - это частный случай 1 или 2 в зависимости от того, глобальное это событие или локальное, но вам также нужно хранить временную метку created at, чтобы вы могли определить, изменилось ли определение часового пояса до или после создания этого события. Это необходимо, если вам нужно показать исторические данные.
Примером может быть:
Финальная игра чемпионата мира по футболу состоялся в Южной Африке (UTC+2--SAST) 11 июля 2010 года в 19:00 UTC.
Имея эту информацию, мы можем исторически определить точное время проведения финала WCS 2010, даже если определение часового пояса Южной Африки изменится, и иметь возможность отобразить его зрителям в их местном часовом поясе в момент запроса к базе данных.
Вам также необходимо поддерживать синхронизацию файлов tzdata вашей ОС, базы данных и приложений, как друг с другом, так и с остальным миром, и проводить обширное тестирование при обновлении. Не редки случаи, когда сторонние приложения, от которых вы зависите, неправильно обрабатывают изменения TZ.
Убедитесь, что аппаратные часы настроены на UTC, а если вы используете серверы по всему миру, убедитесь, что их ОС также настроены на использование UTC. Это становится очевидным, когда вам нужно скопировать ежечасно вращающиеся файлы журналов apache с серверов в нескольких часовых поясах. Сортировка по имени файла работает только в том случае, если все файлы названы в одном часовом поясе. Это также означает, что вам не нужно вычислять даты в голове, когда вы переходите по ssh с одного сервера на другой и вам нужно сравнить временные метки.
Также запустите ntpd на всех компьютерах.
Никогда не доверяйте метке времени, полученной с клиентской машины. Например, HTTP-заголовкам Date: или вызову javascript Date.getTime()
. Это хорошо, когда используется в качестве непрозрачных идентификаторов, или при подсчете даты во время одного сеанса на одном клиенте, но не пытайтесь сопоставить эти значения с тем, что у вас есть на сервере. Ваши клиенты не используют NTP, и у них не обязательно есть рабочая батарейка для часов BIOS.
Наконец, правительства иногда делают очень странные вещи:
Стандартное время в Нидерландах было ровно на 19 минут и 32,13 секунды опережало UTC по закону с 1909-05-01 гг. по 1937-06-30. Этот часовой пояс не может быть точно представлен с помощью формат ЧЧ:ММ.
Хорошо, думаю, я закончил.
Четкое архитектурное разделение проблем - чтобы точно знать, какой уровень взаимодействует с пользователями и должен изменить дату и время для / от канонического представления (UTC). Дата-время, отличное от UTC, представляет собой представление (соответствует часовому поясу пользователя), Время UTC является моделью (остается уникальным для внутреннего и среднего уровней).
Кроме того, решает, какова ваша настоящая аудитория, что вам не нужно обслуживать и где вы проводите черту . Не трогайте экзотические календари, если у вас нет важных клиентов, а затем подумайте об отдельных серверах, ориентированных на пользователя, только для этого региона.
Если вы можете получить и сохранить местоположение пользователя, используйте местоположение для систематического преобразования даты и времени (например, культура .NET или таблица SQL), но предоставьте конечному пользователю возможность выбирать переопределения, если дата-время критична для ваших пользователей. .
Если есть исторические аудиторские обязательства (например, указать, когда именно Джо из Аризоны оплатила счет 2 года назад в сентябре) , то сохраните как UTC, так и местное время для записи (ваши таблицы преобразования со временем изменится).
Определите часовой пояс с привязкой ко времени для данных, которые поступают массово - например, файлов, веб-сервисов и т. Д. Скажем, у компании Восточного побережья есть центр обработки данных в ЦС - вам нужно спросить и знать, что они используют в качестве стандарта вместо предполагая одно или другое.
Не доверяйте смещениям часовых поясов, встроенным в текстовое представление даты и времени, а не соглашайтесь анализировать и следовать им. Вместо этого всегда запрашивайте, чтобы часовой пояс и / или эталонная зона были явно определены .Вы можете легко получить время со смещением PST, но на самом деле время является EST, поскольку это ссылочное время клиента, а записи были только что экспортированы на сервер, который находится в PST.
Будьте осторожны при работе с отметками времени, хранящимися в файловой системе FAT32 - они всегда сохраняются в координатах местного времени (включая DST - см. статью msdn ). Сгорел на этом.
Еще одна вещь: убедитесь, что на серверах установлено последнее обновление для перехода на летнее время.
В прошлом году у нас была ситуация, когда наше время постоянно отставало на один час в течение трехнедельного периода для североамериканских пользователей, даже несмотря на то, что мы использовали систему на основе всемирного координированного времени.
Оказывается, в конце концов это были серверы. Им просто нужно было установить последний патч ( Windows Server 2003 ).