时间戳和UTC类型

时间:2015-05-22 04:36:44

标签: c# date datetime timestamp utc

在我的应用程序中,我收到时间戳,并在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'。这我知道什么时候我在日志中打印这个日期。我在这里做错了什么! 任何建议都是最受欢迎的。

此致 桑杰塔

2 个答案:

答案 0 :(得分:1)

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

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

  • 您不需要知道服务器所在的时区以了解日志
  • 您可以轻松地合并来自多个服务器的日志
  • 由于夏令时转换,给定的本地时间发生两次,您不会有任何歧义的时期
  • 如果您在图表或类似内容上绘制日志的各个方面,由于夏令时过渡,您不会再次出现奇怪的不连续性
  • 您的代码在开发计算机上的行为与服务器上的行为相同

所以,你应该:

  • 删除ToLocalTime来电
  • 请确保您在结束时记录的时间戳包括Z,以便它在UTC中清除。
  • 确保您使用不变文化进行日志记录,以避免转换为非Gregorian日历

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

答案 1 :(得分:1)

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

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

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

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