azure - Microsoft Azure Webjobs 时区差异

标签 azure datetime timezone azure-webjobs

我有几个 Azure WebJobs,当实体上的给定时间戳被传递时,它们应该从数据库中获取一些实体。问题是我的时区(GMT+1 - 丹麦)截至目前 (DST) 存在 2 小时时差。 因此,WebJobs 目前获取已晚了 2 小时。 在服务中,我使用 DateTime.Now 作为当前时间的标记。 数据库中的时间戳看起来不错。 我需要弄清楚如何使它们同步,并且最好不必将整个服务重写为 DateTime.UtcNow

我已在 Azure 中添加了 WEBSITE_TIME_ZONE 应用程序设置,并将其设置为 浪漫标准时间,这应该是正确的,并且应该根据其他帖子解决问题,但是这个没有帮助。

Microsoft Azure,Webjob, in which timezone a webjob runs if I schedule a webjob to run daily at specified time using cron expression

来自服务的 C# 代码片段:

var now = DateTime.Now;

var orderBatch = await db.OrderEntities
  .Where(o => o.OrderStatus == (int)Status.Accepted)
  .Where(o => o.ExecutionTime.HasValue && o.ExecutionTime < now)
  .Where(o => (o.NextSendTry == null || o.NextSendTry < now))
  .Select(o => new
  {
    OrderId = o.Id
  })
  .Take(100)
  .ToListAsync();

来自 WebJobs 日志的日志片段,其中当前时间是 04:38 而不是 02:38。 有一张订单的执行时间是03:00,所以应该已经取到了,但是直到05:00才取到:

[06/29/2019 02:38:21 > 98c279: INFO] 2019-06-29 04:38:21.618 +02:00 
[INF] 0 orders fetched from db @ 6/29/2019 4:38:21 AM

Web 应用程序应具有浪漫标准时间,并且在此应用程序服务中运行的 Web 作业应具有相同的时区。 因此 DateTime.Now 应该是服务器(Azure Web 应用程序)的当前时间。

----- 更新 -----

根据 Matt 的评论,我们尝试在服务中使用 UTC 时间,方法是使用 .toUniversalTime() 扩展在运行时转换数据库时间,然后再次检查 DateTime.UtcNow 。 它工作正常,数据库中的时间仍然是我们希望的本地时间。

最佳答案

我建议使用DateTimeOffset(.NET)/datetimeoffset(SQL)数据类型而不是将时间戳存储为 DateTime(.NET)/datetime2(SQL)在您的数据库中。

然后您可以将 OrderEntity 属性 ExecutionTime 设置为 DateTimeOffset.Nownew DateTimeOffset(DateTime specificTime)并对您的网络作业代码执行相同的操作。

比较将考虑时区之间的时移。

希望有帮助。干杯!

关于azure - Microsoft Azure Webjobs 时区差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56871617/

相关文章:

c# - Azure Function Blob 触发器将文件复制到文件共享

c# - 日期时间格式一年中的第几天

c# - 时区策略

java - Joda Api 处理 Time Zone for isBefore Not isAfter Now 比较

java - 连接到 Azurite 时身份验证失败

azure - Imagemagick 无法从 tif 转换为 jpg

php - 在 PHP 中将 DateTime 字符串转换为不同的时区

java - TimeZone - getAvailableIDs() - 仅过滤 tzdb 时区

Azure Data Studio - 找不到备份选项

python - pytz.timezone ('Asia/Chongqing' )行为异常