【问题标题】:Why is date() applying DST incorrectly?为什么 date() 错误地应用 DST?
【发布时间】:2013-12-12 08:33:19
【问题描述】:

我正在尝试将人类可读的早上 7 点时间转换为 PHP 中的时间戳,以用于计算和操作目的。时间戳正确创建为 25200,但是当我使用伦敦作为时区时,date() 函数奇怪地将时间戳转换回 08:00,使用柏林时为 08:00(正确),但使用雅典时为 09:00。

我不明白为什么它不返回 07:00 以及为什么它应该与柏林相同。我的服务器在德国,我在伦敦,这可能与它有关吗?几乎没有,因为我在伦敦的笔记本电脑上的 XAMPP 堆栈上遇到了同样的问题。

date_default_timezone_set('Europe/London');
$time_readable = 7;
$time_stamp = $time_readable * 60 * 60;
echo $time_stamp;
echo date('H\:i',$time_stamp);

我什至在我的代码前面加上了

date_default_timezone_set('UTC');
date_default_timezone_set('Europe/London'); 

但问题仍然存在。

我忽略了什么?

我在服务器上的 PHP 版本在德国生产机器上是 5.2.12,在我的英国笔记本电脑 XAMPP 堆栈上是 5.3.1。

【问题讨论】:

  • 你的目标是什么?时区如何适应您想要的最终结果?
  • 您计算的时间戳被视为自 1970 年 1 月 1 日 00:00:00 以来的秒数,而不是自昨晚午夜以来的时间。
  • 我正在使用它来定义具有可变粒度以及可变开始和结束时间的在线日历。因此,当我允许用户在 GUI 中定义“7”的开始时间和“15”分钟的粒度时,我会将它们转换为时间戳,以便我可以相应地创建日历数组。
  • 虽然我多年来一直使用这种方法,但我现在正在编写一个新系统来使用相同的数据库,所以我不能轻易改变很多东西。对于这些计算,我不想要时区,我认为它只会从 1970 年 1 月 1 日开始计算,而与时区无关,但它们似乎确实会影响转换?我确实想在我的代码中为它的其他方面定义时区,但令我感到困惑的是,转换会在雅典发生变化,但不会发生在伦敦......
  • 欢迎来到互联网时代的世界。 PHP 时间戳始终是从 1970 年 1 月 1 日午夜开始的秒数,UTC。伦敦的当地时间将是 UTC 或 UTC+1,具体取决于年份和时间。柏林将是 UTC+1 或 UTC+2。除非您更改它,否则您的服务器可能会在它本地的任何时间工作,但时间戳仍然是 UTC。祝你好运!

标签: php date timezone unix-timestamp


【解决方案1】:

您似乎对what a timestamp is 及其工作方式存在根本性的误解。你也没有正确理解DST,因为它的应用方式与政治变化有关。

但是,回答您的具体问题

我不明白为什么它不返回 07:00 以及为什么它应该与柏林相同。

您的timestamp represents 07:00 UTC on 1st January 1970。将时区设置为“欧洲/伦敦”的原因将时间更改为 08:00 是因为英国正在运行 British Standard Time experiment,这使英国在 1968 年 10 月 27 日至 1971 年 10 月 31 日期间保持 UTC + 1。因此,当地时间伦敦时间 1970 年 1 月 1 日 07:00 UTC 是 08:00。

我建议您的时间戳应始终是代表完整日期和时间的完整时间戳。试图只代表时代是通往痛苦的道路。

我还建议学习使用DateTime classes,因为他们会透明地为您处理所有这些。

【讨论】:

  • 谢谢你,vascowhite,这非常有帮助。我喜欢认为我对时间戳是什么以及它们如何工作有一个基本的了解,但是我不知道英国会在冬季中期偏离 UTC :) 你当然是正确的,现在是时候了我学习 DateTime 类,过去我使用时间戳来处理时间和日期对我很有帮助,但很可能是不必要的复杂。感谢您鼓励学习更好的做事方式,特别是最终解决了困扰我好几年的谜团。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
  • 2020-12-07
  • 2015-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多