我有日期转换问题:目标是确定图书的“按日期排序”,该日期应早于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;
}
答案 0 :(得分:0)
如果稍微简化一下流程,可能会更容易理解为什么我们得到某个日期。如果我正确理解该功能,则需要确定发布日期并对它做两件事:
如果我们以发布时区中的发布日期开始,则进行这些修改会更简单。
出于回答的目的,我以包含时间的格式返回结果,以便我们可以准确地看到这些修改将结果放在何处,但是您可以使用所需的任何格式。
<?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