我有几个azure webjobs,当通过该实体上的给定时间戳时,应该从db中获取某些实体。问题是我的时区(GMT 1-丹麦(,到现在为2小时的差异(DST(。因此,WebJobs目前要为时已晚2个小时。在服务中,我将DateTime.Now
用作当前时间的标记。DB中的时间戳看起来不错。我需要弄清楚如何使它们保持同步,最好不要将整个服务重写为DateTime.UtcNow
。
我在Azure中添加了WEBSITE_TIME_ZONE
应用程序设置,并将其设置为Romance Standard Time
,该设置应该是正确的,应该根据其他帖子解决问题,但这无济于事。
Microsoft Azure,WebJob,如果我安排WebJob的时区,请使用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应用程序应具有Romance Standard Time
,并且在此应用程序服务中运行的WebJobs应该具有相同的时区。因此,DateTime.Now
应该是服务器(Azure Web应用程序(当前时间。
------ 更新 ------
根据Matt的评论,我们尝试使用.toUniversalTime()
扩展程序在运行时转换DB时使用UTC时间,然后再次对其进行检查DateTime.UtcNow
。它运行良好,DB中的时代仍然是我们希望的当地时代。
我建议使用dateTimeOffset(.net(/dateTimeOffset(sql(数据类型,而不是将时间戳作为dateTime(.net(/datetime2(sql(在数据库中。p>然后,您可以在订单属性executiontime中设置为dateTimeOffset..now或new DateTimeOffset(DateTime specifictime(,并为您的WebJob代码执行相同的操作。
比较将考虑到时区之间的时间表。
希望它有帮助。欢呼!