我有几个Azure WebJobs,当实体上的给定时间戳被传递时,它应该从DB获取一些实体。问题是我的时区(GMT+1 -丹麦),到目前为止有两个小时的差异(DST)。因此,WebJobs目前已经晚了2个小时。在服务中,我使用DateTime.Now作为当前时间的标记。DB中的时间戳看起来很好。我需要弄清楚如何使它们同步,最好不必将整个服务重写为DateTime.UtcNow。
我在Azure中添加了WEBSITE_TIME_ZONE应用程序设置,并将其设置为Romance Standard Time,这应该是正确的,并且应该根据其他帖子修复问题,但这没有帮助。
Microsoft,Webjob,其中,如果我使用cron表达式安排在指定时间每天运行run作业,则该时区将运行。
服务中的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();当前时间为04:38而不是02:38的WebJobs日志片段。有一个命令的执行时间到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 AMweb应用程序应该有Romance Standard Time,在这个应用服务中运行的WebJobs应该有相同的时区。因此,DateTime.Now应该是当前的服务器(Azure )。
-更新
根据Matt的评论,我们尝试在服务中使用UTC时间,方法是使用.toUniversalTime()扩展在运行时转换DB时间,然后对DateTime.UtcNow进行检查。它运行良好,DB中的时间仍然是本地时间,正如我们所希望的那样。
发布于 2019-07-03 17:59:04
我建议使用DateTimeOffset(.NET)/日期时间偏移量(SQL)数据类型,而不是将时间戳作为DateTime(.NET)/datetime2(SQL)存储在数据库中。
然后,您可以在OrderEntity属性ExecutionTime中将DateTimeOffset.Now或新DateTimeOffset(DateTime specificTime)设置为DateTimeOffset.Now或新DateTimeOffset(DateTime specificTime),并对set作业代码执行相同的操作。
比较将考虑时区间的时差。
希望能帮上忙。干杯!
https://stackoverflow.com/questions/56871617
复制相似问题