日期时间类与本机 PHP 日期函数

2022-08-30 17:06:29

DateTime 类肯定有一些方便的方法,并且似乎总体上优于本机 PHP 日期函数,如 、 和 (等等)。但是有什么缺点或理由为什么我不应该使用它?strtotimemktimestrftime

我能想到的唯一原因是,创建类的整个实例可能比仅使用函数更昂贵。

  • 你同意吗?
  • 对简单的东西使用DateTime对象有意义吗?
  • 还有其他缺点吗?

一直在这两个选项之间切换似乎有点令人困惑,所以我想弄清楚我应该做什么。

我决定的两个例子是:

  • 将日期转换为本地化值
  • 计算两个日期之间的时间

答案 1

如果你担心创建一个类实例成本高昂,并且会妨碍性能,那么我担心你吠错了树。人们永远不应该考虑是否在有意义的地方使用经过验证的OO方法。如果使用 DateTime 类来执行某些日期计算是有意义的,则使用它。它并不昂贵,以至于你的应用程序会感觉到它,除非你做了一些疯狂的事情,比如创建100万个DateTime对象。

DateTime 之所以很棒,是因为它通过在创建对象时指定时区来减轻夏令时的担忧。获取日期之间的差异或获取不同对象之间的间隔也很容易。它基本上减少了所需的担忧和编码(但我承认它有时是错误的,希望它会在PHP的5.4版本中得到解决)。

底线 - 我总是使用它。


答案 2

为了记录在案,我犯了一个错误,使用了类DateTime。这是一个很大的错误。虽然它有一些不错的功能,但不值得付出努力。我解释:

假设您有一个表单(带有日期选择器),并且您正在存储到数据库中,那么您有3种格式来表示日期。

  1. 在内部,变量的类型为 DateTime()
  2. 从视觉上看,向用户显示的变量是格式为 dd-mm-yyyy 或 mm-dd-yyyy 的字符串(这取决于区域设置)
  3. 在数据库中,存储的变量也是格式为 yy-mm-dd (ANSI) 的字符串

因此,我正在处理相同类型数据的3种不同表示形式

另外,假设您要序列化(json,xml等),它是序列化:

object(stdClass)#1 (1) {
  ["field1"]=>
  object(DateTime)#2 (3) {
    ["date"]=>
    string(26) "2018-12-02 09:14:09.216273"
    ["timezone_type"]=>
    int(3)
    ["timezone"]=>
    string(30) "America/Argentina/Buenos_Aires"
  }
}

尝试序列化真的很痛苦。我的替代方案很简单,将任何时间日期存储为字符串,并且仅在需要时将其转换为DateTime。

object(stdClass)#3 (1) {
  ["field1"]=>
  string(19) "2018-12-02 09:14:09"
}

推荐