【发布时间】:2017-07-05 11:48:51
【问题描述】:
我正在开发一个使用 Xamarin.Forms 和 Azure 应用服务(包括离线同步)的应用。
在客户端有这样一段代码:
appointment.StartDate = System.DateTime.Now;
假设约会。开始日期现在是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
-> 客户端推送日期到服务器
服务器日期:06.07.2017 14:30
-> 客户端从服务器获取日期
客户日期:06.07.2017 16:30
【问题讨论】:
-
您可以将您的本地时间转换为UTC并存储它!如果需要,我可以为您提供代码!
-
请在第一篇文章中查看我的更新
标签: c# .net azure xamarin azure-mobile-services