我有几个 Azure WebJobs,当实体上的给定时间戳被传递时,它们应该从数据库中获取一些实体。问题是我的时区(GMT+1 - 丹麦)截至目前 (DST) 存在 2 小时时差。
因此,WebJobs 目前获取已晚了 2 小时。
在服务中,我使用 DateTime.Now
作为当前时间的标记。
数据库中的时间戳看起来不错。
我需要弄清楚如何使它们同步,并且最好不必将整个服务重写为 DateTime.UtcNow
。
我已在 Azure 中添加了 WEBSITE_TIME_ZONE
应用程序设置,并将其设置为 浪漫标准时间
,这应该是正确的,并且应该根据其他帖子解决问题,但是这个没有帮助。
来自服务的 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.Now或new DateTimeOffset(DateTime specificTime)并对您的网络作业代码执行相同的操作。
比较将考虑时区之间的时移。
希望有帮助。干杯!
关于azure - Microsoft Azure Webjobs 时区差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56871617/