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

时间:2013-04-05 作者:Andrew Bartel

我有一个WordPress cron作业,它定期发送电子邮件,并在发送时保存时间戳作为选项,我想在设置页面上显示日期。类似于“最后一封电子邮件是在‘x’上发送的”。我在美国西海岸,所以我们的时间目前离UTC还有七个小时。

从date\\u i18n()传递时间戳时,我的预期输出将是一个本地格式的日期,从UTC开始调整7小时。但是,它以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。

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

6 个回复
最合适的回答,由SO网友:John Blackbourn 整理而成

我知道我迟到了三个月,但你想要的功能是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\' );

SO网友:vancoder

codex:

应使用current\\u time(\'timestamp\')代替time()返回博客的本地时间。在WordPress中,PHP的time()将始终返回UTC,与调用current\\u 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\\u string选项(如果可用)。

SO网友:antonakos

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

参考文献:

SO网友:Flimm

将UTC转换为WordPress选项中时区、语言和格式的字符串我创建了一个well document函数,它可以将UTC中的日期时间字符串转换为正确语言、格式和时区的漂亮日期时间字符串。请随意复制。

For example, passing in "2019-05-30 18:06:01" (in UTC) would return "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 );

}
参考文献:get_date_from_gmt docs
  • DateTimeZone docs 在php中。净值DateTime docs 在php中。净额,包括getTimestamp
  • WordPress\'date_i18n docsdate_default_timezone_set( \'UTC\' ); 无论管理员在用户界面中选择什么时区,因此在确定内置PHP函数的行为时都要记住这一点。看见date_default_timezone_set docs 在php中。净额
  • SO网友:ecabuk

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

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

    SO网友:NoOne

    这就是我的机器上似乎起作用的东西(其他东西都不起作用):

    $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() 但我想人们以后可以用它。。。

    结束

    相关推荐

    卸载插件中的.php文件以清除数据库

    我知道WordPress通过提供uninstall.php 钩您只需放置清理代码,它就会工作。但我的问题是,我已经看到了几个插件,它们使用的是插件文件中定义的函数uninstall.php 文件我的理解是,如果插件已经被禁用,并且用户正在删除它,那么这些功能可能无法访问。我的假设是否正确,或者是否有我不知道的WordPress魔术?