时间戳和 UTC 种类
Timestamp and UTC kind
在我的应用程序中,我收到时间戳,在 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'。这是我在日志中打印此日期时才知道的。我在这里做错了什么!
欢迎提出任何建议。
问候
桑吉萨
目前您正在将 UTC 时间戳转换为系统本地时间 - 并且您的服务器可能与您处于不同的时区。
我强烈建议您以 UTC 格式直接记录 UTC 时间戳。无论 读取 您的日志都可以将其转换为您想要的任何时区的本地时间,但这样更便于携带:
- 您无需知道服务器所在的时区即可理解日志
- 您可以轻松合并来自多个服务器的日志
- 您不会因为夏令时转换而出现两次给定本地时间的歧义期
- 如果您将日志的各个方面绘制在图表或类似的东西上,您就不会因为夏令时转换而再次出现奇怪的不连续性
- 您的代码在您的开发机器上的行为与在您的服务器上的行为相同
所以,你应该:
- 删除
ToLocalTime
调用
- 确保无论您如何记录时间戳,都在末尾包含
Z
,以便清楚它是 UTC。
- 确保您使用不变文化进行日志记录,以避免转换为非公历
如果您将时间戳存储在数据库中,我建议您也将它们存储在 UTC 中。 一些种date/time值最好存储在本地时间,但时间戳更全球化,代表一个瞬间,所以UTC是一个适合存储的区域。
由于您根据 Unix time 计算 DateTime
,因此您的 1430159400000
毫秒(1430159400
秒)生成 2015 年 4 月 27 日星期一 18:30:00 UTC。
并且由于您使用 ToLocalTime
method, this adds your current time zone offset to this DateTime
. I strongly suspect your current machine and your server has different time zones and even your current UTC offset 计算的当地时间等于或大于 +05:30
,这就是为什么您的 ToLocalTime
生成属于一天后的当地时间。
将 DateTime
值记录为 Local
可能会产生歧义。你永远不应该那样做。您应该始终将 DateTime
存储为 UTC
。
请阅读此类处理的最佳实践;
- Daylight saving time and time zone best practices
在我的应用程序中,我收到时间戳,在 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'。这是我在日志中打印此日期时才知道的。我在这里做错了什么! 欢迎提出任何建议。
问候 桑吉萨
目前您正在将 UTC 时间戳转换为系统本地时间 - 并且您的服务器可能与您处于不同的时区。
我强烈建议您以 UTC 格式直接记录 UTC 时间戳。无论 读取 您的日志都可以将其转换为您想要的任何时区的本地时间,但这样更便于携带:
- 您无需知道服务器所在的时区即可理解日志
- 您可以轻松合并来自多个服务器的日志
- 您不会因为夏令时转换而出现两次给定本地时间的歧义期
- 如果您将日志的各个方面绘制在图表或类似的东西上,您就不会因为夏令时转换而再次出现奇怪的不连续性
- 您的代码在您的开发机器上的行为与在您的服务器上的行为相同
所以,你应该:
- 删除
ToLocalTime
调用 - 确保无论您如何记录时间戳,都在末尾包含
Z
,以便清楚它是 UTC。 - 确保您使用不变文化进行日志记录,以避免转换为非公历
如果您将时间戳存储在数据库中,我建议您也将它们存储在 UTC 中。 一些种date/time值最好存储在本地时间,但时间戳更全球化,代表一个瞬间,所以UTC是一个适合存储的区域。
由于您根据 Unix time 计算 DateTime
,因此您的 1430159400000
毫秒(1430159400
秒)生成 2015 年 4 月 27 日星期一 18:30:00 UTC。
并且由于您使用 ToLocalTime
method, this adds your current time zone offset to this DateTime
. I strongly suspect your current machine and your server has different time zones and even your current UTC offset 计算的当地时间等于或大于 +05:30
,这就是为什么您的 ToLocalTime
生成属于一天后的当地时间。
将 DateTime
值记录为 Local
可能会产生歧义。你永远不应该那样做。您应该始终将 DateTime
存储为 UTC
。
请阅读此类处理的最佳实践;
- Daylight saving time and time zone best practices