我设计应用程序时考虑到,根据规范,应该在位于意大利的服务器上运行,并且客户端将仅为意大利人。
大约一个月前,我的老板决定把一切都放在Azure上。
一切顺利。唯一给我带来问题的是时间服务器是UTC。
解决方案是:
A)简单
将启动脚本修改为服务器时间(http://netindonesia.net/blogs/wely/archive/2011/06/26/setting-timezone-in-windows-azure.aspx)
B)更费力
更改以使任何应用程序使用UTC,并显示正确转换为本地时间的时间。
如果我选择解决方案A,我的怀疑是,服务器设置为不同的时区可能会以某种方式与Azure产生冲突。
这是真的吗?
我已请求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
几年前,我开始设计我的所有应用程序,以便在客户端和服务器上使用UTC处理日期,此后我再也没有回头看。
DateTime有两个问题。现在和日期时间。今天在客户端和服务器端。当您将DateTime对象从客户端传递到Azure时,其Kind等于Local,并且包含时区信息。(2011年6月10日,上午12:30-7)
但是,当您将其保存到数据库中时,区域信息将丢失。随后,当从数据库中读取该字段时,它会创建带有Utc区域的DateTime(2011年6月10日,凌晨12:30)
最终,您的客户错误地读取了日期时间。
有几个选项可以在客户端解决此问题。
1) 在方法参数和数据库中将DateTime转换为DateTimeOffset。这将保证您的本地区域(即PST)将保存在数据库中
2) 使用DateTime。SpecifyKind(dateTime,DateTimeKind.Unspecified)-通过这种方式,dateTime的类型是未指定的,然后按原样保存在数据库中。
var timeNow = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Unspecified);
serviceClient.SaveTime(timeNow);
var dateTime = serviceClient.GetTime();
请小心调用DateTime。现在在服务器端。你最好使用DateTime。UtcNow。这段时间不应该用于业务数据。理想情况下,您需要重构代码并从客户端传递DateTime或DateTimeOffset。