Azure 应用服务 - 同步期间的日期时间更改

Azure App Service - DateTime changes during Sync

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

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

appointment.StartDate = System.DateTime.Now;

假设 appointment.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

2017 年 7 月 6 日更新:

经过进一步研究,我发现这是一个已知的"problem"。

看这里:

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 现在无需转换即可成功存储在服务器数据库中的情况。

但是现在又出现了一个问题:

当Azurereturns将服务器数据库中存储的日期传给客户端时,Azure会将"UTC date"转换为本地日期。以下是当前情况的示例:

客户日期:06.07.2017 14:30

-> 客户端向服务器推送日期

服务器日期:06.07.2017 14:30

-> 客户端从服务器获取日期

客户日期:06.07.2017 16:30

But unfortunately the server database is old and stores locale dates.How can I make Azure to store the local date from the client in the server database and not UTC?

根据您的描述,我建议您可以存储 long 类型值 DateTime.UtcNow.Ticks 作为您的 datetime 而不是使用 datetime 类型。

此值不会在您的服务器数据库中更改,并且可以转换回 UTC 时间。

当您想使用时间时,您可以将 Ticks 转换回日期时间。

更多细节,您可以参考这些代码:

    //get utc time ticks
    long i = DateTime.UtcNow.Ticks;
    //convert back to local time
    DateTime myDate = new DateTime(i).ToLocalTime();

I'm correct that I have to adapt my legacy applications so that they can deal with UTC?

在我看来,我建议您可以将 UTC 时间存储到您的数据库中。然后您可以将 UTC 时间转换为本地时间。这是设计应用程序的正确方法。如果有不同时区的客户,如何将数据库本地时间转换为客户时区本地时间?

UTC is the time standard commonly used across the world. The world's timing centers have agreed to keep their time scales closely synchronized - or coordinated - therefore the name Coordinated Universal Time.

所以我建议您可以使用 tolocaltime 方法在您的应用程序中将 UTC 时间转换为本地时间。