Azure App Service - 同步期间DateTime更改

时间:2017-07-05 11:48:52

标签: c# .net azure xamarin azure-mobile-services

我正在开发一个使用Xamarin.Forms和Azure App Service(包括离线同步)的应用程序。

在客户端上有一段代码如下:

appointment.StartDate = System.DateTime.Now;

我们假设约会.StartDate现在 2017-07-05 12:00:00

用户将数据与服务器同步后,会发生以下情况:

enter image description here

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

1 个答案:

答案 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时间转换为应用中的本地时间。