我正在开发一个使用Xamarin.Forms和Azure App Service(包括离线同步)的应用程序。
在客户端上有一段代码如下:
appointment.StartDate = System.DateTime.Now;
我们假设约会.StartDate现在 2017-07-05 12:00:00 。
用户将数据与服务器同步后,会发生以下情况:
SqlLite数据库中的日期(在客户端上):2017-07-05 12:00:00
服务器数据库中的日期:2017-07-05 10:00:00
因此,我假设Azure将我的日期更改为UTC。这可能在技术上是正确的,因为您应始终将UTC存储在数据库中并处理客户端中的时区转换。但不幸的是,服务器数据库已经过时并存储了语言环境日期。
如何让Azure在服务器数据库中存储来自客户端的本地日期而不是UTC?
我尝试将Azure中的WEBSITE_TIME_ZONE属性更改为我的本地时区,但这不起作用:http://www.louischarlesgagnon.com/post/azure-app-service-set-timezone-for-your-web-application
更新06.07.2017:
经过一些进一步的研究,我发现这是一个已知的“问题”。看这里:
https://github.com/Azure/azure-mobile-apps-net-client/issues/131
Azure Mobile Apps saves incorrect datetime in Sqlite database
https://forums.asp.net/t/1808269.aspx?DateTime+issues+with+Azure+c+javascript+sql+so+confused+
阅读本文后,我能够构建一个解决问题部分的解决方案。在客户端,我现在正在做这样的事情。
public System.DateTime? Start
{
get
{
System.DateTime? dateTime = GetValue<System.DateTime?>(_start);
if (dateTime.HasValue)
dateTime = System.DateTime.SpecifyKind(dateTime.Value, System.DateTimeKind.Utc);
return dateTime;
}
set
{
System.DateTime? dateTime = value;
if (dateTime.HasValue)
dateTime = System.DateTime.SpecifyKind(dateTime.Value, System.DateTimeKind.Utc);
SetValue<System.DateTime?>(_start, dateTime);
}
}
这告诉Azure,日期已经是UTC,Azure不必转换。这适用于在客户端创建的System.DateTime现在已成功存储在服务器数据库中而不进行转换的情况。
但现在又出现了另一个问题:
当Azure将存储在服务器数据库中的日期返回给客户端时,Azure会将“UTC日期”转换为本地日期。以下是当前情况的一个例子:
客户日期:06.07.2017 14:30
- &GT;客户端推送日期到服务器
服务器日期:06.07.2017 14:30
- &GT;客户从服务器获取日期
客户日期:06.07.2017 16:30
答案 0 :(得分:1)
但遗憾的是服务器数据库已经过时并存储了区域设置日期。如何让Azure将客户端的本地日期存储在服务器数据库中而不是UTC?
根据您的描述,我建议您可以存储长类型值DateTime.UtcNow.Ticks作为您的日期时间而不是使用日期时间类型。
此值不会在您的服务器数据库中更改,并且可以转换回UTC时间。
如果您想使用时间,可以将Ticks转换回日期时间。
更多细节,您可以参考以下代码:
//get utc time ticks
long i = DateTime.UtcNow.Ticks;
//convert back to local time
DateTime myDate = new DateTime(i).ToLocalTime();
我是正确的,我必须调整我的遗留应用程序,以便他们可以处理UTC?
在我看来,我建议您将UTC时间存储到您的数据库中。然后,您可以将UTC时间转换为本地时间。这是设计应用程序的正确方法。如果有不同的时区客户,您如何将数据库的本地时间转换为客户时区的当地时间?
UTC是世界各地常用的时间标准。世界的计时中心已经同意保持他们的时间尺度紧密同步 - 或协调 - 因此称为协调世界时间。
因此,我建议您使用tolocaltime方法将UTC时间转换为应用中的本地时间。