PHP日期时区转换-天

时间:2019-02-25 18:15:36

标签: php datetime strtotime

我有日期转换问题:目标是确定图书的“按日期排序”,该日期应早于EST的图书“发行日期”之前13天。 “按日期排序”应显示13天的时间范围以及用户时间与EST(纽约)时间之间的任何时差。因此,在下面的函数中,我要获取发布日期,NYC时间,用户时间,并尝试执行order_by_date = release_date-((nyc /用户本地时间差)+ 13天)。它似乎正在运行,但是在使用多个发布日期进行测试之后,我始终返回14天的差异,而不是13天的差异。我的主要问题是,为什么下面的函数会输出14天的日期在发布日期之前而不是13天之前?我尝试回显每个时间变量,每个变量看起来都很正常(即对于纽约市的用户,时间差异为0,但对于PST上的某个人来说,则为3小时差异),我想知道格式是否对值有影响?感谢您的输入:

function get_order_by_date( ) {
        $release_date = '26-02-2019 00:00:00'
        $ny_timezone = new \DateTimeZone( 'America/New_York' );
        $gmt_timezone = new \DateTimeZone( 'GMT' );
        $user_date_time = new \DateTime( $release_date, $gmt_timezone );
        $offset = $ny_timezone->getOffset( $user_date_time );
        $my_interval = \DateInterval::createFromDateString( (string) $offset . 'seconds' );
        $user_date_time->add( $my_interval );
        $result = $user_date_time->format( 'd-m-Y H:i:s' );
        $order_by_date = date( 'F jS', strtotime( $result . ' - 13 days' ) );

        return $order_by_date;
    }

1 个答案:

答案 0 :(得分:0)

如果稍微简化一下流程,可能会更容易理解为什么我们得到某个日期。如果我正确理解该功能,则需要确定发布日期并对它做两件事:

  1. 提前13天上班
  2. 将其设置为用户的时区

如果我们以发布时区中的发布日期开始,则进行这些修改会更简单。

出于回答的目的,我以包含时间的格式返回结果,以便我们可以准确地看到这些修改将结果放在何处,但是您可以使用所需的任何格式。

<?php

function get_order_by_date(string $release_date, string $user_timezone)
{
    $release_timezone = new \DateTimeZone( 'America/New_York' );
    $user_timezone = new \DateTimeZone($user_timezone);

    // start with the release date in NY time
    $orderby_date = new \DateTime($release_date, $release_timezone);

    // 13 days prior
    $orderby_date->modify('-13 days');

    // shift to the user's timezone
    $orderby_date->setTimezone($user_timezone);

    return $orderby_date->format('Y-m-d H:i:s');
}

使用示例中的日期,将26-02-2019 00:00:00移到13天之前,就会得到13-02-2019 00:00:00

当时在纽约,在洛杉矶的时间要早​​三小时,所以结果会在前一天

echo get_order_by_date('26-02-2019 00:00:00', 'America/Los_Angeles');  // 2019-02-12 21:00:00

格林尼治标准时间将是五个小时之后,所以结果将在同一天

echo get_order_by_date('26-02-2019 00:00:00', 'GMT');  // 2019-02-13 05:00:00