仅在DateTime / DateTimeOffset对象上比较日期

时间:2016-05-16 14:00:15

标签: c# datetime datetimeoffset

我收到客户的日期时间:DateTime CurrentTimeOnClient
我有一个来自db:DateTimeOffset DateTimeOffsetFromDb

的DateTimeOffset

我需要比较两个日期,忽略时间和时区。换句话说,我只想要两个对象的原始日期。我尝试使用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; 
}

然后我以相同的方式从db中清除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

Db结果:2008-05-01 00:00:00.0000000 -04:00

2 个答案:

答案 0 :(得分:1)

奇怪的是.Date()不起作用。这是我过去用这样的问题解决的问题。我解析日期时间日期字符串然后比较。所以我做了以下代码。

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

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

答案 1 :(得分:1)

忘记了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);
        }