我对 Web SQL(SQLite?)中的 DateTime 字段类型感到困惑。
我应该将我的日期/时间值存储为以毫秒为单位的 getTime() 还是 YYYY-MM-DD HH:MM:SS:SSS 字符串?
如果以毫秒为单位存储,我应该使用什么字段类型?
一般来说,我会使用ISO 8601格式和一个text
列来保存它们。SQLite 没有任何本机时间类型,但其本机日期和时间处理函数适用于 ISO 8601 格式:
所有五个日期和时间函数都将时间字符串作为参数。时间字符串后跟零个或多个修饰符。strftime() 函数还将格式字符串作为其第一个参数。
日期和时间函数使用 IS0-8601 日期和时间格式的子集。date() 函数以这种格式返回日期:YYYY-MM-DD。time() 函数以 HH:MM:SS 形式返回时间。datetime() 函数返回“YYYY-MM-DD HH:MM:SS”。
因此,如果您需要在数据库中操作时间戳(您可能迟早会这样做),那么您将需要使用YYYY-MM-DD HH:MM:SS
字符串。
如果您不会在数据库中操纵时间戳(除了简单的比较),那么您可能可以毫无困难地使用 seconds-since-epoch 整数。另请注意,有时您可以本机使用 seconds-since-epoch 值:
“unixepoch”修饰符 (11) 仅在它紧跟在 DDDDDDDDDD 格式的时间字符串之后才有效。此修饰符导致 DDDDDDDDDD 不像通常那样被解释为儒略日数,而是 Unix 时间 - 自 1970 年以来的秒数。如果“unixepoch”修饰符不遵循 DDDDDDDDDD 形式的时间字符串,它表示自 1970 年以来的秒数,或者如果其他修饰符将“unixepoch”修饰符与之前的 DDDDDDDDDD 分开,则行为未定义。由于使用 64 位整数的实现所施加的精度限制,“unixepoch”修饰符仅适用于 0000-01-01 00:00:00 和 5352-11-01 10:52:47 之间的日期(unix 时间为-62167219200 到 10675199167)。
所以你可以说:
SELECT datetime(1092941466, 'unixepoch');
然后'2004-08-19 18:51:06'
回来。指定'unixepoch'
修饰符虽然有点麻烦,并且当你不可避免地忘记它时会导致有趣的事情发生:
-- 1333482187 is 2012-04-03 19:43:07
sqlite> select strftime('%m', 1333482187, 'unixepoch');
04
sqlite> select strftime('%m', 1333482187);
43
像往常一样,真正的答案是视情况而定,但 ISO 8601 字符串可能是您最好的选择。