PHP日期时区转换 - 天

问题描述 投票:0回答:1

我有日期转换问题:目标是确定一本书的“按日期排序”,这应该是本书“发布日期”之前13天,即EST。 “按日期排序”应显示13天的时间范围加上用户时间与EST(纽约)时间之间的任何时间差异。所以在我的下面的函数中,我得到发布日期,纽约时间,用户的时间并尝试执行order_by_date = release_date - ((nyc / user local time diff)+ 13天)。它似乎工作正常,但经过多次发布日期的测试后,我一直返回14天的差异,而不是13天的...我的主要问题是为什么下面的函数会输出14天的日期在发布日期之前而不是13天?我已经尝试回应每个时间变量并且每个变量看起来正常(即对于NYC中的用户,时间差异为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;
    }
php datetime strtotime
1个回答
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-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
© www.soinside.com 2019 - 2024. All rights reserved.