我收到客户的日期时间:DateTime CurrentTimeOnClient
我有一个来自db: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;
}
然后我以相同的方式从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
答案 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);
}