C# 使用DateTime的前几天计数会导致UTC格式的问题

C# 使用DateTime的前几天计数会导致UTC格式的问题,c#,C#,我有一个每天凌晨3点到5点运行的windows服务。作业运行时,会发生以下情况: var endDate = DateTime.Today.ToUniversalTime(); // Set to midnight var startDate = endDate.AddDays(-1); 夜间运行的查询表示,类似于所有日期的内容当前都存储为UTC: SELECT * FROM Table WHERE CreatedAt BETWEEN startDate AND endDate 这工作得很好

我有一个每天凌晨3点到5点运行的windows服务。作业运行时,会发生以下情况:

var endDate = DateTime.Today.ToUniversalTime(); // Set to midnight
var startDate = endDate.AddDays(-1);
夜间运行的查询表示,类似于所有日期的内容当前都存储为UTC:

SELECT * FROM Table WHERE CreatedAt BETWEEN startDate AND endDate
这工作得很好,它基本上获取了前一天作业运行时的所有数据。我现在正在为此开发一个UI部件,其中用户单击一个按钮以查看将在夜间处理的数据计数

我遇到的问题是,当用户在正常工作时间工作时,单击该按钮,计数将在1天内关闭。只有当地时间在东部沿海东部东部时间晚上8点之后,计数才会正确显示,因为该时间将在UTC时间午夜之后

我试着用以下方法来解决这个问题:

var now = DateTime.Now;
var midnight = DateTime.Today.ToUniversalTime();

var endDate = (now.Day == midnight.Day) ? midnight.AddDays(1) : midnight;
var startDate = endDate.AddDays(-1);
但这是不正确的,因为它只在一天中的某些时候起作用。如果在当地时间午夜后点击该按钮,该按钮将再次关闭一天


有什么聪明的方法可以使用DateTime对象来解决这个问题吗?

您可以在UI中将本地时间转换为UTC;或者只使用DateTime.UtcNow。您必须小心使用ToUniversalTime,因为只有在调用它的DateTime具有Kind==DateTimeKind.Local时,它才起作用:

然后:

var utcMidnight = localTimeUtc.Date;
var yesterdayUtcMidnight = midnight.AddDays(-1);
现在,utcMidnight和yesterdayUtcMidnight将在UTC时间覆盖所有“昨天”

第二,您的windows服务是要处理昨天UTC或昨天本地的数据?如果数据库中的时间是UTC,那么您的服务代码应该可以工作-但是如果它们作为本地时间输入,可能会有默认的GetDate?那么您的处理代码将无法工作

var utcMidnight = localTimeUtc.Date;
var yesterdayUtcMidnight = midnight.AddDays(-1);