php – DateTime对象不受其时间戳的约束?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php – DateTime对象不受其时间戳的约束?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1819字,纯文字阅读大概需要3分钟。
内容图文
DateTime对象是否不受其时间戳的约束?或者,在DST更改时使用getTimestamp()会产生某种副作用吗?
细节
当设置DST上的DateTime对象的时间戳时(意味着在更改时钟之前/之后存在格式化时间),返回的时间戳与设置的时间戳不同.
$php --version
PHP 7.1.3 (cli) (built: Mar 17 2017 16:59:59) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
复制
考虑以下php脚本:
date_default_timezone_set('Europe/Berlin');
$date = new DateTime();
$set_timestamp = 1319932800;
$date->setTimestamp($set_timestamp);
$get_timestamp = $date->getTimestamp();
fwrite(STDERR, $set_timestamp . "\n"); // 1319932800
fwrite(STDERR, $get_timestamp . "\n"); // 1319936400 **(WHY IS THIS DIFFERENT?)**
为什么印刷值不相等?
解决方法:
首先,unix时间戳始终为UTC,因此它没有时区和DST.
另一方面,DateTime对象仅存储本地时间(“本地”表示在DateTime实例中设置的时区).
因此,在设置时间戳之前,应将时区设置为00:00或UTC,以避免不必要的时间转换和DST猜测.
你有两个选择:
1.通过DateTime的构造函数设置时间戳
构造函数将覆盖默认时区,并在第一个参数中获得时间戳(以@开头)时显式设置为00:00:
$set_timestamp = 1319932800;
$date = new DateTime('@' . $set_timestamp);
print($set_timestamp . "\n");
print($date->getTimestamp() . "\n");
信息:在这种情况下,构造函数的timezone参数将始终被覆盖.
2.在调用setTimestamp()之前设置时区
在调用setTimestamp()之前,使用DateTimeZone(’00:00′)或DateTimeZone(‘UTC’)时区调用setTimezone():
$set_timestamp = 1319932800;
$date = new DateTime();
$date->setTimezone(new DateTimeZone('UTC'));
$date->setTimestamp($set_timestamp);
print($set_timestamp . "\n");
print($date->getTimestamp() . "\n");
笔记
当然,这两种情况的输出都是:
1319932800
1319932800
在这些情况下,date_default_timezone_set()是不必要的,因为您不希望对本地时间执行任何操作.
但是,当您想以人类可读格式打印$date时(因此当您将unix时间戳转换为本地时间时),时区将再次变得有趣.
内容总结
以上是互联网集市为您收集整理的php – DateTime对象不受其时间戳的约束?全部内容,希望文章能够帮你解决php – DateTime对象不受其时间戳的约束?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。