我从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
关于如何处理时区并以更好的方式解决问题的任何建议?
答案 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' );
}