web-dev-qa-db-de.com

Wie konvertiere ich DateTime (), um die Zeit basierend auf der Zeitzoneneinstellung von WordPress anzuzeigen?

Ich muss die DateTime() von PHP verwenden. Derzeit wird die GMT-Zeit anstelle der Zeit angezeigt, die für die Zeitzoneneinstellung (EST) in WordPress Admin festgelegt wurde.

Wie kann dies konvertiert werden, um die Zeitbasis anzuzeigen?

$time = new DateTime();
echo $time->format("Y-m-d h:i:s");

// 2015-08-12 04:35:34 (gmt)
// 2015-08-12 12:35:34 (what i want -- EST)
5
user1462

Ich bin mir nicht sicher, warum die Antwort von EliasNS als richtig markiert ist. Soweit ich weiß (und aus der Dokumentation ), sollte der zweite Parameter von DateTime::__construct(), falls angegeben, eine DateTimeZone-Instanz sein.

Das Problem wird dann, wie wir eine DateTimeZone Instanz erstellen. Dies ist einfach, wenn der Benutzer eine Stadt als Zeitzone ausgewählt hat. Wir können dies jedoch umgehen, wenn er einen Versatz mithilfe der (veralteten) Etc/GMT-Zeitzonen festgelegt hat.

/**
 *  Returns the blog timezone
 *
 * Gets timezone settings from the db. If a timezone identifier is used just turns
 * it into a DateTimeZone. If an offset is used, it tries to find a suitable timezone.
 * If all else fails it uses UTC.
 *
 * @return DateTimeZone The blog timezone
 */
function wpse198435_get_blog_timezone() {

    $tzstring = get_option( 'timezone_string' );
    $offset   = get_option( 'gmt_offset' );

    //Manual offset...
    //@see http://us.php.net/manual/en/timezones.others.php
    //@see https://bugs.php.net/bug.php?id=45543
    //@see https://bugs.php.net/bug.php?id=45528
    //IANA timezone database that provides PHP's timezone support uses POSIX (i.e. reversed) style signs
    if( empty( $tzstring ) && 0 != $offset && floor( $offset ) == $offset ){
        $offset_st = $offset > 0 ? "-$offset" : '+'.absint( $offset );
        $tzstring  = 'Etc/GMT'.$offset_st;
    }

    //Issue with the timezone selected, set to 'UTC'
    if( empty( $tzstring ) ){
        $tzstring = 'UTC';
    }

    $timezone = new DateTimeZone( $tzstring );
    return $timezone; 
}

Dann können Sie es wie folgt verwenden:

$time = new DateTime( null, wpse198435_get_blog_timezone() );
8
Stephen Harris

Ich hatte in meiner Bibliothek eine Methode entwickelt, um die Zeitzone des aktuellen WP als korrektes Objekt abzurufen: WpDateTimeZone::getWpTimezone() .

Während timezone_string einfach ist (es ist bereits ein gültiger Zeitzonenname), ist die Groß-/Kleinschreibung von gmt_offset unangenehm. Das Beste, was ich mir vorstellen kann, ist, es in ein +00:00-Format zu konvertieren:

$offset  = get_option( 'gmt_offset' );
$hours   = (int) $offset;
$minutes = ( $offset - floor( $offset ) ) * 60;
$offset  = sprintf( '%+03d:%02d', $hours, $minutes )
3
Rarst

DateTime akzeptiert einen DateTimeZone-Parameter, den Sie aus den WordPress-Optionen erhalten können. So etwas wie:

$time = new DateTime(NULL, get_option('gmt_offset'));

Hoffe das hilft.

Edit: Ich teste es und bekomme eine Fehlermeldung. Ich kann den timezone string nicht in ein DateTimeZone-Objekt konvertieren, aber das ist der Weg.

0
EliasNS