仅比较 DateTime/DateTimeOffset 个对象的日期

Comparing Dates Only on DateTime/DateTimeOffset Objects

我从客户端收到一个日期时间:DateTime CurrentTimeOnClient
我有一个从数据库获得的 DateTimeOffset:DateTimeOffset DateTimeOffsetFromDb

我需要比较两个日期,忽略时间和时区。换句话说,我只想要两个对象的原始日期。我尝试使用 FooDateTimeOffset.DateTime.Date 但它似乎仍然影响时间,所以我现在拥有的是:

DateTimeOffset clientDateTimeOffSet = DateTime.SpecifyKind(CurrentTimeOnClient, DateTimeKind.Utc);
clientDateTimeOffSet = await RemoveTimeComponentFromDateTimeOffset(clientDateTimeOffSet);
clientDateTimeOffSet = await SetTimeZoneOffsetToZero(clientDateTimeOffSet);

以及辅助方法:

public async Task<DateTimeOffset> SetTimeZoneOffsetToZero(DateTimeOffset dateTimeOffSetObj)
{
    TimeSpan zeroOffsetTimeSpan = new TimeSpan(0, 0, 0, 0, 0);
    return dateTimeOffSetObj.ToOffset(zeroOffsetTimeSpan);
}

public async Task<DateTimeOffset> RemoveTimeComponentFromDateTimeOffset(DateTimeOffset dateTimeOffSetObj)
{
    DateTime dateWithZeroedTime = new DateTime(dateTimeOffSetObj.Year, dateTimeOffSetObj.Month, dateTimeOffSetObj.Day, 0, 0, 0);
    return dateWithZeroedTime; 
}

然后我以相同的方式从数据库中清除 DateTimeOffset obj(虽然显然不需要转换它们)并比较它们。

bool foo = dateFromDb > dateFromClient;

P.S。我知道这些问题已经单独回答了,但我想看看我是否犯了任何明显的错误,或者我是否做得过头了。 (但同样,建议的 .Date 解决方案似乎不起作用)。

编辑:@James

    //TESTING
    var testDateAndTime = new DateTimeOffset(2008, 5, 1, 8, 6, 32,new TimeSpan(1, 0, 0));
    //This is just some db object that has a date field that I had on hand
    var anncmnt = db.Announcements.First(a => a.Id == 13);

    //CLEAN TIME AND DATE
    testDateAndTime = testDateAndTime.DateTime.Date; 

    anncmnt.EndDate = testDateAndTime;
    await db.SaveChangesAsync(); 
    //TESTING

数据库结果:2008-05-01 00:00:00.0000000 -04:00

奇怪的是 .Date() 不起作用。这是我过去在处理此类问题时所做的事情。我解析日期时间日期字符串然后进行比较。所以我做了下面的代码。

dateFromDb = DateTime.Parse(dateFromDb.ToShortDateString());
dateFromClient= DateTime.Parse(dateFromClient.ToShortDateString());

然后尝试比较它,看看是否有效?

忘记了 UTC。尝试使用 SpecifyKind 方法。它似乎可以满足您的需求,并通过了我下面的快速单元测试:

        //TESTING
        for (var hr = 0; hr < 24; hr++)
        {
            var testDateAndTime = new DateTimeOffset(2008, 5, 1, hr, 6, 32, new TimeSpan(1, 0, 0));
            var noOffsetDate = DateTime.SpecifyKind(testDateAndTime.Date, DateTimeKind.Utc);
            Console.WriteLine(noOffsetDate);
        }