Подтвердить что ты не робот

PHP - strtotime, укажите часовой пояс

У меня есть строка даты, скажем '2008-09-11'. Я хочу получить временную метку из этого, но мне нужно указать динамический динамик (а не PHP по умолчанию).

Итак, чтобы повторить, у меня две строки:

$dateStr = '2008-09-11';
$timezone = 'Americas/New_York';

Как мне получить временную метку для этого?

EDIT: время дня будет в полночь того дня.... $dateStr = '2008-09-11 00:00:00';

4b9b3361

Ответ 1

$date = new DateTime($dateStr, new DateTimeZone($timezone));

$timestamp = $date->format('U');

Ответ 2

Это будет работать, если по какой-либо причине вы используете < 5.2 (Запрет на Небеса).

$reset = date_default_timezone_get();
date_default_timezone_set('America/New_York');
$stamp = strtotime($dateStr);
date_default_timezone_set($reset);

Но ничего 5.2 и выше, я настоятельно рекомендую вам выбрать ответ @salathe.

Ответ 3

Принятый ответ велик, если вы используете PHP > 5.2 (я думаю, что в версии они добавили класс DateTime). Если вы хотите поддерживать более старую версию, вы не хотите вводить столько, или если вы просто предпочитаете функциональный подход, существует другой способ, который также не изменяет глобальные настройки:

$dateStr = '2008-09-11 00:00:00';
$timezone = 'America/New_York';
$dtUtcDate = strtotime($dateStr. ' '. $timezone);

Ответ 4

Если вы собираетесь использовать Timezones, я предлагаю вам использовать класс DateTime, и в этом случае функция DateTime:: createFromFormat(), которая позволит вам делать такие сеансы как:

$start = "2015-01-14 11:59:43";
$timezone = "America/Montreal";

$tz = new DateTimeZone($timezone);
$dt = DateTime::createFromFormat('Y-m-d H:i:s', $start, $tz);

Когда вы помещаете $tz в функцию DateTime:: createFromFormat, вы указываете, в каком часовом поясе дана дата, так что, когда вам нужно преобразовать ее в другой часовой пояс, все, что вам нужно сделать, это что-то вроде этого

$start = $dt->setTimeZone(new DateTimeZone('UTC'));

Ответ 5

Всякий раз, когда вы обращаетесь к точному моменту времени, сохраняйте время согласно унифицированному стандарту, на который не влияет дневная экономия. (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; см. ответ.

Если вы используете С++, обязательно используйте библиотеку, которая использует правильно реализует базу данных часовых поясов IANA. Они включают библиотеки cctz, ICU и Howard Hinnant "tz".

Не используйте Boost для преобразования часовых поясов. Хотя его API утверждает, что поддерживает стандартные идентификаторы IANA (aka "zoneinfo" ), он грубо отображает их на фиксированные смещения, не учитывая богатую историю изменений, которые каждая зона могла иметь.

(Кроме того, файл вышел из обслуживания.)

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

Помните, что временные зоны и смещения не являются фиксированными и могут меняться. Например, исторически США и Великобритания использовали те же даты, что и "spring вперед" и "отступать".

Однако в 2007 году США изменили даты, в которые часы были изменены. Это означает, что в течение 48 недель года разница между лондонским временем и временем в Нью-Йорке составляет 5 часов и 4 недели (3 в spring, 1 осенью) - 4 часа. Помните о таких элементах при любых вычислениях, которые включают несколько зон.

Рассмотрим тип времени (фактическое время события, время трансляции, относительное время, историческое время, повторяющееся время), какие элементы (временная метка, смещение часового пояса и имя часового пояса) необходимо сохранить для правильного поиска - см. "Типы Время" в ответ.

Сохраняйте синхронизацию файлов ОС, баз данных и приложений tzdata между собой и остальным миром.

На серверах установите аппаратные часы и часы ОС в UTC, а не в локальный часовой пояс.

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

Использовать службы NTP на всех серверах.

Если вы используете FAT32, помните, что метки времени хранятся в локальном режиме, а не в формате UTC.

Если речь идет о повторяющихся событиях (например, еженедельном телешоу), помните, что время изменяется с помощью DST и будет отличаться по часовым поясам.

Всегда запрашивайте значения даты и времени как включенные с нижней границей, исключая верхнюю границу ( > =, <).