折腾:
【已解决】调试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
结果换成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 // 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
->
->
->
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' => [ Y-m-d H:i:s ] //The time post was made. 'post_date_gmt' => [ Y-m-d H:i:s ] //The time post was made, in GMT. </code>
post的date的格式最好是Y-m-d H:i:s