2017-03-11 18 views
2

特定のイベントの開始日を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

何かアドバイスを?

答えて

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')) ; 
} 
2

あなたはdate_default_timezone_set()関数が設定されている場合、これはそのタイムゾーンをロードするためにそれを使用しますnew DateTime() [PHP Docs]

にタイムゾーンに渡すことができます。

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'); 
}