仅比较 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);
}
我从客户端收到一个日期时间: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);
}