1

我有一个 Windows 服务,每天晚上 3 点到 5 点之间运行。当作业运行时,会发生以下情况:

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 对象来解决这个问题?

4

1 回答 1

0

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

var localTimeUtc = TimeZoneInfo.ConvertTimeToUtc(
  DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local));

//or (much easier)
var localTimeUtc = DateTime.UtcNow;

接着:

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

现在utcMidnight并将yesterdayUtcMidnight涵盖 UTC 时间的所有“昨天”。

第二个注意事项 - 您的 Windows 服务是要处理昨天 UTC 或昨天本地的数据吗?如果数据库中的时间是 UTC,那么您的服务代码应该可以工作 - 但如果它们已作为本地时间输入(可能是默认时间GetDate()?),那么您的处理代码将无法工作。

于 2012-04-23T22:15:45.813 回答