【问题标题】:How to get a timestamp older than 1901如何获得早于 1901 年的时间戳
【发布时间】:2010-12-02 10:16:26
【问题描述】:

我试图用几种语言(JavaScript、C++ 和 Python)准确计算自 1850 年 1 月 1 日至今的秒数 [别问了,我很久以前就不再问这些问题了])。

问题是平台将时间戳存储为 32 位有符号整数,因此我无法获取早于 1901 年的日期的时间戳,以便轻松地从中减去当前时间戳等。那么我该怎么做呢?

【问题讨论】:

  • 您需要什么精度?例如,您是否知道一天中的某个秒数不是24*60*60leap second
  • 正如 J.F. 指出的,这是一个难题。您是否正在寻找忽略闰日/年/周期等特殊情况的近似答案?
  • 1901 年的日期似乎具有误导性,因为 32 位无符号仅给出大约 68 年的跨度(以秒为单位),因此您需要多个起始日期(以及需要存储至少两位'价值“startDateId”)覆盖 1850 年至今。
  • 阿拉斯加在 1867 年缺席 11 天 skippizzi.com/a_mystery_missing_days.html
  • 问题是关于解决 32 位平台限制的问题。所有这些关于阿拉斯加在公历闰年有多少秒的cmets都不重要。

标签: javascript c++ python timestamp


【解决方案1】:

在 python 中,有datetime module。具体来说,日期类会有所帮助。

from datetime import date
print date(1850, 1, 1).weekday()  # 1, which is Tuesday 
# (Mon is 0)

编辑

或者,对于您的具体问题,使用 timedelta 会有所帮助。

from datetime import datetime
td = datetime.now() - datetime(1850, 1, 1)
print (86400*td.days)+td.seconds  # seconds since then till now

【讨论】:

    【解决方案2】:

    可移植的、与语言无关的方法:

    步骤 1. 计算 01/01/1850 00:00 和 01/01/1901 00:00 之间的秒数。将此号码保存在某处(称为 M)

    第 2 步。使用可用的语言功能计算从 01/01/1901 00:00 到您想要的任何其他日期和时间之间的秒数。

    第 3 步。返回第 2 步 + M 的结果。如果需要,请记住将结果转换为长整数。

    【讨论】:

    • taht 不起作用。从 1850 年 1 月 1 日到 1901 年 1 月 1 日之间的秒数将取决于所用时间点的确切本地。有关日历适应的信息,请参阅:wikipedia/wiki/Gregorian_calendar
    【解决方案3】:

    在WIN32下,可以使用SystemTimeToFileTime

    FILETIME 是一个 64 位无符号整数,用于计算自 1601 年 1 月 1 日 (UTC) 以来 100 纳秒间隔的数量。

    您可以将两个时间戳转换为 FILETIME。您可以将其转换为 ULARGE_INTEGER (t.dwLowDateTime + t.dwHighDateTime

    【讨论】:

      【解决方案4】:

      为什么不使用 Date 对象而不是整数,至少可以作为起点。

      function secondsSince(D){
       D= new Date(Date.parse(D));
       D.setUTCHours(0,0,0,0); 
       return Math.floor((new Date()-D)/1000);
      }
      

      //用日期测试

      var daystring='1850 年 1 月 1 日', ss= secondsSince(daystring), diff=ss/(60*60*24*365.25);

      alert('已经'+ ss + ' 自 00:00:00 (GMT) 开始的秒数 ' + daystring + '\n\n大约是'+diff.toFixed(2)+'年。');

      【讨论】:

        【解决方案5】:

        【讨论】:

          猜你喜欢
          • 2020-11-18
          • 1970-01-01
          • 2020-06-13
          • 2017-05-27
          • 1970-01-01
          • 2011-09-22
          • 2020-09-28
          • 2018-10-22
          • 2019-12-08
          相关资源
          最近更新 更多