【问题标题】:Timestamp and UTC kind时间戳和 UTC 种类
【发布时间】:2015-08-03 23:45:13
【问题描述】:

在我的应用程序中,我收到时间戳,在 c# 代码中,我转换为日期并传递此日期以执行存储过程。我的应用程序放置在服务器机器中。但是当这个日期打印在日志中时,我看到服务器接收的日期少了一天。下面是我将时间戳转换为日期的代码,

DateTime fromDate = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc);
fromDate =fromDate.AddMilliseconds(1430159400000).ToLocalTime();

日期为:'2015-04-28' 但在服务器中接收为 '2015-04-27'。当我在日志中打印这个日期时,我就知道了。我在这里做错了什么! 欢迎提出任何建议。

问候 桑吉萨

【问题讨论】:

    标签: c# date datetime timestamp utc


    【解决方案1】:

    目前您正在将 UTC 时间戳转换为系统本地时间 - 并且可能您的服务器与您处于不同的时区。

    强烈建议您直接以 UTC 记录 UTC 时间戳。无论读取什么,您的日志都可以将其转换为您想要的任何时区的本地时间,但这样更便于携带:

    • 您无需知道服务器所在的时区即可了解日志
    • 您可以轻松地合并来自多个服务器的日志
    • 您不会遇到任何由于夏令时转换而导致给定本地时间出现两次的模糊期
    • 如果您在图表或类似的东西上绘制日志的各个方面,则不会因为夏令时转换而再次出现奇怪的不连续性
    • 您的代码在您的开发机器上的行为与在您的服务器上的行为相同

    所以,你应该:

    • 删除ToLocalTime 调用
    • 请确保您记录的时间戳在末尾包含 Z,以便清楚地表明它是 UTC。
    • 确保使用不变的文化进行日志记录,以避免转换为非公历

    如果您将时间戳存储在数据库中,我建议您也将它们存储在 UTC 中。 某些日期/时间值最好以本地时间存储,但时间戳更具有全局性,代表时间的瞬间,因此 UTC 是用于存储的合适区域。

    【讨论】:

      【解决方案2】:

      由于您根据 Unix time 计算您的 DateTime,因此您的 1430159400000 毫秒(1430159400 秒)生成 2015 年 4 月 27 日星期一 18:30:00 UTC。

      由于您使用ToLocalTime 方法计算本地时间,这会将您当前的时区偏移添加到此DateTime。我强烈怀疑您当前的机器和您的服务器有不同的时区,甚至您当前的UTC offset 等于或大于+05:30,这就是为什么您的ToLocalTime 生成属于一天后的本地时间。

      DateTime 值记录为Local 可能不明确。你不应该那样做。您应该始终将您的DateTime 存储为UTC

      请阅读此类处理的最佳做法;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-24
        • 1970-01-01
        • 1970-01-01
        • 2011-09-01
        • 2016-07-26
        • 1970-01-01
        • 2016-07-12
        • 1970-01-01
        相关资源
        最近更新 更多