Konwertowanie znaczników czasu na czas lokalny za pomocą date_l18n ()

15

Mam zadanie cron WordPress, które okresowo wysyła wiadomość e-mail i zapisuje znacznik czasu, gdy został wysłany jako opcja, i chciałbym wyświetlić datę na stronie ustawień. Coś w stylu „Ostatni e-mail został wysłany na„ x ””. Jestem na zachodnim wybrzeżu USA, więc nasz czas jest obecnie siedem godzin poza UTC.

Moje oczekiwane wyjście z date_i18n (), przekazując mu znacznik czasu, byłoby lokalnie sformatowaną datą z siedmiogodzinną korektą od UTC. Zwraca jednak czas w UTC. Nawet próba uzyskania bieżącego czasu nie zwraca tego, co moim zdaniem byłoby oczekiwanym rezultatem.

Na przykład: echo date_i18n('F d, Y H:i');wyniki 05 kwietnia 2013 11:36 zgodnie z oczekiwaniami, ale echo date_i18n('F d, Y H:i',time());wyniki 05 kwietnia 2013 18:36.

Czy to celowe? Jak mogę zwrócić lokalnie sformatowaną datę z wcześniej istniejącego znacznika czasu? Dziękuję za wszelką pomoc.

Andrew Bartel
źródło
Czy ustawiłeś strefę czasową w Ustawienia-> Ogólne?
vancoder
Tak, do Los Angeles.
Andrew Bartel,

Odpowiedzi:

31

Wiem, że spóźniłem się o trzy miesiące, ale funkcja, którą chcesz tutaj, to WordPress get_date_from_gmt().

Funkcja przyjmuje datę GMT / UTC w Y-m-d H:i:sformacie jako pierwszy parametr, a żądany format daty jako drugi parametr. Przekształci twoją datę w lokalną strefę czasową ustawioną na ekranie Ustawienia.

Przykładowe użycie:

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

John Blackbourn
źródło
2
Dzięki zabójcy, zobaczyłem to okienko w moich powiadomieniach właśnie teraz. Zmieniłem to na poprawną odpowiedź.
Andrew Bartel
1
Dodałem konfigurację daty i godziny: echo get_date_from_gmt ( date( 'Y-m-d H:i:s', $my_timestamp ), get_option('date_format') . ' - '. get_option('time_format') );
Nabil Kadimi
@NabilKadimi to świetny dodatek, ale wciąż nie tłumaczy łańcucha na właściwy język. Zobacz moją odpowiedź dotyczącą funkcji, która uwzględnia wszystkie trzy skonfigurowane języki, strefy czasowe i daty.
Flimm
5

Z kodeksu :

current_time („timestamp”) powinien być używany zamiast time (), aby zwrócić czas lokalny bloga. W WordPress funkcja PHP () zawsze zwraca UTC i jest taka sama jak wywołanie current_time ('timestamp', true).

Spróbuj tego:

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

Ustawia domyślną datę PHP na opcję timezone_string WP, jeśli jest dostępna, na czas trwania skryptu.

Vancoder
źródło
1
Tak, ale co, jeśli mam dowolny znacznik czasu? Powiedz kilka dni temu, jak uzyskać skorygowany czas zamiast czasu UTC?
Andrew Bartel,
czy date_i18n('F d, Y H:i', $your_timestamp)nie działa?
vancoder
Nie, nawet wypróbowałem go na waniliowej instalacji WP z 2012 r., Po prostu uruchamiając tę echo date_i18n('F d, Y H:i',1365194723)instrukcję na początku index.php, która daje mi czas UTC, a nie czas zachodniego wybrzeża USA.
Andrew Bartel,
Masz rację, wygląda na to, że date_i18n służy głównie do lokalnego formatowania dat, a nie do dostosowywania dat. Zaktualizowałem swoją odpowiedź.
vancoder
Tak, miałem nadzieję uniknąć ręcznego ustawiania strefy czasowej, ale jeśli to jedyny sposób, niech tak będzie. Oznaczono jako odebrane, dziękuję za pomoc.
Andrew Bartel,
2

date_i18n($format, $timestamp)formaty zgodne z ustawieniami regionalnymi, ale nie strefą czasową. get_date_from_gmt($datestring, $format)formaty zgodne ze strefą czasową, ale nie z ustawieniami regionalnymi. Aby uzyskać formatowanie według strefy czasowej i ustawień regionalnych, wykonuję następujące czynności:

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);
}

Przykładowy program:

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

Dane wyjściowe dla strefy czasowej Los Angeles:

Lokalny: 05 kwietnia 2013 11:36 UTC: 05 kwietnia 2013 18:36

Bibliografia:

antonakos
źródło
0

Dodaj przesunięcie strefy czasowej do znacznika czasu.

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

albo lepiej;

$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
źródło
0

Konwersja UTC na ciąg znaków w strefie czasowej, języku i formacie w opcjach WordPress

Stworzyłem dobrze dokumentującą funkcję, która konwertuje ciąg daty i godziny w UTC na ładny ciąg daty i godziny we właściwym języku, formacie i strefie czasowej. Skopiuj go.

Na przykład przekazanie "2019-05-30 18:06:01"(w UTC) wróci "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 );

}

Bibliografia:

Flimm
źródło
-1

To wydaje się działać na moim komputerze (żadne inne rzeczy nie działały):

$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');
}

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

Nie używa, date_l18n()ale myślę, że można go później wykorzystać ...

Nikt
źródło