Chuyển đổi dấu thời gian sang giờ địa phương với date_l18n ()


15

Tôi đã có một công việc định kỳ WordPress gửi email định kỳ và lưu dấu thời gian khi nó được gửi dưới dạng tùy chọn và tôi muốn hiển thị một ngày trên trang cài đặt. Một cái gì đó như, "Email cuối cùng được gửi trên 'x'". Tôi đang ở bờ biển phía tây Hoa Kỳ, vì vậy thời gian của chúng tôi hiện tại là bảy giờ khỏi UTC.

Đầu ra dự kiến ​​của tôi từ date_i18n (), vượt qua dấu thời gian, sẽ là một ngày được định dạng cục bộ với điều chỉnh bảy giờ từ UTC. Tuy nhiên, nó trả về thời gian trong UTC. Ngay cả cố gắng để có được thời gian hiện tại không trả lại những gì tôi nghĩ sẽ là đầu ra mong đợi.

Ví dụ: echo date_i18n('F d, Y H:i');đầu ra ngày 05 tháng 4 năm 2013 11:36 như mong đợi, nhưng echo date_i18n('F d, Y H:i',time());đầu ra ngày 05 tháng 4 năm 2013 18:36.

Đây có phải là cố ý? Làm cách nào tôi có thể trả lại ngày được định dạng cục bộ từ dấu thời gian có sẵn? Cảm ơn vì bất kì sự giúp đỡ.


Bạn đã đặt múi giờ của mình trong Cài đặt-> Chung chưa?
vancoder

Vâng, đến Los Angeles.
Andrew Bartel

Câu trả lời:


31

Tôi biết tôi trễ ba tháng, nhưng chức năng bạn muốn ở đây là WordPress ' get_date_from_gmt().

Hàm chấp nhận ngày GMT / UTC ở Y-m-d H:i:sđịnh dạng làm tham số đầu tiên và định dạng ngày bạn muốn làm tham số thứ hai. Nó sẽ chuyển đổi ngày của bạn thành múi giờ địa phương như được đặt trên màn hình Cài đặt.

Ví dụ sử dụng:

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


2
Killer cảm ơn, đã thấy cửa sổ bật lên này trong thông báo của tôi vừa rồi. Tôi chuyển nó sang câu trả lời đúng.
Andrew Bartel 22/07/13

1
Tôi đã thêm cấu hình ngày và giờ: 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 đó là một bổ sung tuyệt vời, nhưng nó vẫn không dịch chuỗi sang ngôn ngữ chính xác. Xem câu trả lời của tôi cho một chức năng có tính đến cả ba ngôn ngữ, múi giờ và định dạng ngày được định cấu hình.
Flimm

5

Từ bộ :

current_time ('dấu thời gian') nên được sử dụng thay cho thời gian () để trả về giờ địa phương của blog. Trong WordPress, thời gian () của PHP sẽ luôn trả về UTC và giống như cách gọi current_time ('dấu thời gian', đúng).

Thử đi:

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

Điều này đặt ngày PHP mặc định thành tùy chọn timezone_ chuỗi của WP, nếu có, trong khoảng thời gian của tập lệnh.


1
Phải, nhưng nếu tôi có dấu thời gian tùy ý thì sao? Nói từ một vài ngày trước, làm thế nào để tôi có được thời gian điều chỉnh thay vì thời gian UTC?
Andrew Bartel

không date_i18n('F d, Y H:i', $your_timestamp)không hoạt động?
vancoder

Không, thậm chí đã thử nó trên bản cài đặt WP vanilla với năm 2012 chỉ chạy echo date_i18n('F d, Y H:i',1365194723)câu lệnh này ở đầu index.php, điều đó mang lại cho tôi UTC thay vì thời gian ở Bờ Tây Hoa Kỳ.
Andrew Bartel

Bạn nói đúng, có vẻ như date_i18n chủ yếu dành cho định dạng ngày cục bộ , thay vì điều chỉnh ngày. Tôi đã cập nhật câu trả lời của tôi.
vancoder

Phải, tôi đã hy vọng tránh phải đặt múi giờ theo cách thủ công, nhưng nếu đó là cách duy nhất, thì hãy làm như vậy. Đánh dấu là đã trả lời, cảm ơn sự giúp đỡ.
Andrew Bartel

2

date_i18n($format, $timestamp)định dạng theo miền địa phương, nhưng không phải múi giờ. get_date_from_gmt($datestring, $format)định dạng theo múi giờ, nhưng không phải miền địa phương. Để có được định dạng theo cả múi giờ miền địa phương, tôi đang làm như sau:

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

Chương trình ví dụ:

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

Đầu ra cho múi giờ của Los Angeles:

Địa phương: ngày 05 tháng 4 năm 2013 11:36 UTC: ngày 05 tháng 4 năm 2013 18:36

Người giới thiệu:


0

Thêm múi giờ bù vào dấu thời gian của bạn.

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

hoặc tốt hơn;

$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

Chuyển đổi UTC thành chuỗi theo múi giờ, ngôn ngữ và định dạng trong các tùy chọn của WordPress

Tôi đã tạo một hàm tài liệu tốt để chuyển đổi chuỗi thời gian ngày trong UTC thành chuỗi thời gian ngày đẹp theo đúng ngôn ngữ, định dạng và múi giờ. Hãy sao chép nó.

Ví dụ: truyền vào "2019-05-30 18:06:01"(trong UTC) sẽ trở lại "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 );

}

Người giới thiệu:


-1

Đây là những gì dường như hoạt động trên máy của tôi (không có công cụ nào khác hoạt động):

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

Mã gốc: https://www.simonholywell.com/post/2013/12/convert-utc-to-local-time/

Nó không sử dụng date_l18n()nhưng tôi đoán người ta có thể sử dụng nó sau này ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.