题
我总是使用unix timestamps的一切,但我想,如果有一个更好的办法。
你用什么储存的时间戳,为什么?
解决方案
但是,您选择存储时间戳,避免区域解释问题和时间偏移问题非常重要。无论区域如何,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偏移。
其他提示
如果你要存储一个日志文件,请为皮特的爱而使它成为人类可读和词法排序的东西。
2008-10-07 09:47:02例如。
32位Unix时间戳将在几年内(2038年1月)溢出,以便是一个考虑因素。我通常在SQL中使用DATETIME格式,即YYYY-MM-DD HH:MM:SS,时间为24小时制。我尝试以相同的格式输出文件,只是为了让我的生活更轻松。
你需要存储什么时代以及解决方案? 如果你需要微秒,或石器时代的日期time_t可能不是最好的。 出于一般商业目的,它非常好(假设是64位)
这取决于您需要的时间戳。
unix时间戳不能代表2008-12-31T23:59:59Z后1秒的时间。 如果你使用unix时间戳执行'2009-01-01T09:00:00' - '2008-12-31T09:00:00'结果不正确:这两个日期之间会有一个闰秒并且它们是分开的86401秒(不是86400,因为unix时间戳会告诉你)。
除此之外以及其他响应者所说的是,是 - unix时间戳是要走的路:)
时间戳对数据库不是一个好主意,因为它们不会考虑夏令时或当前的本地时间。在MySQL上最好将其存储为时间,然后使用 MySQL日期和时间函数来检索您想要的部分,或与其他日期进行比较。
timeval-style(time_t + microseconds)如果我需要亚秒精度,否则只需要time_t。您可以使用64位整数值来存储time_t * 1000000 + usec,并且您可以防止溢出超过+/- 292,000年。
UNIX时间戳32位问题似乎对于在2038 +中输入未来日期的用户来说非常烦人。
使用MySQL的DATETIME序列,或将日期存储为BIGINT(8)无符号(最大值:18 quintillion)或FLOAT,以便输入大数字。然后你不能使用PHP的date()函数,因为它只允许整数作为参数(受32位系统限制)。
我找到的解决方案是使用 PHP 5.2.0 功能。 这是DateTime PHP解决方案。
无需更改UNIX_TIMESTAMP格式。只要您将BIGINT(8)无符号作为时间戳的MySQL存储空间。您将不再受32位系统的限制。