it-swarm.com.de

Warum zeigen Zeitfunktionen bei Verwendung des Zeitformats 'c' eine ungültige Zeitzone an?

Dies sind die Funktionen, die ich in meinem Thema verwende, um das "Eintrags-Meta" anzuzeigen, das veröffentlicht und zuletzt geändert Datumsangaben (unter anderem) eines Artikels enthält:

// Shows Author and Published Date
if ( ! function_exists( 'reddle_posted_on' ) ) :
function reddle_posted_on() {
    printf( __( '<span class="byline">Posted by <span class="author vcard"><a class="url fn n" href="%5$s" title="%6$s" rel="author">%7$s</a></span></span><span class="sep"> &mdash; </span><span class="entry-date"><time datetime="%3$s" pubdate>%4$s</time></span>', 'reddle' ),
        esc_url( get_permalink() ),
        esc_attr( get_the_time() ),
        esc_attr( get_the_date( 'c' ) ),
        esc_html( get_the_date() ),
        esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ),
        sprintf( esc_attr__( 'View all posts by %s', 'the-wolf' ), get_the_author() ),
        esc_html( get_the_author() )
    );
}
endif;

// Shows Last Modified Date
if ( ! function_exists( 'reddle_last_modified_on' ) ) :
function reddle_last_modified_on() {
    printf( __( 'Last updated on <time class="updated" itemprop="dateModified" datetime="%2$s">%3$s</time>', 'reddle' ),
        esc_attr( get_the_modified_time() ),
        esc_attr( get_the_modified_date( 'c' ) ),
        esc_html( get_the_modified_date( 'F j, Y ~ H:i' ) )
    );
}
endif;

Sehen Sie etwas falsch mit diesen Funktionen? Das Problem ist, trotz der Einstellung der Zeitzone meines Blogs auf GMT-05:00 (-04: 00 DST) in WordPress Dashboard> Einstellungen> Allgemein der ausgegebene Zeitstempel zeigt GMT+00:00. Irgendeine Idee warum?

3
its_me

Das Problem ist, dass WP für eine korrekte Ausgabe das Datum mit date_i18n() function verarbeiten muss. Wenn Sie das Datumsformat verwenden, ist fest codiert in PHP Code (nicht einfach gespeichert in PHP DATE_* Konstante) wie 'c' - für Ihren Code nicht verfügbar und daher für WP zu verarbeiten.

Systemweites Update wäre, das Datum mit einem analogen Format erneut zu verarbeiten, auf das can mit dem WP Code zugegriffen werden kann:

add_filter( 'date_i18n', 'fix_c_time_format', 10, 4 );

function fix_c_time_format( $date, $format, $timestamp, $gmt ) {

    if ( 'c' == $format )
        $date = date_i18n( DATE_ISO8601, $timestamp, $gmt );

    return $date;
}
4
Rarst

WordPress setzt die Zeitzone des Servers in PHP automatisch auf GMT. Dies dient dazu, Datumsmanipulationen konsistent zu machen - und kann bei Änderungen zu Fehlern führen.

Dies bedeutet, dass native Funktionen wie date jedes Datum im GMT- (oder UTC-) Format interpretieren. Ebenso ist die Zeitzone für DateTime Objekte UTC.

Sie sollten dies nicht wirklich ändern, da dies unbeabsichtigte Folgen haben kann.

Das Problem

Das Problem bei der Verwendung von "say get_the_modified_date( 'c' )" besteht darin, dass das Datum und die Uhrzeit (say 2012-06-14 11:55:00) auf das Änderungsdatum in der Zeitzone des Blogs verweisen. Wenn das Datum mit 'c' formatiert wird, wird davon ausgegangen, dass die obige Datums- und Uhrzeitangabe in der UTC-Zeitzone liegt.

Wenn Sie ein Format verwenden, das (im Gegensatz zu 'c') die Zeitzone nicht enthält, sollten Sie in Ordnung sein. (Ein Unix-Zeitstempel verweist übrigens implizit auf eine Zeitzone).

So zeigen Sie Termine in WordPress an

Es wird empfohlen, alle Daten in der UTC-Zeitzone zu behandeln und sie dann nur beim Anzeigen in Ihre lokale Zeitzone zu konvertieren.

Die Lösung

get_the_modified_date( 'c', true ) stellt stattdessen sicher, dass das Datum und die Uhrzeit tatsächlich dem Datum entsprechen, das in der GMT-Zeitzone (UTC) geändert wurde. Wenn es nun mit 'c' gebildet wird, wird wieder (aber jetzt richtig) angenommen, dass die Datums- und Uhrzeitangabe in der UTC-Zeitzone liegt.

Verwenden einer anderen Zeitzone

Sie können die Zeitzone von PHP auf die Zeitzone Ihres Blogs einstellen und dann wieder zurückschalten. Aber das ist nicht so toll. Verwenden Sie stattdessen das Objekt DateTime von PHP. Für ein PHP datetime-Objekt ist die Zeitzone auf UTC eingestellt. Dies kann jedoch bei der Konstruktion des Objekts explizit außer Kraft gesetzt werden:

$timestamp = get_the_modified_date( 'u', true );

//Correct date-time object in UTC
$date_obj = new DateTime("@$timestamp"); 

//Displays 2012-06-14T14:32:11-00:00
echo $date_obj->format('c');

//Correct date-time object now in America/New_York timezone
$date_obj->setTimezone(new DateTimeZone('America/New_York'));

//Displays 2012-06-14T10:32:11-04:00
echo $date_obj->format('c');

Wenn Sie nach dem PHP DateTimeZone-Objekt in der Zeitzone Ihres Blogs suchen, sehen Sie sich diese Übersicht an: https://Gist.github.com/2724520

2
Stephen Harris