【发布时间】:2010-09-18 02:04:18
【问题描述】:
如何表示一天的开始和结束时间?
以 2008 年 10 月 23 日为例,是从 2008-10-23 12:00:00 AM 开始到 2008-10-23 11:59:59 PM 结束吗?
【问题讨论】:
-
您在寻找特定语言的示例吗?不同的语言会以不同的方式处理日期。
-
问题中未提及格式,但已被接受为答案,因此我将相应地编辑问题
如何表示一天的开始和结束时间?
以 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,则分钟和秒值必须为零。
注意:在像协调世界时 (UTC) 这样的原子时间尺度中插入闰秒期间,有时可能需要 ss 的值 60。正如巴黎国际地球自转服务所宣布的那样,每隔几年将一个闰秒 23:59:60 插入 UTC 时间尺度,以防止 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 小时之间的符号以及诸如“上午”之类的附加符号。和“下午”被广泛使用。通用的 24 小时国际标准符号现在甚至在英国也得到广泛使用(例如在机场、电影院、公共汽车/火车时刻表等)。大多数其他语言甚至没有像“a.m.”这样的缩写。和“下午” 12h 记法在欧洲大陆上肯定很少用于书写或显示时间。即使在美国,军方和计算机程序员也已经使用 24 小时表示法很长时间了。
旧的英文 12h 表示法有很多缺点,例如:
请认为 12 小时时间是使用罗马数字的黑暗时代的遗物,当时还没有发明数字零,而模拟时钟是唯一已知的显示时间的形式。请避免今天使用它,尤其是在技术应用中!即使在美国,广受推崇的芝加哥风格手册现在也建议在出版物中使用国际标准时间表示法。
【讨论】:
当然,如果您只想表示 1 天,则根本不需要包含时间 - 尤其是因为这引发了关于一天何时开始或结束的如此程度的讨论。根据我的经验,日期处理通常足够复杂,不会引入任何额外的复杂性。
今天是 2008 年 10 月 20 日 - 不需要更多信息。
还是我错过了什么?
【讨论】:
十月。 23 日从 2008 年 10 月 23 日凌晨 12 点开始,到 2008 年 10 月 24 日凌晨 12 点结束——一天结束的时间与下一天开始的时间完全相同。最后一秒从晚上 11:59:59 开始,但在这一天结束之前,您还有整整一秒的时间。
【讨论】:
你的符号很奇怪。我建议指定全天范围的标准方法是:
2008-10-23 00:00:00 并完成 2008-10-23 23:59:59
【讨论】:
您在问题中提到的日期的定义是 >= 2008-10-23 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。
【讨论】: