У меня есть строка даты, например ' 2008-09-11
'. Я хочу получить временную метку из этого, но мне нужно указать динамический динамик (а не PHP по умолчанию).
Итак, чтобы повторить, у меня две строки:
$dateStr = '2008-09-11'; $timezone = 'Americas/New_York';
Как получить временную метку для этого?
EDIT: Время дня будет в полночь того дня …. $ dateStr = '2008-09-11 00:00:00';
$date = new DateTime($dateStr, new DateTimeZone($timezone));
$timestamp = $date->format('U');
Принятый ответ велик, если вы используете PHP> 5.2 (я думаю, что это версия, в которую они добавили класс DateTime). Если вы хотите поддерживать более старую версию, вы не хотите вводить столько, или если вы просто предпочитаете функциональный подход, существует другой способ, который также не изменяет глобальные настройки:
$dateStr = '2008-09-11 00:00:00'; $timezone = 'America/New_York'; $dtUtcDate = strtotime($dateStr. ' '. $timezone);
Это будет работать, если по какой-то причине вы используете <5.2 (Heaven forbid).
$reset = date_default_timezone_get(); date_default_timezone_set('America/New_York'); $stamp = strtotime($dateStr); date_default_timezone_set($reset);
Но ничего 5.2 и выше, я бы настоятельно рекомендовал вам выбрать ответ @ salathe.
Если вы собираетесь использовать Timezones, я предлагаю вам использовать класс DateTime, и в этом случае функция DateTime :: createFromFormat (), которая позволит вам выполнять такие сеансы:
$start = "2015-01-14 11:59:43"; $timezone = "America/Montreal"; $tz = new DateTimeZone($timezone); $dt = DateTime::createFromFormat('Ymd H:i:s', $start, $tz);
Когда вы помещаете $ tz в функцию DateTime :: createFromFormat, вы указываете, в каком часовом поясе дана дата, так что, когда вам нужно преобразовать ее в другой часовой пояс, вам нужно сделать что-то вроде этого:
$start = $dt->setTimeZone(new DateTimeZone('UTC'));
Всякий раз, когда вы ссылаетесь на точный момент времени, сохраняйте время в соответствии с единым стандартом, на который не влияет дневная экономия. (GMT и UTC эквивалентны в этом отношении, но предпочтительно использовать термин UTC. Обратите внимание, что UTC также известен как Zulu или Z time.)
Если вместо этого вы решите сохранить время с использованием местного значения времени, укажите местное смещение по времени от UTC, так что метка времени может быть позже интерпретирована однозначно.
В некоторых случаях вам может потребоваться сохранить время UTC и эквивалентное местное время. Часто это делается с двумя отдельными полями, но некоторые платформы поддерживают тип datetimeoffset, который может хранить оба в одном поле.
При сохранении временных меток в качестве числового значения используйте Unix time – количество целых секунд с 1970-01-01T00: 00: 00Z (исключая секунды прыжка). Если вам требуется более высокая точность, вместо этого используйте миллисекунды. Это значение всегда должно основываться на UTC без какой-либо регулировки часового пояса.
Если позже вам понадобится изменить временную метку, включите исходный идентификатор часового пояса, чтобы определить, может ли смещение быть изменено с записанного исходного значения.
При планировании будущих событий обычно предпочитается местное время вместо UTC, так как обычно смещение изменяется. См. Ответ и сообщение в блоге.
Помните, что смещения часовых поясов не всегда являются целым числом часов (например, индийское стандартное время – UTC + 05: 30, а Непал использует UTC + 05: 45).
Если вы используете Java, используйте java.time для Java 8 или используйте Joda Time для Java 7 или ниже. Если вы используете .NET, подумайте об использовании Noda Time. Если вы используете .NET без времени Noda, считайте, что DateTimeOffset часто является лучшим выбором, чем DateTime. Если вы используете Perl, используйте DateTime. Если вы используете Python, используйте pytz или dateutil. Если вы используете JavaScript, используйте moment.js с расширением момента времени. Если вы используете PHP> 5.2, используйте преобразования собственных часовых поясов, предоставляемые классами DateTime и DateTimeZone. Будьте осторожны при использовании.
DateTimeZone :: listAbbreviations () – см. Ответ. Чтобы поддерживать PHP в актуальных данных Olson, периодически устанавливайте пакет PECL timezonedb; см. ответ.
Если вы используете C ++, обязательно используйте библиотеку, которая использует правильно реализует базу данных часовых поясов IANA. К ним относятся cctz, ICU и библиотека «tz» Говарда Хиннанта.
Не используйте Boost для преобразования часовых поясов. Хотя его API утверждает, что поддерживает стандартные идентификаторы IANA (aka «zoneinfo»), он грубо отображает их на фиксированные смещения без учета богатой истории изменений, которые могут иметь каждая зона.
(Кроме того, файл вышел из обслуживания.)
Большинство бизнес-правил используют гражданское время, а не UTC или GMT. Поэтому планируйте преобразование временных меток UTC в локальный часовой пояс перед применением прикладной логики.
Помните, что временные зоны и смещения не являются фиксированными и могут меняться. Например, исторически США и Великобритания использовали те же даты, что и «весна вперед» и «отступать».
Однако в 2007 году США изменили даты, когда часы меняются. Это означает, что в течение 48 недель в году разница между лондонским временем и временем в Нью-Йорке составляет 5 часов и 4 недели (3 весной, 1 осенью) – 4 часа. Помните о таких элементах при любых вычислениях, которые включают несколько зон.
Рассмотрим тип времени (фактическое время события, время трансляции, относительное время, историческое время, повторяющееся время), какие элементы (временная метка, смещение часового пояса и имя часового пояса) необходимо сохранить для правильного поиска – см. «Типы времени» в ответ.
Храните файлы ОС, базы данных и приложений tzdata в синхронизации, между собой и остальным миром.
На серверах установите аппаратные часы и часы ОС на UTC, а не на локальный часовой пояс.
Независимо от предыдущей маркерной точки серверный код, включая веб-сайты, никогда не должен ожидать, что локальный часовой пояс сервера будет чем-то конкретным. см. ответ.
Используйте службы NTP на всех серверах.
Если вы используете FAT32, помните, что временные метки сохраняются в локальное время, а не в формате UTC.
Если вы имеете дело с повторяющимися событиями (например, еженедельным телешоу), помните, что время изменяется с помощью DST и будет отличаться по часовым поясам.
Всегда запрашивайте значения даты и времени как включенные в нижнюю границу, исключая верхнюю границу (> =, <).