从本地服务器迁移到Azure:TIMEZONE UTC。怎么解决?

时间:2011-06-28 09:10:58

标签: datetime azure utc datetimeoffset

我考虑到根据规格, 应该在位于意大利的服务器上运行,客户只能是意大利人。

大约一个月前,我的老板决定将其全部用于Azure。

一切顺利。唯一能给我带来一些问题的是时间服务器是UTC。

解决方案是:

A)简单

将启动脚本修改为服务器时间( http://netindonesia.net/blogs/wely/archive/2011/06/26/setting-timezone-in-windows-azure.aspx

B)更加费力

更改以使任何应用程序使用UTC并显示正确转换为当地时间的时间。

如果我选择解决方案A,我怀疑服务器设置了不同时区的事实可能会以某种方式与Azure产生冲突。

这是真的吗?

3 个答案:

答案 0 :(得分:12)

我已经要求MS支持。

这是回复:

建议不要使用启动任务更改Azure虚拟机上的服务器时间,您应该在代码中使用TimeZoneInfo.ConvertTimeFromUTCTime等方法。

所以我不会改变服务器时区。 等待来自支持的响应我发现SqlServer 2008具有完美的DateTimeOffset数据类型!

http://blogs.msdn.com/b/davidrickard/archive/2012/04/07/system-datetime-good-practices-and-common-pitfalls.aspx

答案 1 :(得分:4)

几年前,我已经开始设计我的所有应用程序,从而在客户端和服务器上使用UTC处理日期,并且从那以后就没有回头了。

答案 2 :(得分:2)

在客户端和服务器端,DateTime.Now和DateTime.Today存在两个问题。 将DateTime对象从客户端传递到Azure时,其Kind等于Local,它包含时区信息。 (2011年6月10日,上午12:30 - 7)

但是,将数据保存到数据库时,区域信息将丢失。随后,当从数据库中读取此字段时,它会创建具有Utc区域的DateTime(2011年6月10日,上午12:30 0)

最终,您的客户端错误地读取了日期时间。

在客户端有几种方法可以解决此问题。

1)在方法参数和数据库中将DateTime转换为DateTimeOffset。这将保证您的本地区域(即PST)将保存在db

2)使用DateTime.SpecifyKind(dateTime,DateTimeKind.Unspecified) - 这样就没有指定DateTime的类型,并随后保存在db中。

var timeNow = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Unspecified);
serviceClient.SaveTime(timeNow);
var dateTime = serviceClient.GetTime();

小心在服务器端调用DateTime.Now。您最好使用DateTime.UtcNow。此时间不应用于业务数据。理想情况下,您需要重构代码并从客户端传递DateTime或DateTimeOffset。