【问题标题】:modifying a php DateTime object修改 php DateTime 对象
【发布时间】:2012-06-18 23:01:11
【问题描述】:

我有一个关于修改 php DateTime 对象的正确方法的问题。目前,我正在做类似的事情:

$origEvent = new DateTime(...);
$newEvent = new DateTime(...);
$someOtherEvent = new DateTime(...);

//get the time difference between the orignal event and the edited event
$diff = $origEvent->diff($newEvent);

$someOtherEvent->add($diff);

使用 DateTime::add() 方法似乎无论我们是从 $someOtherEvent 中增加还是减少时间都可以工作。这是正确的方法吗?我知道有 DateTime::sub() 用于减去时间,但似乎只要 DateInterval(由 $origEvent->diff() 产生)具有反转标志,DateTime::add() 就知道实际上减去时间。它是否正确?我应该使用 DateTime::modify 之类的东西吗?

【问题讨论】:

  • @hakre 这根本不重要,我只是好奇为什么标签被改变了?我所指的功能仅在 php5 中可用,所以我认为特异性很重要。再说一次,对我来说没关系,只是对未来的帖子感到好奇:)

标签: php datetime dateinterval


【解决方案1】:

实际上,DateTime::diff() 以相对的方式返回两个 DateTime 对象之间的差异。因此:

  • 如果 date1 低于 date2 则 date1->diff(date2) 将导致 间隔
  • 如果 date2 小于 date1 则 date1->diff(date2) 将导致 间隔

所以:

  • DateTime::add() 与负间隔的使用等效于 DateTime::sub() 与同一间隔的绝对值的使用
  • 使用带有负间隔的 DateTime::sub() 等效于使用带有 绝对 相同间隔值的 DateTime::add()

为了代码清晰起见,您可以将 DateTime::diff() 的第二个参数设置为 true,以便每次获得绝对差异,然后在 DateTime::add() 和 DateTime 之间选择最佳函数: :sub() 知道你有绝对的不同。

关于 DateTime::modify() 和 DateTime::add(), DateTime:sub() 之间选择的一些话:

  • 只要您使用 DateTime::diff(),您就假定您的 PHP 版本大于或等于 5.3.0,并且您可以使用此 PHP 版本中提供的所有新功能;也就是说 DateTime::add() 和 DateTime::sub()
  • 当您的 PHP 版本大于或等于 5.2.0 时,使用 DateTime::modify() 是合理的。 (在此版本中 DateTime::add() 和 DateTime::sub() 尚不可用)

【讨论】:

  • 啊,没有看到 diff 方法的第二个参数。我认为你是对的,我只使用 add 函数(即使它按我想的那样工作)感到恶心,因此这篇文章诞生了。感谢您的澄清,非常感谢。
  • 正如 Ruby 编程语言所说:“代码应该非常清晰,好的代码可以准确地告诉读者它想要做什么。好的代码会说出它的意图。”因此,仅使用 add 函数,对代码的理解就会变得更加复杂。通过在正确的情况下使用正确的函数,您的代码会变得更加清晰。不客气;)
猜你喜欢
  • 1970-01-01
  • 2017-03-23
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 2011-07-22
  • 1970-01-01
相关资源
最近更新 更多