Формат даты PHP «I» для возврата DST всегда возвращает 0

У меня есть следующий код:

<?php
function dateIsDST ($timestamp=null, $timezone=null) {

    if (is_null($timestamp) && is_null($timezone)) {
        $date = new DateTime('@'.time());   
    }
    else {
        $date = new DateTime('@'.$timestamp, new DateTimeZone($timezone));
    }
    echo $date->format('Y-m-d H:i:sP');
    echo '---';
    // date("I") returns 1 in summer and 0 in winter
    var_dump ($date->format('I'));
}

dateIsDST(1648961437, 'America/New_York');
    
dateIsDST(1644861437, 'America/New_York');

Но всегда возвращает 0, когда он должен возвращать 1 (для первого вызова метода).

2022-08-08 12:23:57+00:00---string(1) "0" // should be 1
2022-02-14 17:57:17+00:00---string(1) "0"

Что я делаю не так:

Часовой пояс игнорируется, если параметр datetime является отметкой времени UNIX (см. php.net/manual/en/datetime.construct.php).

cOle2 28.03.2022 20:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
17
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы создаете экземпляр DateTime с отметкой времени, часовой пояс игнорируется. Исправление простое. Установите часовой пояс с помощью ->setTimeZone после создания экземпляра в вашей функции:

$date->setTimeZone(new DateTimeZone($timezone));

Результат:

2022-04-03 00:50:37-04:00---string(1) "1"
2022-02-14 12:57:17-05:00---string(1) "0"

Для справки см. Руководство PHP по DateTime::__construct:

The $timezone parameter and the current timezone are ignored when the $datetime parameter either is a UNIX timestamp (e.g. @946684800) or specifies a timezone (e.g. 2010-01-28T15:00:00+02:00).

Это происходит потому, что Временная метка Unix всегда в формате UTC -- и для целей синтаксического анализа DateTime это то же самое, что указание часового пояса в вашей строке времени (= аргумент TZ игнорируется).

Я помню, как сам наткнулся на это некоторое время назад, предполагая (кажется разумным?), что часовой пояс, который я явно установил, будет отменить независимо от того, что может быть объявлено (или подразумеваться) в строке, переданной конструктору DateTime. Увы нет, вместо этого он игнорируется.

Markus AO 28.03.2022 20:44

Другие вопросы по теме