gpt4 book ai didi

asp.net-mvc - 在 Azure WebRole 中将 UTC 转换为本地时区

转载 作者:行者123 更新时间:2023-12-03 06:02:46 24 4
gpt4 key购买 nike

快速环境概述:

我有一个 ASP.NET MVC/AngularJS 应用程序,最终作为 Azure Webrole 托管。数据存储在同一 Azure 数据中心(通过 MongoLab)托管的 MongoDB 中。开发环境和临时环境(Azure)指向相同的MongoDB数据库,因此看到完全相同的数据。

问题:

应用程序的各个用户及其首选时区以字符串 (TimezoneID) 的形式存储。应用程序中的所有日期均存储为 UTC 时间。 UTC 时间与用户特定时区之间的转换是通过最终调用的扩展方法在服务器上完成的:

return TimeZoneInfo.ConvertTimeFromUtc(UtcDate, _lookup[TimeZoneID]);

整个应用程序中没有任何地方有 DateTime.Now 或我希望使用服务器时间设置的任何其他日期转换。

在应用程序的特定区域中,日期存储在 Mongo (UTC) 中。我可以确认日期已正确存储为 UTC(基于与本地时间的偏移)。当我从数据存储中检索该日期并将其转换回我的本地时间(中部标准时间)时,我跳过上面的代码行,转换工作正常并且设置了本地时间。结果作为 API 调用的 Json 结果的一部分发送到客户端浏览器,并正确显示给用户。在传输过程中,MVC Json 序列化器将日期时间解析为类似于以下的格式:

EventDate: "/Date(1399407153971)/"

我用 Javascript 解析它并相应地显示,一切都很好。

当我将完全相同的代码部署到 Azure(指向 Mongo 中完全相同的数据存储)时,通过 API 调用得出的结果似乎已应用 UTC 转换两次(意味着常规 6 小时 UTC 偏移量为应用了两次,显示的日期比 UTC 早 12 小时...比我想要的早 6 小时)。

我已经将 Mongo 中存储的时间更新了一两分钟,以确保双方都更新了(验证相同的数据)。我修改了本地计算机的日期/时间设置,以查看它是否对我的本地结果有任何影响,但事实并非如此。我已经更改了应用程序中所选用户的时区,并且我的本地结果和 Azure 返回的结果都根据中部标准时间和新时区之间的 UTC 偏移量差异进行调整(这意味着如果我切换到山地时间,则两者的结果本地结果和 Azure 结果调整了 1 小时...但仍相差 6 小时)。我已通过 Chrome 开发工具确认,根据站点命中是删除 (Az​​ure) 环境还是本地环境(这意味着它没有被错误修改),在客户端(通过 Json)检索到的相关日期是不同的事后客户端上的任何位置)

这是最能说明问题的:

如果我在将日期返回给客户端之前将其转换为字符串,则发送的字符串在 Json 响应中显示正确。如果我将其保留为 .NET DateTime 类型(作为复杂对象的属性),Json 序列化程序似乎会再次翻译它,但仅当托管在 Azure 中时。这表明这个问题与我返回的日期的 DateTimeKind 有关。尽管如此,在这一点上,我在几周的时间里迷失了方向,无法理解为什么我的本地环境和 Azure 主机环境在序列化方面存在差异,以及为什么一个东西一次是正确的,而另一个则将其转换两次。如果 DateKindTime 错误,两个环境是否不会执行相同的转换?

感谢您阅读本文,如果有任何想法可以解决任何人的问题,我将不胜感激。

最佳答案

在没有看到更多代码的情况下很难确定,但是问题是否出在输入途中的转换,而不是输出的转换上?您说您正在使用 TimeZoneInfo.ConvertTimeFromUtc 进行输出。您是否也在另一侧使用 TimeZoneInfo.ConvertTimeToUtc ?如果是这样,这可能是获取您本地时区的来源。

您还可能在某个地方调用 DateTime.ToUniversalTime,它再次使用本地时区。

另一个可能是罪魁祸首的区域 - 当您从 Mongo 检索值时,请检查返回值的Kind。如果它们是未指定,那么当它们被序列化为 JSON 时,它们将被视为本地。基本上,在幕后有一个 ToUniversalTime 调用。因此,您可能需要在输出之前显式调用 DateTime.SpecifyKind 将值设置为 Utc

对于 Azure,它遵循将服务器时区设置为 UTC 的最佳实践。您可以在自己的计算机上尝试一下,看看是否得到类似的结果。

当然,您根本不希望服务器的时区影响结果。

您可能需要考虑使用 minimal, complete, and verifiable example 创建一个新项目。这将帮助您验证您的假设,并可能找到问题的根源。如果仍然失败,那么您就可以更好地寻求帮助。

关于asp.net-mvc - 在 Azure WebRole 中将 UTC 转换为本地时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23504830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com