2016-05-16 10 views
0

Я получаю DateTime от клиента: DateTime CurrentTimeOnClient
У меня есть DateTimeOffset я получаю из БД: DateTimeOffset DateTimeOffsetFromDbСравнение Даты только на DateTime/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; 
} 

Тогда я очистить DateTimeOffset OBJ из БД таким же образом (хотя, очевидно, без необходимости их преобразования) и сравнить их.

bool foo = dateFromDb > dateFromClient; 

P.S. Я знаю, что на эти вопросы ответили отдельно, но я хотел бы посмотреть, не сделал ли я вопиющих ошибок или если я переусердствовал. (но опять же, предлагаемое решение .Date, похоже, не работает).

Edit: @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

+1

Почему эти методы «асинк»? Без каких-либо утверждений 'await', которые будут запускаться синхронно. – juharr

+0

Наш API - асинхронный, поэтому мы помогаем асинхронным помощникам, если нам нужно использовать их с асинхронными конечными точками. Насколько я знаю, они выполняются синхронно (по умолчанию, если ожидание не используется). – VSO

+1

Но нет смысла делать что-то «асинк», если это не так. Это просто даст любому, кто использует ваш API, впечатление, что оно есть. – juharr

ответ

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); 
     } 
+0

В принципе, ваш ответ очищает время, но не смещение часового пояса. Поэтому, когда я получаю его из db, он корректирует время смещения часового пояса, которое может отбросить дату. – VSO

+0

James, это похоже на работу, спасибо.Я думал, что это изменит дату или время (вместо того, чтобы просто устанавливать смещение, оно будет конвертироваться в UTC, если вы знаете, что я имею в виду). Похоже, я ошибаюсь. Я проведу более тщательно и обязательно вернусь, чтобы принять ответ. – VSO

+0

Отлично. Я бы подумал, что это ответ «покупатель-остерегайтесь». Вы теряете информацию при этом преобразовании, поскольку поле Date было точным только при проверке с исходным контекстом времени/смещения. В этом случае я предполагаю, что у вас есть какая-то причина заранее знать, что информация о времени/смещении из БД является недействительной или неактуальной и может быть безопасно усечена. Тестовые примеры из вашей БД с помощью DateTimes, близких к полуночи (в пределах диапазона смещения), помогут искоренить правду об этом. –

1

Это странно, что .Date() не работает. Это то, что я делал в прошлом, когда речь шла о такой проблеме. Затем я разбираю строку даты даты и времени. Поэтому я делаю код ниже.

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

Затем попробуйте сравнить его и посмотреть, работает ли это?

+0

Это кажется жизнеспособным вариантом в качестве последнего средства. – VSO