Azure应用服务 - 在同步期间更改日期时间
我正在使用Xamarin.Forms和Azure应用程序服务(包括脱机同步)的应用程序。Azure应用服务 - 在同步期间更改日期时间
在客户端上有这样一段代码:
appointment.StartDate = System.DateTime.Now;
我们假设appointment.StartDate现在2017年7月5日12:00:00。
用户后同步数据对服务器,出现这种情况:
日期在SqlLite数据库(客户端):2017年7月5日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
更新2017年6月7日:
经过进一步的研究,我发现,这是一个已知的“问题”。
看看这里:
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的返回存储在服务器数据库中的客户端的日期,天青转换“UTC日期”到本地日期。以下是当前情况的示例:
客户端日期:06.07。2017年14:30
- >客户端推送日至服务器
服务器日期:2017年6月7日14:30
- >客户端从服务器获取日期
客户日期:2017年6月7日16 :30
但不幸的是,服务器数据库是旧的,并且存储了本地日期。如何让Azure将来自客户端的本地日期存储在服务器数据库中而不是UTC?
根据您的描述,我建议您可以存储长类型值DateTime.UtcNow.Ticks作为您的日期时间不使用日期时间类型。
该值将不会在你的服务器数据库被改变,它可以被转换回UTC时间。
当你想用的时候,你可以转换蜱回日期时间。
更多细节,你可以参考这些代码:
//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时间转换为您应用中的本地时间。
我同意。这在技术上是一个很好的解决方案。不幸的是,有很多基于服务器数据库的遗留应用程序。我不能只改变服务器数据库中的数据类型来存储UTC(滴答)。 这意味着我将不得不基于此数据库更改所有应用程序以使用新的utc日期。 我需要无服务器数据库的解决方案改变 – OPunktSchmidt
你能告诉我你现在已经使用的数据库? Azure的SQL数据库或其他东西? –
我们使用SQL Server 2016.安装在本公司的本地机器上。 Azure App Service只是应用程序(客户端)和我们公司的sql server之间的代理。 – OPunktSchmidt
您可以在本地时间转换为UTC,并将其存储!如果需要,我可以为您提供代码! – Sridharan
请查看我在第一篇文章中的更新 – OPunktSchmidt