如何在不使用:strtotime,Zend Framework或PEAR包的情况下获得2个日期之间的差异(以秒为单位)?

时间:2010-01-14 22:31:11

标签: php datetime datediff

正如标题所述,我希望在不使用:strtotime,Zend Framework或PEAR包的情况下获得2之间(特别是现在和过去的日期之间)日期之间的差异(以秒为单位)。

我不想深入了解我的理由,但其中的要点是我正在处理非常古老的日期(我的意思是老了,我在公元0年前说话)。

优选的是,返回的结果高度精确到给定的文本时间戳的第二个。调用该函数的格式应类似于:

$bar = foo("YYYY-MM-DD HH:MM:SS", "AD"); // Where AD is Anno Domini 
$baz = foo("YYYY-MM-DD HH:MM:SS", "BC"); // Where BC is Before Christ

第一个提供以下工作的人:

  • 高可读性
  • 没有魔法(三元运算符等)

他们的答案将被投票并接受。它们的名称将记入使用其代码的源文件的标题中。

编辑(回复:成名):

有人说在标题中记下一个名字看起来很糟糕,可以将其删除。我在谈论利用我想要的功能的源文件的标题。这不是“名声”。应该在信用到期的情况下给予信用,我不需要为谁创作作品撒谎。

编辑(Re:准确性):

除了我想要尽可能地保留“信息的信件”之外没有理由。

编辑(Re:Magic):

魔术对不同的人来说是不同的东西。关于三元运营商,请尊重我的意见,因为我尊重你的意见。谢谢。

编辑(回复:旧日期和一秒准确度):

作为历史学生,这对我来说很有意义。对“一秒精度”的渴望并不是绝对的。完美虽然可以实现,但并不是必需的。

4 个答案:

答案 0 :(得分:2)

我建议将每个日期时间分成几部分(年,月,日,小时,分钟,秒)。然后,对每个部分,做一个基本总和更多减去最近(记住BC日期实际上是一个负数)。

你永远不会完全正确。你将不得不考虑闰年,以及一个世纪是否是闰年,格列高利/朱利安日期等之间的转换。

另外,我很想知道您对限制和高精度要求的推理!

答案 1 :(得分:1)

对于所有这些问题,请参阅Calendrical Calculations(Google for it)。

哦,并且没有公元0年,日历从1BC到1AD,或者更确切地说,我们现代西方人用这种方式定义日历,当时大多数世界都在使用其他系统。

或者,拨打this one等在线计算器,并节省大量时间。

答案 2 :(得分:1)

有些语言和数据库会进行日期算术,有些语言和数据库没有。如果您将日期存储在数据库中,请尝试使用postgres:

pg=> SELECT now() - 'January 8, 52 BC'::DATE;
-----------------------------
 754835 days 20:27:31.223035

如果您不使用数据库,那么问题会更多。 PHP的日期算术是......好吧,我不想谈论它。 Python非常好,但它从1BC开始。

你可能需要自己动手......

答案 3 :(得分:0)

为什么不减去时间戳?

mktime(16,59,0,8,7,2001) - mktime(16,59,0,8,7,2000) =他们之间的秒数