2017-07-05 50 views
1

我正在使用Xamarin.Forms和Azure应用程序服务(包括脱机同步)的应用程序。Azure应用服务 - 在同步期间更改日期时间

在客户端上有这样一段代码:

appointment.StartDate = System.DateTime.Now; 

我们假设appointment.StartDate现在2017年7月5日12:00:00

用户后同步数据对服务器,出现这种情况:

enter image description here

日期在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

+0

您可以在本地时间转换为UTC,并将其存储!如果需要,我可以为您提供代码! – Sridharan

+0

请查看我在第一篇文章中的更新 – OPunktSchmidt

回答

1

但不幸的是,服务器数据库是旧的,并且存储了本地日期。如何让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时间转换为您应用中的本地时间。

+0

我同意。这在技术上是一个很好的解决方案。不幸的是,有很多基于服务器数据库的遗留应用程序。我不能只改变服务器数据库中的数据类型来存储UTC(滴答)。 这意味着我将不得不基于此数据库更改所有应用程序以使用新的utc日期。 我需要无服务器数据库的解决方案改变 – OPunktSchmidt

+0

你能告诉我你现在已经使用的数据库? Azure的SQL数据库或其他东西? –

+0

我们使用SQL Server 2016.安装在本公司的本地机器上。 Azure App Service只是应用程序(客户端)和我们公司的sql server之间的代理。 – OPunktSchmidt