【问题标题】:Azure App Service - DateTime changes during SyncAzure 应用服务 - 同步期间的日期时间更改
【发布时间】: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


【解决方案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时间转换为本地时间。

【讨论】:

  • 我同意。这在技术上是一个很好的解决方案。不幸的是,有很多基于服务器数据库的遗留应用程序。我不能只更改服务器数据库中的数据类型来存储 UTC(滴答声)。这意味着我必须更改基于此数据库的所有应用程序以使用新的 UTC 日期。我需要一个不改变服务器数据库的解决方案
  • 您能告诉我您现在使用的是哪个数据库吗? Azure sql 数据库还是别的什么?
  • 我们使用 SQL Server 2016。安装在我们公司的本地机器上。 Azure App Service只是我们公司的app(客户端)和sql server之间的代理。
  • 根据您的测试,为什么您总是需要将服务器日期时间更改为本地时间?如您所见,Azure 将 UTC 时间存储到本地服务器,它会自动将本地时间返回给客户端。在我看来,这是对的。
  • 当然可以。但这仅适用于客户端应用程序使用 Azure SDK 的情况。有很多基于数据库的遗留应用程序。这些应用程序希望本地日期出现在数据库中,但 Azure 存储 UTC 日期。让我澄清一下:对于我当前的项目(带有 Azure 后端的 Xamarin 应用程序),一切都很完美。但是,当其他应用程序(具有遗留代码库,不使用 Azure SDK)访问由 Xamarin 应用程序生成的日期字段时,事情变得很奇怪。我是正确的,我必须调整我的旧应用程序以便它们可以处理 UTC?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
  • 2021-12-18
相关资源
最近更新 更多