Zeitstempel mit date_l18n () in Ortszeit konvertieren

15

Ich habe einen WordPress-Cron-Job, der regelmäßig eine E-Mail sendet und den Zeitstempel speichert, als er als Option gesendet wurde, und ich möchte ein Datum auf einer Einstellungsseite anzeigen. So etwas wie "Die letzte E-Mail wurde am 'x' gesendet". Ich bin an der Westküste der USA, unsere Zeit ist also derzeit sieben Stunden vor UTC.

Meine erwartete Ausgabe von date_i18n (), die den Zeitstempel übergibt, wäre ein lokal formatiertes Datum mit einer siebenstündigen Anpassung von UTC. Es wird jedoch die Uhrzeit in UTC zurückgegeben. Selbst der Versuch, die aktuelle Zeit zu ermitteln, liefert nicht die erwartete Ausgabe.

Beispiel: echo date_i18n('F d, Y H:i');Gibt den 05. April 2013 um 11:36 Uhr wie erwartet aus, aber echo date_i18n('F d, Y H:i',time());den 05. April 2013 um 18:36 Uhr.

Ist das beabsichtigt? Wie kann ich ein lokal formatiertes Datum von einem bereits vorhandenen Zeitstempel zurückgeben? Vielen Dank für jede Hilfe.

Andrew Bartel
quelle
Haben Sie Ihre Zeitzone unter Einstellungen-> Allgemein eingestellt?
Vancoder
Ja nach los angeles
Andrew Bartel

Antworten:

31

Ich weiß, ich bin drei Monate zu spät, aber die Funktion, die Sie hier wollen, ist WordPress get_date_from_gmt().

Die Funktion akzeptiert ein GMT / UTC-Datum im Y-m-d H:i:sFormat als ersten Parameter und Ihr gewünschtes Datumsformat als zweiten Parameter. Das Datum wird in die lokale Zeitzone konvertiert, die auf dem Einstellungsbildschirm festgelegt wurde.

Anwendungsbeispiel:

echo get_date_from_gmt( date( 'Y-m-d H:i:s', $my_unix_timestamp ), 'F j, Y H:i:s' );

John Blackbourn
quelle
2
Mörder danke, sah dieses Popup in meinen Benachrichtigungen gerade jetzt. Ich habe es auf die richtige Antwort umgestellt.
Andrew Bartel
1
Ich habe die Datums- und echo get_date_from_gmt ( date( 'Y-m-d H:i:s', $my_timestamp ), get_option('date_format') . ' - '. get_option('time_format') );
Zeitkonfiguration
@NabilKadimi, das ist eine großartige Ergänzung, aber es übersetzt den String immer noch nicht in die richtige Sprache. In meiner Antwort finden Sie eine Funktion, die alle drei konfigurierten Sprachen, Zeitzonen und Datumsformate berücksichtigt.
Flimm
5

Aus dem Kodex :

current_time ('timestamp') sollte anstelle von time () verwendet werden, um die Ortszeit des Blogs zurückzugeben. In WordPress gibt PHPs time () immer UTC zurück und entspricht dem Aufruf von current_time ('timestamp', true).

Versuche dies:

define( 'MY_TIMEZONE', (get_option( 'timezone_string' ) ? get_option( 'timezone_string' ) : date_default_timezone_get() ) );
date_default_timezone_set( MY_TIMEZONE );
echo date_i18n('F d, Y H:i', 1365194723);

Dies setzt das PHP-Standarddatum für die Dauer des Skripts auf die Option timezone_string von WP, falls verfügbar.

Vancoder
quelle
1
Richtig, aber was ist, wenn ich einen beliebigen Zeitstempel habe? Sagen wir von vor ein paar Tagen, wie erhalte ich die eingestellte Zeit anstatt der UTC-Zeit?
Andrew Bartel
geht date_i18n('F d, Y H:i', $your_timestamp)nicht
Vancoder
Nein, ich habe es sogar bei einer Vanilla-WP-Installation versucht, bei der 2012 nur diese echo date_i18n('F d, Y H:i',1365194723)Anweisung oben in der Datei index.php ausgeführt wurde. Dadurch erhalte ich UTC-Zeit und keine Zeit an der Westküste der USA.
Andrew Bartel
Sie haben recht, es sieht so aus, als ob date_i18n hauptsächlich für die lokale Formatierung von Datumsangaben und nicht für die Datumsanpassung vorgesehen ist. Ich habe meine Antwort aktualisiert.
Vancoder
Ja, ich hatte gehofft, nicht die Zeitzone manuell einstellen zu müssen, aber wenn das der einzige Weg ist, soll es so sein. Als beantwortet markiert, danke für die Hilfe.
Andrew Bartel
2

date_i18n($format, $timestamp)Formate entsprechend dem Gebietsschema, aber nicht der Zeitzone. get_date_from_gmt($datestring, $format)Formate entsprechend der Zeitzone, aber nicht dem Gebietsschema. Um die Formatierung sowohl für die Zeitzone als auch für das Gebietsschema zu erhalten, gehe ich wie folgt vor:

function local_date_i18n($format, $timestamp) {
    $timezone_str = get_option('timezone_string') ?: 'UTC';
    $timezone = new \DateTimeZone($timezone_str);

    // The date in the local timezone.
    $date = new \DateTime(null, $timezone);
    $date->setTimestamp($timestamp);
    $date_str = $date->format('Y-m-d H:i:s');

    // Pretend the local date is UTC to get the timestamp
    // to pass to date_i18n().
    $utc_timezone = new \DateTimeZone('UTC');
    $utc_date = new \DateTime($date_str, $utc_timezone);
    $timestamp = $utc_date->getTimestamp();

    return date_i18n($format, $timestamp, true);
}

Beispielprogramm:

$format = 'F d, Y H:i';
$timestamp = 1365186960;
$local = local_date_i18n($format, $timestamp);
$gmt = date_i18n($format, $timestamp);
echo "Local: ", $local, " UTC: ", $gmt;

Ausgabe für die Zeitzone von Los Angeles:

Lokal: 05. April 2013, 11:36 Uhr UTC: 05. April 2013, 18:36 Uhr

Verweise:

Antonakos
quelle
0

Fügen Sie Ihrem Zeitstempel einen Zeitzonenversatz hinzu.

$offset = get_option( 'gmt_offset' ) * HOUR_IN_SECONDS;
return date_i18n( get_option( 'date_format' ), $ts + $offset );

oder besser;

$tz = new DateTimeZone( get_option( 'timezone_string' ) );
$offset_for_that_time = timezone_offset_get ( $tz , new DateTime("@{$ts}") );
return date_i18n ( get_option( 'date_format' ), $ts + offset_for_that_time );
ecabuk
quelle
0

Konvertieren von UTC in Zeichenfolge in Zeitzone, Sprache und Format in den Optionen von WordPress

Ich habe eine gut dokumentierte Funktion erstellt, die eine Datums- / Uhrzeitzeichenfolge in UTC in eine hübsche Datums- / Uhrzeitzeichenfolge in der richtigen Sprache, dem richtigen Format und der richtigen Zeitzone konvertiert. Fühlen Sie sich frei, es zu kopieren.

Zum Beispiel würde die Übergabe "2019-05-30 18:06:01"(in UTC) zurückkehren "Maggio 30, 2019 10:06 am".

/**
 * Given a string with the date and time in UTC, returns a pretty string in the
 * configured language, format and timezone in WordPress' options.
 *
 * @param string $utc_date_and_time 
 *      e.g: "2019-05-30 18:06:01"
 *      This argument must be in UTC.
 * @return string 
 *      e.g: "Maggio 30, 2019 10:06 am"
 *      This returns a pretty datetime string in the correct language and
 *      following the admin's settings.
 */
function pretty_utc_date( string $utc_date ): string {
    if (! preg_match( '/^\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d$/', $utc_date ) ) {
        /* I have not tested other formats, so only this one allowed. */
        throw new InvalidArgumentException( "Expected argument to be in YYYY-MM-DD hh:mm:ss format" );
    }

    $date_in_local_timezone = get_date_from_gmt( $utc_date );

    /* $date_in_local_timezone is now something like "2019-05-30 10:06:01"
     * in the timezone of get_option( 'timezone_string' ), configured in
     * WordPress' general settings in the backend user interface.
     */

    /* Unfortunately, we can't just pass this to WordPress' date_i18n, as that
     * expects the second argument to be the number of seconds since 1/Jan/1970
     * 00:00:00 in the timezone of get_option( 'timezone_string' ), which is not the
     * same as a UNIX epoch timestamp, which is the number of seconds since
     * 1/Jan/1970 00:00:00 GMT. */
    $seconds_since_local_1_jan_1970 =
        (new DateTime( $date_in_local_timezone, new DateTimeZone( 'UTC' ) ))
        ->getTimestamp();
    // e.g: 1559210761

    /* Administrators can set a preferred date format and a preferred time
     * format in WordPress' general settings in the backend user interface, we
     * need to retrieve that. */
    $settings_format = get_option( 'date_format' ) . ' '. get_option( 'time_format' );
    // $settings_format is in this example "F j, Y g:i a"

    /* In this example, the installation of WordPress has been set to Italian,
     * and the final result is "Maggio 30, 2019 10:06 am" */
    return date_i18n( $settings_format, $seconds_since_local_1_jan_1970 );

}

Verweise:

Flimm
quelle
-1

Das scheint auf meiner Maschine zu funktionieren (keines der anderen Dinge hat funktioniert):

$tz = new DateTimeZone(get_option('timezone_string'));
$dtz = new DateTimeZone('GMT');
foreach($posts as $key => $post){
    $gmt_date = DateTime::createFromFormat('Y-m-d H:i:s', $post->PostDateGMT, $dtz);
    $gmt_date->setTimeZone($tz);
    $posts[$key]->PostDateGMT = $gmt_date->format('Y-m-d H:i:s');
}

Originalcode: https://www.simonholywell.com/post/2013/12/convert-utc-to-local-time/

Es wird nicht verwendet, date_l18n()aber ich denke, man könnte es später verwenden ...

Niemand
quelle