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.
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' );
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.
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
DateTimeZone
docs in php.netDateTime
docs in php.net, einschließlich setTimestamp
, getTimestamp
und format
date_i18n
docsFü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 );
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 ...
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 );
}
get_date_from_gmt
docsDateTimeZone
docs in php.netDateTime
docs in php.net, einschließlich getTimestamp
date_i18n
docsdate_default_timezone_set( 'UTC' );
ausführt, unabhängig von der Zeitzone, die der Administrator auf der Benutzeroberfläche ausgewählt hat. Denken Sie also daran, wenn Sie das Verhalten der integrierten PHP Funktionen bestimmen. Siehe date_default_timezone_set
docs in php.net.