【问题标题】:Year 0 gets corrupted第 0 年被损坏
【发布时间】:2012-04-11 23:18:28
【问题描述】:
$datetime = new DateTime('0000-00-00 00:00:00');
$date_string = $datetime->format('Y-m-d H:i:s');//-0001-11-30 00:00:00 

日期从 0000-00-00 00:00:00 变为 -0001-11-30 00:00:00 这显然是错误的,为什么会发生这种情况,如何解决? 至少应该返回 false。

信息: PHP 版本 5.2.13-0.dotdeb.1 Linux 2.6.26-2-openvz-amd64 #1 SMP Thu Nov 25 05:14:47 UTC 2010 x86_64

【问题讨论】:

  • 许多日历系统中没有“0 年”,尤其是儒略/格里高利,我想format 正在使用其中的一些变体。很好奇为什么它选择那个日期,但是...... 30 天“太早了”?

标签: datetime php-5.2


【解决方案1】:

根据定义这是正确的:

  • 第 0 天而不是第 1 天产生(假设的)减一天
  • 第 0 个月而不是第 1 个月产生(假设的)负一个月

取第 0 年的(假设的)1 月 1 日,减去一个月 -> 第 -1 年的 12 月 1 日。 减去一天 -> 当年 11 月 30 日 -1

或者,他们可以选择先解决这一天,然后它会变成这样: 1 月 1 日 - 1d -> 12 月 31 日 -0001,-1mo -> 11 月 30 日 -0001

格式化程序显然会进行绑定检查以仅生成有效日期。 (对于“有效”的一些定义)

【讨论】:

  • 是的,这是有道理的(尽管我更喜欢 php 只返回 false),一些奇怪的程序员用这些日期填充了我的数据库,有那么一刻我忘记了没有一天这样的东西0 或 0 月。我想我已经习惯了从 0 开始计数。至少现在我学到了一些关于 php 如何处理日期的新知识。 :P
  • 呵呵,好吧,有趣的是 sql '92 允许第零个月份和日期,我想这就是很多混乱的来源。
猜你喜欢
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 2012-05-08
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多