【问题标题】:Why is my Azure Function App Timestamp an hour less为什么我的 Azure Function App 时间戳少了一个小时
【发布时间】:2018-09-26 19:39:13
【问题描述】:

我有一个每五分钟运行一次的 Azure Function App。该文档有一个时间戳字段,使用

DateTime.Now

我住在英国,目前是英国夏令时间 26-09-18,比格林威治标准时间早 1 小时。我的 Azure 数据中心位于英国南部。时间戳错了一小时。例如。 20:01 在文档中存储为 19:01。我该如何纠正这个问题?

【问题讨论】:

  • 我试过日期时间。 UtcNow 和 DateTimeOffset 都没有将时间戳调整为 BST,我添加了 WEBSITE_TIME_ZONE GMT Standard Time 和 W.Europe Time 等条目没有改变 timeStamp

标签: c# azure azure-functions


【解决方案1】:

您可以在代码中处理此问题,对于英国,您可以使用以下应自动调整夏令时的内容。

TimeZoneInfo ukTimeZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");

DateTime utcDate = new DateTime(2019, 1, 1, 0, 0, 0, DateTimeKind.Utc);
DateTime ukTime = TimeZoneInfo.ConvertTimeFromUtc(utcDate, ukTimeZone);
Console.WriteLine(utcDate == ukTime);

在 1 月 1 日,ukTime 的值应等于 UTC,因为英国当时使用的时区是 GMT 时区,等于 UTC .


在 6 月 1 日,英国的时间应该比 UTC 早一个小时,因为英国将在一年中的那个时候切换 BST 时区。

utcDate = new DateTime(2019, 6, 1, 0, 0, 0, DateTimeKind.Utc);
ukTime = TimeZoneInfo.ConvertTimeFromUtc(utcDate, ukTimeZone);
Console.WriteLine(utcDate == ukTime.AddHours(-1));

【讨论】:

  • 成功了! Howver 不确定 .Dump() 是什么? TimeZoneInfo.FindSystemTimeZoneById("GMT 标准时间").Dump();
  • 哎呀!...这是一个名为 LINQPad 的应用程序的功能,它就像 C# 的暂存器,看到上图中的表格了吗?我使用 LINQPad 转储任何对象的状态,使用 .Dump() 方法获取这些表(以及任何其他对象的状态),只是忘记在发布之前将其删除
  • 听起来很有趣!
  • 这只是冰山一角,它还有更多功能,而且它的高级版完全物有所值,多年来为我节省了无数小时
  • 我偷偷怀疑您正在使用转换后的时区保存到数据库,然后在检索值保存后,再次转换这些值,这将使时间比 BST 提前 1 小时.我的建议是始终始终存储为 UTC,并且仅在需要时将其转换为本地时间。
【解决方案2】:

无服务器代码的想法是抽象出代码物理运行的位置。因此,Azure Functions 默认为 UTC 时间。您可以通过将WEBSITE_TIME_ZONE 添加为本地时间作为应用设置来设置本地时区。见Can I set specific time zone to Azure Functions app?

【讨论】:

  • 虽然有这个设置,但一般不应该使用它。而是在代码中处理它。 DateTime.UtcNowTimeZoneInfo.ConvertTime
  • 是的,但没有英国代码......只有格林尼治标准时间,正如我所说,它比英国夏令时晚一个小时
  • @MattJohnson 我同意。此外,使用 DateTimeOffset 而不是 DateTime 将缓解很多时区问题,因为它实际上知道它的时区。
  • DateTime.UtcNow 不改变文档时间戳我查过了。
【解决方案3】:

Azure Functions 默认为 UTC。

  • 对于 Windows 添加设置 WEBSITE_TIME_ZONE 并将值设置为您的 TimeZone
    • 例如:WEBSITE_TIME_ZONE = GMT 标准时间
  • 对于 Linux,添加设置 TZ 并将值设置为您的时区
    • 例如:TZ = 欧洲/里斯本

对于 Windows 时区值检查here
对于 Linux 时区值检查 here

【讨论】:

  • 谢谢你
  • 还有 3 小时的差异,也许我也需要更改时区进行存储?由于函数使用存储
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 2021-01-28
  • 2011-11-20
  • 2014-07-22
  • 1970-01-01
相关资源
最近更新 更多