我想将PHP DateInterval存储在MySQL数据库中。
用于此目的的最佳数据库数据类型是什么,以便我可以序列化DateInterval? (即我想存储它,然后再从数据库值创建一个DateInterval。)
答案 0 :(得分:3)
我建议存储DateInterval
构造函数的区间规范,如“P35D”,“P1DT24M39S”等。
我选择这个的原因:
这很简单。如果您让用户选择特定的时间间隔,我假设您有一个表单,其中包含不同时间单位的不同输入。从输入中创建其中一个字符串会非常简单,而不是在时间单位之间转换来存储int。
它相对紧凑。不像 将它转换为一个时间单位并将其存储为int那样紧凑,但比序列化DateInterval对象和存储整个事物要紧凑得多。
我可能忽略了一个让其他事情成为更好选择的因素,但我主要是想分享我之前评论的推理。
如果您最初没有像我假设的那样直接从用户那里获得间隔,而是从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;
}
答案 1 :(得分:3)
您可以使用$interval->format("P%yY%mM%dDT%hH%iM%sS");
的构造函数格式序列化:invert
但是,存在陷阱。您无法通过构造函数恢复days
(符号)或天数DateTime->diff(DateTime)
。这两个属性直接由format
初始化。如果您不需要此信息,serialize($interval)
就可以了。但如果您需要,data_col = ["46", "47", "48", "49", "50", "51", "52"]
def method(arg)
results = []
i = 0
while i < arg.length
current_num = arg[i].to_i
next_num = arg[i + 1].to_i
next_num - current_num != 1 ? results << current_num : nil
i += 1
end
return results
end
p method(data_col) #[52]
是最佳选择。