我总是将unix时间戳用于所有内容,但我想知道是否有更好的方法。
您使用什么来存储时间戳?为什么?
答案 0 :(得分:85)
但是,您选择存储时间戳,避免区域解释问题和时间偏移问题非常重要。无论区域如何,Unix时间戳都被解释为相同,并且无论时区如何都是从同一时间点计算出来的 - 这些都是好事。
请注意将时间戳存储为不明确的字符串,例如01/02/2008,因为这可以解释为2008年1月2日或2008年2月1日,具体取决于区域设置。
当存储小时/分钟/秒时,重要的是要知道指定了“哪个”小时/分钟/秒。您可以通过包含时区信息(Unix时间戳不需要,因为它假定为UTC)来完成此操作。
但是,请注意,Unix时间戳不能唯一地代表某些时刻:当UTC中存在闰秒时,Unix时间戳不会改变,因此UTC时间23:59:60和第二天00:00:00具有相同的Unix表示。因此,如果您真的需要一秒或更好的分辨率,请考虑另一种格式。
如果您更喜欢比Unix时间戳更易于阅读的人类可读格式,请考虑ISO 8601。
一种有助于保持直观的技术是将日期存储为UTC,并且仅在向用户显示日期时应用时区或DST偏移。
答案 1 :(得分:26)
如果你要存储一个日志文件,请为皮特的爱而使它具有人类可读性和词汇可排序性。
2008-10-07 09:47:02例如。
答案 2 :(得分:14)
32 bit Unix timestamps will overflow in a few years (January 2038),这可能是一个考虑因素。我通常在SQL中使用DATETIME格式,即YYYY-MM-DD HH:MM:SS,时间为24小时制。我尝试以相同的格式输出文件,只是为了让我的生活更轻松。
答案 3 :(得分:6)
你需要存储什么时代以及解决方案? 如果你需要微秒,或石器时代的日期time_t可能不是最好的。 出于一般商业目的,它非常好(假设是64位)
答案 4 :(得分:4)
这取决于您需要的时间戳。
unix时间戳不能代表2008-12-31T23:59:59Z后1秒的时间。 如果你使用unix时间戳执行'2009-01-01T09:00:00' - '2008-12-31T09:00:00'结果不正确:这两个日期之间会有一个闰秒并且它们是分开的86401秒(不是86400,因为unix时间戳会告诉你)。
除此之外以及其他响应者所说的是,是 - unix时间戳是要走的路:)
答案 5 :(得分:4)
时间戳对数据库不是一个好主意,因为它们不会考虑夏令时或当前的本地时间。在MySQL上,最好将其存储为时间,然后使用MySQL date and time functions来检索所需的部分,或与其他日期进行比较。
答案 6 :(得分:2)
timeval-style(time_t + microseconds)如果我需要亚秒精度,否则只需要time_t。您可以使用64位整数值来存储time_t * 1000000 + usec,并且您可以防止溢出超过+/- 292,000年。
答案 7 :(得分:1)
UNIX时间戳32位问题似乎对于在2038 +中输入未来日期的用户来说非常烦人。
使用MySQL的DATETIME序列,或将日期存储为BIGINT(8)无符号(最大值:18 quintillion)或FLOAT,以便输入大数字。然后你不能使用PHP的date()函数,因为它只允许整数作为参数(受32位系统限制)。
我找到的解决方案是使用 PHP 5.2.0 功能。 Here's the DateTime PHP solution
无需更改UNIX_TIMESTAMP格式。只要您将BIGINT(8)无符号作为时间戳的MySQL存储空间。您将不再受32位系统的限制。
答案 8 :(得分:0)