我希望在MySQL数据库中存储一个PHP DateInterval。为此,最好使用哪种数据库数据类型以便对DateInterval进行序列化?(即我想将其存储,然后稍后从数据库值创建一个DateInterval)。
您可以在DateInterval
的构造函数中使用以下格式进行序列化:$interval->format("P%yY%mM%dDT%hH%iM%sS");
但是需要注意的是,您无法通过构造函数还原invert
(符号)或者days
(天数)的数量,这两个属性是通过DateTime->diff(DateTime)
直接初始化的。如果您不需要这些信息,使用format
即可。但如果您需要它们,最好选择使用serialize($interval)
。
format
确实是更加整洁的方法。而且我之前还没有考虑过反向操作。如果负间隔是一个问题,那么在创建对象后将反向操作单独存储在一个bool列中,并在设置完毕后进行设置比存储序列化对象要更好些。 - Don't PanicDateInterval
构造函数所需的间隔规范,例如“P35D”,“P1DT24M39S”等。DateTime :: diff
(或我没有想到的其他地方)获得,则仍可以从该对象中获取间隔规范。它具有公共属性,可存储所需的所有部分。类似以下内容应该有效:function getIntervalSpec(DateInterval $interval) {
$spec = 'P';
foreach(['y', 'm', 'd', 'h', 'i', 's'] as $u) {
if ($u == 'h') $spec .= 'T';
$spec .= $interval->$u;
$spec .= $u == 'i' ? 'M' : strtoupper($u);
}
return $spec;
}
format()
方法似乎需要一个格式字符串?如果我不传递格式字符串,它会选择“最佳”的格式吗?如果我可以在序列化时只需使用 ->format()
方法对 DateInterval 进行格式化,然后在构造时使用结果字符串来构建,那将完全符合我的需求。 - Josh Petittformat()
是为了让你指定输出格式的,那么格式化字符串就不是可选的。我假设你是从用户输入开始,然后使用它来创建 DateInterval。如果是这种情况,我会在创建对象之前存储间隔规范,而不是尝试使用 format()
从对象中获取间隔规范。如果不是这种情况,并且你是使用 DateTime::diff
创建 DateInterval,则应使用 DateInterval 的公共属性创建间隔规范字符串,而不是使用 format()
。 - Don't Panic