使用date_l18n()将时间戳转换为本地时间


15

我有一个WordPress cron作业,该作业会定期发送电子邮件并保存作为选项发送时的时间戳,我想在设置页面上显示日期。诸如“最近的电子邮件是在'x'上发送的”之类的。我在美国西海岸,所以我们的时间目前比UTC少7个小时。

我从date_i18n()传递的时间戳的预期输出将是本地格式的日期,并且从UTC调整了七个小时。但是,它以UTC时间返回时间。即使尝试获取当前时间也不会返回我认为将是预期输出的结果。

例如:echo date_i18n('F d, Y H:i');输出预期的2013年4月5日11:36,但echo date_i18n('F d, Y H:i',time());输出输出2013年4月5日18:36。

这是故意的吗?如何从已有的时间戳返回本地格式的日期?谢谢你的帮助。


您是否在“设置”->“常规”中设置了时区?
vancoder 2013年

是的,去洛杉矶。
安德鲁·巴特尔

Answers:


31

我知道我要迟到三个月,但是您想要的功能是WordPress' get_date_from_gmt()

该函数接受GMT / UTC日期 Y-m-d H:i:s格式为作为第一个参数,并使用所需的日期格式作为第二个参数。它将日期转换为“设置”屏幕上设置的本地时区。

用法示例:

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


2
杀手谢谢,刚才在我的通知中看到了这个弹出窗口。我将其切换为正确答案。
Andrew Bartel

1
我添加了日期和时间配置: echo get_date_from_gmt ( date( 'Y-m-d H:i:s', $my_timestamp ), get_option('date_format') . ' - '. get_option('time_format') );
Nabil Kadimi 2014年

@NabilKadimi这是一个很好的添加,但它仍无法将字符串转换为正确的语言。请参阅我的答案,该函数将所有三种配置的语言,时区和日期格式都考虑在内。
Flimm

5

法典

应该使用current_time('timestamp')代替time()来返回博客的本地时间。在WordPress中,PHP的time()将始终返回UTC,与调用current_time('timestamp',true)相同。

尝试这个:

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

这将在脚本持续时间内将默认PHP日期设置为WP的timezone_string选项(如果可用)。


1
是的,但是如果我有一个任意的时间戳怎么办?从几天前说起,如何获得调整后的时间而不是UTC时间?
Andrew Bartel

不起作用date_i18n('F d, Y H:i', $your_timestamp)
vancoder

没错,甚至在2012年的普通WP安装上尝试过,仅echo date_i18n('F d, Y H:i',1365194723)在index.php顶部运行此语句,这给了我UTC时间而不是美国西海岸时间。
Andrew Bartel

没错,看来date_i18n主要用于日期的本地格式化,而不是日期调整。我已经更新了答案。
vancoder

是的,我希望避免手动设置时区,但是如果那是唯一的方法,那就这样吧。标记为已回答,谢谢您的帮助。
Andrew Bartel

2

date_i18n($format, $timestamp)格式取决于语言环境,而不是时区。get_date_from_gmt($datestring, $format)格式根据时区(而非地区)设置。为了同时根据时区语言环境进行格式化,我正在执行以下操作:

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

示例程序:

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

洛杉矶所在时区的输出:

本地:2013年4月5日11:36 UTC:2013年4月5日18:36

参考文献:


0

将时区偏移量添加到您的时间戳。

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

或更好;

$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

在WordPress选项中将UTC转换为时区,语言和格式的字符串

我创建了一个文档完善的函数,该函数将UTC中的日期时间字符串转换为正确语言,格式和时区的漂亮日期时间字符串。随时复制。

例如,传入"2019-05-30 18:06:01"(采用UTC格式)将返回"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 );

}

参考文献:


-1

这似乎在我的机器上可以正常工作(其他任何东西都无法正常工作):

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

原始代码:https : //www.simonholywell.com/post/2013/12/convert-utc-to-local-time/

它没有使用,date_l18n()但我想一个人以后可以使用它...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.