wake-up-neo.net

Zeitstempel mit date_l18n () in Ortszeit konvertieren

Ich habe einen WordPress-Cron-Job, der regelmäßig eine E-Mail sendet und den Zeitstempel speichert, als er optional gesendet wurde, und ich möchte ein Datum auf einer Einstellungsseite anzeigen. So etwas wie "Die letzte E-Mail wurde am 'x' gesendet". Ich befinde mich 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 Uhrzeit 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 aus, echo date_i18n('F d, Y H:i',time()); gibt den 05. April 2013 um 18:36 Uhr aus.

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

14
Andrew Bartel

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:s-Format 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.

Beispielverwendung:

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

30
John Blackbourn

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 Standarddatum PHP für die Dauer des Skripts auf die Option timezone_string von WP, falls verfügbar.

4
vancoder

date_i18n($format, $timestamp) formatiert nach dem Gebietsschema, aber nicht nach der Zeitzone. get_date_from_gmt($datestring, $format) formatiert nach der Zeitzone, aber nicht nach dem Gebietsschema. Um die Formatierung nach der Zeitzone und 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:

1
antonakos

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 );
0
ecabuk

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 benutzt date_l18n() nicht, aber ich schätze, man könnte es später benutzen ...

0
NoOne

Konvertieren von UTC in Zeichenketten 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.

Wenn Sie beispielsweise "2019-05-30 18:06:01" (in UTC) übergeben, wird "Maggio 30, 2019 10:06 am" zurückgegeben.

/**
 * 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:

0
Flimm