如何表示一天的开始和结束时间?
以2008年10月23日为例,它是从2008-10-23 12:00:00 AM开始,还是从2008-10/23 11:59:59 PM结束?
我想引用一个网站,http://www.cl.cam.ac.uk/~mgk25/iso-time.html
一天中时间的国际标准表示法是
hh:mm:ss
其中hh是自午夜(00-24)以来经过的完整小时数,mm是自小时(00-59)开始以来经过的完全分钟数,ss是自分钟(00-60)开始以来的完整秒数。如果小时值为24,则分钟和秒值必须为零。
注意:ss的值60有时可能需要在原子时标(如协调世界时)中插入闰秒。巴黎国际地球自转服务中心宣布,每隔几年在UTC时标中插入一个闰秒23:59:60,以防止UTC偏离由地球实际自转定义的不太恒定的天文时标UT1超过0.9秒。在实践中,你不太可能看到时钟显示23:59:60。大多数同步时钟在闰秒发生后的某个时间再次同步到UTC,或者在闰秒附近暂时减速,以避免时间戳超出范围可能造成的任何中断。
就是一个例子
23:59:59
其表示午夜前一秒的时间。
与日期表示法一样,分隔冒号也可以像一样省略
235959
并且可以通过省略秒或者像中那样同时省略秒和分钟来降低精度
23:59, 2359, or 23
也可以在小数点或逗号后加上几分之一秒,例如午夜前5.8毫秒的时间可以写成
23:59:59.9942 or 235959.9942
由于每天都以午夜开始和结束,00:00和24:00这两个符号可用于区分与一个日期相关的两个午夜。这意味着以下两个符号指的是完全相同的时间点:
1995-02-04 24:00 = 1995-02-05 00:00
如果需要明确的时间表示,00:00通常是午夜的首选表示法,而不是24:00。数字时钟显示00:00而不是24:00。
ISO 8601没有规定,无论其符号是指定时间点还是时间段。例如,这意味着ISO 8601没有定义09:00是指一天中第九个小时的确切结束时间,还是指09:00到09:01的时间段或其他时间。如果有任何问题的话,标准的用户必须以某种方式就时间符号的确切解释达成一致。
如果日期和时间显示在同一行,请始终将日期写在时间前面。如果一个日期和一个时间值一起存储在一个数据字段中,那么ISO 8601建议它们应该用拉丁文大写字母T分隔,如19951231T235959所示。
美国读者评论:
几十年来,这里规定的24小时记时法已经成为世界各地书面语言的事实标准。唯一的例外是少数英语国家,在这些国家,时间在1到12之间的静态符号以及"a.m."one_answers"p.m."等附加符号被广泛使用。常见的24小时国际标准记数法现在甚至在英国也被广泛使用(例如,在机场、电影院、公共汽车/火车时刻表等)。大多数其他语言甚至没有"a.m."one_answers"p.m."这样的缩写,而在欧洲大陆,12小时记数法肯定很少用于书写或显示时间。即使在美国,军方和计算机程序员也已经使用24小时表示法很长时间了。
旧的英语12h表示法有很多缺点,比如:
- 它比正常的24小时记数法更长
- 人类在12小时记数法中比较两次需要更多的时间
- 目前尚不清楚00:00、12:00和24:00是如何表示的。即使是百科全书和风格手册也包含相互矛盾的描述,一个常见的快速解决方案似乎是完全避免"12:00 a.m./ppm",而是写"正午"、"午夜"或"12:01 a.m./pm.",尽管"午夜"一词仍然无法区分00:00和24:00(某一天开始或结束时的午夜)
- 这让人们经常相信,第二天从"凌晨12:59"到"凌晨1:00"的溢出开始,这是一个常见的问题,不仅当人们试图在午夜后不久对录像机的计时器进行编程时
- 它不容易与字符串比较操作进行比较
- 对于不知情的人来说,"12:00 a.m/p.m."one_answers"1:00 a.m/p.m.m."之间的时间是从00:00开始还是从12:00开始,也就是说,英语的12h表示法更难理解
请将12小时时间视为黑暗时代的遗迹,当时使用罗马数字,数字零尚未发明,模拟时钟是显示时间的唯一已知形式。请避免在今天使用它,尤其是在技术应用中!即使在美国,广受尊重的《芝加哥风格手册》现在也建议在出版物中使用国际标准时间符号。
当然,如果你只想表示一天,你根本不需要包括时间——尤其是因为这会引发关于一天何时开始或结束的讨论。根据我的经验,日期处理通常足够复杂,不会带来任何额外的复杂性。
今天是2008年10月20日,无需更多信息。
还是我错过了什么?
Oct。23从2008-10-23凌晨12点开始,到2008-10-24凌晨12点结束——一天的结束时间与下一天的开始时间完全相同。最后一秒从晚上11:59:59开始,但距离一天结束还有整整一秒的时间。
您的表示法很奇怪。我建议指定全天范围的标准方法是:
2008-10-23 00:00:00并完成2008-10-2323:59:59
您在问题中提到的日期的定义是>=2008-10-23 00:00:00和<2008-10-24 00:00:00。
如果要使用数学区间表示法,您可以将其写成
[2008-10-23 00:00:00,2008-10-24 00:00:00)
[表示包含,)意味着最多但不包含。
通过这种方式,您可以让用户和您自己都更轻松。
这取决于你所说的一天是什么意思。遗憾的是,日期处理总是比看上去更复杂。
要将您的示例转换为24小时ISO日期格式,您可以说:
2008-10-23 00:00:00 - 2008-10-23 23:59:59
然而,这取决于您将一个范围解释为包含还是排除,可能会忽略一天中的最后一秒*。程序员通常更喜欢保持上限的排他性,所以你会选择:
2008-10-23 00:00:00 - 2008-10-24 00:00:00
或者,作为一种稍微好一点的表述方式,如果支持(或为了人类可读性):
2008-10-23 00:00:00 - 2008-10-23 24:00:00
*:实际上可能不止一个。如果跨度代表UTC时区中的一天(或与之对齐的另一个时区,这很可能),那么在一天结束时,23:59:60偶尔会有一个额外的"闰秒",这是一种毫无意义的尝试,目的是使UTC与恒星时间保持一致。下一个闰秒计划在今年年底。然而,许多系统忽略闰秒,因为它们既愚蠢又烦人。
如果你想独立于时区来表示"日历日",你最好的选择是儒略日数字。今天是2454760。