在课堂上表示日期的最佳方式(日月份与时间戳)

时间:2014-02-27 22:21:33

标签: c++ class date datetime time

假设我们有一个类存储某些日期,例如2014年2月27日。请考虑该类的这两种可能的实现:

  1. 存储日,月和年
  2. 存储自参考日期以来的天数,例如1900年1月1日
  3. 现在我被告知第二种方式是“更好”或更优选的方式,但我不确定为什么。有人在乎解释吗?

4 个答案:

答案 0 :(得分:2)

没有正确或错误的方式。很多将取决于你有多少空间来编码日期和你打算用它做什么。 Unix epoch是自1970年1月1日星期四(UTC)以来的秒数,我确信Thompson和Richie在选择它们时知道他们在做什么。

Windows自FILETIME时间起使用自1600年1月1日起的100纳秒间隔的数量,并使用其SYSTEMTIME次的年/月/日/小时/分/秒/ ms,因此即使在一个平台上,您也可以有多种表示形式。

答案 1 :(得分:1)

分别存储日,月和年的优点:

  • 检索/设置日期的各个组成部分时没有开销
  • 无需计算实际日期

存储自1900年1月1日以来的天数的优点:

  • 较小的尺寸(可以在具有日期数组时计算,或在用作另一个结构中的字段时计算)
  • 在两个日期(差异,比较)之间或日期和时间段之间执行操作更容易,更快捷(例如,将日期添加3天或获得tommorow值)

答案 2 :(得分:1)

两种表示都在实践中使用,两者都相当普遍。每个都有其独特的优点和缺点:

  • 第一个表示法可让您在不执行任何计算的情况下获取日期的组成部分(即日/月/年)
  • 将第一个表示更改为特定日期不需要计算
  • 与第一个代表不同,第二个代表不能不一致(即无法代表二月 - 31 ,2014)
  • 按特定时间间隔推进第二种表示需要非常简单的计算
  • 将第二个表示存储在不支持日期的数据存储中需要的空间更少

使用其他方法很难超越每种方法的优势。实际上,在某些情况下,相同的类库可能基于日期的不同表示而具有两个类。例如,Java类库提供了java.util.Calendar类,它实现了第一种方法的扩展版本,以及java.util.Date类,它实现了第二种方法。

答案 3 :(得分:0)

如果您可以考虑其他字符串格式,请查看标准格式ISO 8601

  • 2014-02-27T23:03:14→当地日期时间,没有时区
    (如果上下文中有任何歧义可能不好)
  • 2014-02-27T23:03:14+3:00→比UTC早三个小时的日期时间。
  • 2014-02-27T23:03:14-08:00→比UTC(美国西海岸)晚8小时
  • 2014-02-27T23:03:14Z→UTC时无偏移。通常称为“Zulu”时间,因此Z是Zulu的缩写,是+00:00的替代。

java.time package中的新Java 8通过附加offset之外的时区名称来扩展此格式。时区是偏移加上规则和有关Daylight Saving Time(DST)和其他异常的历史记录。

2014-02-27T23:03:14-08:00[America/Los_Angeles]

请注意,此格式的字符串按字母顺序按时间顺序排序(如果所有字符串都在同一时区)。