【问题标题】:Why does DateTime to Unix time use a double instead of an integer?为什么 DateTime 到 Unix 时间使用双精度而不是整数?
【发布时间】:2011-03-05 21:24:16
【问题描述】:

我需要将 DateTime 转换为 Unix 时间戳。所以我googled它正在寻找一些示例代码

在我看到的几乎所有结果中,他们使用double 作为此类函数的返回值,即使显式使用floor 将其转换为整数也是如此。 Unix 时间戳总是整数。那么使用longint 而不是double 有什么问题呢?

static double ConvertToUnixTimestamp(DateTime date)
{
    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
    TimeSpan diff = date - origin;
    return Math.Floor(diff.TotalSeconds);
}

【问题讨论】:

  • 恕我直言,只是不验证输入日期。它应该返回一个 long 或 ad-hoc 结构
  • 没有任何原因,这只是糟糕的代码。投长,不能溢出。
  • 我会补充一点,根据定义,Unix 时间戳是 UTC。该方法应检查 DateTime.Kind 是 UTC、Local 还是 Unspecified。至少,如果 Local 我会在执行转换之前转换为 UTC。或者,如果您想要一个本地的 Unix 时间戳,您可以添加一个重载或参数以不执行到 UTC 的转换。
  • @Nate,嗯是的,但对我来说没关系。

标签: c# .net datetime floating-point unix-timestamp


【解决方案1】:

通常,我会使用 unsigned long 来实现它,而不是要求用户向上或向下舍入并转换为 int 或 long。有人可能想要双精度的一个原因是,如果使用类似于 timeval 的结构,例如 gettimeofday。它允许亚秒级精度...

【讨论】:

    【解决方案2】:

    要避免 32 位系统上的 2038 错误?

    【讨论】:

    • 人们会认为他们可以使用很长时间。
    • @nos 可能。我怀疑更多的系统原生支持 float64 而不是 int64。此外,也许有些人对小数秒感兴趣。
    【解决方案3】:

    与 int 类型中的任何其他变量相比,Double 覆盖的范围更广。

    【讨论】:

    • 是的,但long 将涵盖数千年。我的软件肯定不会在几千年后运行。
    • 我想如果你有一些软件需要计算未来或过去的某些东西,它可能会有所帮助。不过这是一种特殊情况,在上述情况下可能会使用自定义数据类型。
    【解决方案4】:

    这不是“年”的问题。但是在合理的机器上需要几个小时,并正确链接。

    但是您能想象整理巨大的存储空间吗?我有大约 30 TB 的数据,这让我不知所措 - 我花在编目上的时间比实际工作要多。

    祝你好运

    【讨论】:

      猜你喜欢
      • 2016-02-18
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      相关资源
      最近更新 更多