操纵日期时间

时间:2017-03-11 04:03:04

标签: wordpress datetime

我从API获取特定事件的开始日期。响应是已知时区(UTC)中的字符串 - 与服务器的时区(GMT + 1)不同。这个日期肯定是将来的。

如果是'今天',我想显示活动开始的时间。 如果它明天开始,我想显示活动开始的日期和时间。但是机器人应该在服务器的时区。

我这样砍了它,但我发现它非常糟糕。

function manipulateEventDate($date)
{
    $now = new DateTime("now");
    $eventDate = new DateTime($date); // convert the string to DateTime
    $eventDate->modify('+ 1 hour'); // Manually convert it in the server's timezone

    if ($now->format('d') == $eventDate->format('d')) {
        return $eventDate->format('H:m');
    }

    return $eventDate->format('D H:i');
}

输出:

活动今天开始:18:00

将来的活动:Tue 11:00

关于如何处理时区并以更好的方式解决问题的任何建议?

2 个答案:

答案 0 :(得分:4)

在您的问题中,您说“......与服务器的时区不同”。如果您确实是指为服务器指定的时区,那么@BenCasey是正确的。

但是,我怀疑你的意思是“设置>常规>时区”中指定的时区(即WP站点的时区,而不是服务器的时区) 。如果是这种情况,那么你想要:

function
manipulateEventDate ($date)
{
    $siteTimezone = new DateTimeZone (get_option ('timezone_string')) ;

    $now = new DateTime ('now', $siteTimezone) ;
    $eventDate = new DateTime ($date, $siteTimezone) ;

    if ($now->format ('d') == $eventDate->format ('d')) {
        return ($eventDate->format ('H:m')) ;
        }

    return ($eventDate->format ('D H:i')) ;
}

答案 1 :(得分:2)

您可以将时区传递到new DateTime() [PHP Docs]

如果设置了date_default_timezone_set()函数,则会使用它来加载该时区。

function manipulateEventDate( $date ) {

    $dateTimezone = new DateTimeZone( date_default_timezone_get() );

    $now = new DateTime( "now" , $dateTimezone );
    $eventDate = new DateTime( $date , $dateTimezone );

    if ( $now->format( 'd' ) == $eventDate->format( 'd' ) ) {
        return $eventDate->format( 'H:m' );
    }

    return $eventDate->format( 'D H:i' );
}