最新消息:20210917 已从crifan.com换到crifan.org

【已解决】调试并解决Evernote-sync的wordpress帖子发布时间差8小时的bug

WordPress crifan 2192浏览 0评论

折腾:

【已解决】调试Wordpress插件Evernote sync

后,接着去解决之前就存在的bug。

同步过来的帖子的时间差了8个小时的东八区的时差:

原帖子:

同步过来就差了8小时:

所以要去找到并解决这个bug。

此处是,当选择了 

发布时间:使用Evernote的创建时间

则代码中会调用:

// 追加发布时间
if (get_option(‘evernotesync_publish_time’) == 2) {
    $my_post[‘post_date’] = date(“Y-m-d h:i:s”, $noteCreated / 1000);
}

把对应的时间戳:

1457006257000毫秒

=1457006257秒

=2016/3/3 19:57:37

而代码中的date转换为:

2016-03-03 11:57:37

所以差了8小时,主要是date转换时,没有采用GMT标准时间

php 时间戳 转换 gmt

PHP中关于时间(戳)、时区、本地时间、UTC时间等的梳理_唐霜

PHP中将Unix timestamp时间戳转换成北京时间 – TypeCodes

PHP时间转换–最全UTC GMT 时区 时间戳_senlin_新浪博客

php时间函数time()、date()、mktime()、strtotime()、date_… – Minho

都要手动加上8小时或8*3600,很不智能。

php timestamp to gmt date

PHP: gmdate – Manual

结果换成gmdate后:

$my_post[‘post_date’] = gmdate(“Y-m-d h:i:s”, $noteCreated / 1000);

竟然结果还是之前的差了8小时的时间:

看了很多帖子,小时都是大写的H

所以去改为大写的H试试:

$my_post[‘post_date’] = gmdate(“Y-m-d H:i:s”, $noteCreated / 1000);

结果:问题依旧。

后来去参考:

PHP: date – Manual

去试了试:

<?php
// first line of PHP
$defaultTimeZone=’UTC’;
$currentTimezone = date_default_timezone_get(); //Europe/Berlin
if($currentTimezone != $defaultTimeZone) {
    date_default_timezone_set($defaultTimeZone);
}
//// somewhere in the code
//function _date($format=”r”, $timestamp=false, $timezone=false)
//{
//    $userTimezone = new DateTimeZone(!empty($timezone) ? $timezone : ‘GMT’);
//    $gmtTimezone = new DateTimeZone(‘GMT’);
//    $myDateTime = new DateTime(($timestamp!=false?date(“r”,(int)$timestamp):date(“r”)), $gmtTimezone);
//    $offset = $userTimezone->getOffset($myDateTime);
//    return date($format, ($timestamp!=false?(int)$timestamp:$myDateTime->format(‘U’)) + $offset);
//}
$noteCreatedTimestampMs = 1457006257000;
$noteCreatedTimetamp = $noteCreatedTimestampMs / 1000;
//$post_date = gmdate(“Y-m-d\TH:i:s\Z”, $noteCreatedTimetamp);
//$post_date = _date(“Y-m-d H:i:s”, $noteCreatedTimetamp);
$post_date = date(“Y-m-d H:i:s”, $noteCreatedTimetamp);
$post_gmt_date = gmdate(“Y-m-d H:i:s”, $noteCreatedTimetamp);
echo $post_date, $post_gmt_date;
?>

结果:

设置了时区了,竟然还是

2016-03-03 11:57:37

而不是我希望的

2016-03-03 19:57:37

后来去找找国外的再现时间戳转换:

4WebHelp – Online Tools: Unix Timestamp Converter

果然是:

4WebHelp – Online Tools: Unix Timestamp Converter

Online Conversion – Unix time conversion

-》

  • 1457006257

    • GMT时间:2016-03-03 11:57:37

    • GMT+8时间:2016-03-03 19:57:37

所以是:

我们此处的时区获取的有问题,导致时间转换出错

所以去强制设置时区为东八区的上海试试

先去找上海的timezone的写法:

PHP: date_default_timezone_get – Manual

->

PHP: 运行时配置 – Manual

->

PHP: 所支持的时区列表 – Manual

->

PHP: 亚洲 – Manual

Asia/Shanghai

然后用:

$shanghaiTimezone = “Asia/Shanghai”;
date_default_timezone_set($shanghaiTimezone);
$currentTimezone2 = date_default_timezone_get(); //Asia/Shanghai
echo $currentTimezone2.”<br/>”;
$noteCreatedTimestampMs = 1457006257000;
$noteCreatedTimetamp = $noteCreatedTimestampMs / 1000;
$post_date = date(“Y-m-d H:i:s”, $noteCreatedTimetamp); //2016-03-03 19:57:37
$post_gmt_date = gmdate(“Y-m-d H:i:s”, $noteCreatedTimetamp); //2016-03-03 11:57:37
echo $post_date.”<br/>”.$post_gmt_date.”<br/>”;

是可以输出要的内容了:

但是:

想要去找找看,是否是在新建post时传递post_date不是字符串,而是timestamp

wordpress wp_insert_post

wp_insert_post() | Function | WordPress Developer Resources

post_date:只接受字符串,不接受timestamp的数值

但是看到了个:post_date_gmt

-》那试试,只传递post_date_gmt,不传post_date,看看发布后的帖子中,是否可以正常解析出本地GMT+8的时间

代码改为:

$my_post[‘post_date_gmt’] = gmdate(“Y-m-d h:i:s”, $noteCreated / 1000);

调试的效果:

gmt的时间戳的,格式化后是gmt的时间

对应的,发布到wordpress中之后

时间就是GMT+8的时区了:

和原始的帖子的时间就一致了:

所以此处终于是:

【总结】

由于此处(MAMP中wordpress环境)默认时区不是(Asia/Shanghai的)GMT+8

(而是:Europe/Berlin -》 好像是GMT+1 )

从而导致通过date或gmdate得到时间都不是我们想要的+8后的时间

而前面的测试代码中,手动设置了时区为UTC -》 GMT标准时间

导致date和gmdate输出的时间都是GMT标准时间了

所以,此处想要wordpress中post的帖子时间,是本地的GMT+8的时间,有两种方式:

(1)在使用date获得当地时间之前,确保服务器的时区是自己要的时区

$shanghaiTimezone = “Asia/Shanghai”;
date_default_timezone_set($shanghaiTimezone);
$currentTimezone2 = date_default_timezone_get(); //Asia/Shanghai
echo $currentTimezone2.”<br/>”;

然后再去用date,即可得到自己要的,+8小时后的时间:

$noteCreatedTimestampMs = 1457006257000;
$noteCreatedTimetamp = $noteCreatedTimestampMs / 1000;
$post_date = date(“Y-m-d H:i:s”, $noteCreatedTimetamp); //2016-03-03 19:57:37

然后设置给post_date即可:

$my_post[‘post_date’] = date(“Y-m-d h:i:s”, $noteCreated / 1000);

注:

对应着gmt标准时间是:

$post_gmt_date = gmdate(“Y-m-d H:i:s”, $noteCreatedTimetamp); //2016-03-03 11:57:37

注:

此处的代码中通过

date_default_timezone_get()

得到的时区,是服务器的时区

和Wordpress中的后台管理页面-》常规 中的 时区

(此处已经设置了 GMT+8的上海)

是没有关系的。

得到了本地时间后,即可设置到wordpress时的post的post_date中了。

(2)利用wordpress的post的另外的属性post_date_gmt

要获得正确的本地时间,再去设置给post中post_date,显得不容易实现,受服务器影响。

而用gmdate,则不受服务器本地时区影响,直接获得gmt的时间

然后设置给post_date_gmt即可:

$my_post[‘post_date_gmt’] = gmdate(“Y-m-d h:i:s”, $noteCreated / 1000);

详见:

wp_insert_post() | Function | WordPress Developer Resources

另:

zh-cn:函数参考/wp insert post « WordPress Codex

https://codex.wordpress.org/zh-cn:函数参考/wp_insert_post

<code>  'post_date' =&gt; [ Y-m-d H:i:s ] //The time post was made.
  'post_date_gmt' =&gt; [ Y-m-d H:i:s ] //The time post was made, in GMT.
</code>

post的date的格式最好是Y-m-d H:i:s

转载请注明:在路上 » 【已解决】调试并解决Evernote-sync的wordpress帖子发布时间差8小时的bug

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
94 queries in 0.186 seconds, using 23.42MB memory