2009-08-10 3 views
6

Мне нужно сравнить два значения datetime, чтобы определить равенство (точно так же), используя точную точность. Будет ли это лучшим способом сделать это? Мои даты могут иметь секунды и миллисекунды, но я хочу рассмотреть только до минут.Определить равенство значений Datetime с минимальной точностью в LINQ

 where (Math.Abs(datetime1.Subtract(datetime2).TotalMinutes) == 0) 
+0

Я бы взял этот фрагмент и разместил его в качестве ответа на ваш вопрос, чтобы люди могли прокомментировать/проголосовать вверх или вниз по нему отдельно от вашего вопроса –

ответ

11

Проверяется, не будет ли Math.Abs(diff.TotalMinutes) == 0, нет - это проверка, являются ли они точно тем же.

Вы пытаетесь проверить, имеют ли они одну и ту же минуту, или они меньше минуты? Для первого, использования:

where RoundToMinute(dateTime1) == RoundToMinute(dateTime2) 

, заявив:

public static DateTime RoundToMinute(DateTime time) 
{ 
    return new DateTime(time.Year, time.Month, time.Day, 
         time.Hour, time.Minute, 0, time.Kind); 
} 

Для второго, использования:

where Math.Abs((dateTime1 - dateTime2).TotalMinutes) < 1 

Вы должны рассмотреть то, что вы хотите, чтобы результат в том случае, один из них является локальным, а один - в UTC, кстати ...

Обратите внимание, что здесь нет ничего конкретного LINQ - если вы используя LINQ to Objects. Если вы используете LINQ to SQL, то, очевидно, вы не можете использовать локальные методы, и нам придется снова искать ...

EDIT: Я все еще очень неясен в вашем вопросе. Если вам нужно, чтобы быть точно ту же дату/время, это легко (оставляя в стороне возможный местный против вопроса UTC):

where dateTime1 == dateTime2 

Однако, что возникает вопрос о том, почему вы упоминаете «минута точности» в название вопроса или «использование до мельчайшей точности» в теле вопроса. .

+0

Jon - Я опасался использовать RoundToMinute (datetime), так как приходящие даты могут иметь секунды на них, и я хотел бы сохранить точную точность. Хотя Math.abs может выбросить его, я думаю? Я мог бы (должен) снять секунды, прежде чем использовать даты курса! Но чтобы ответить на ваш запрос, да, мне нужно, чтобы они были точно такими же. – PreethaA

+1

@Preetha: Если вам нужно, чтобы они были точно такими же, то каким образом вам нужна «минутная точность» по заголовку вопроса? –

+0

Если у вас есть значения даты и времени, в которых вы не можете быть уверены в том, есть ли у них секунды, но все, что вам нужно, это то, что они точно такие же. Я предполагаю, что часть stripseconds должна быть полностью отдельной и предшествует фактическому сравнению значений. Так это будет работать в этом случае. – PreethaA

0

Как насчет

where (Math.Floor(datetime1.Ticks/600000000) == Math.Floor(datetime2.Ticks/600000000)) 

?

+0

именно то, о чем я думал, когда увидел вопрос –

+0

Если вы имеете в виду 'datetime1.Millisecond', это неправильно - значение всегда находится между 0 и 999. –

0

Благодаря Аллен, будет делать это (! До сих пор выяснить, как именно работает этот процесс) Вот фрагмент кода, указывающий ответ я пришел с первоначально:

(Math.abs (datetime1.Subtract (datetime2) .TotalMinutes) == 0)

Background: В моем предложении WHERE запроса LINQ (отсюда однострочный) мне нужно проверить, совпадают ли datetime1 и datetime2. Рассматриваемые значения даты и времени - это даты штампа для других значений, используемых в запросе.

+0

Как отредактировано в моем ответе, просто используйте dateTime1 == dateTime2. Пожалуйста, обновите свой вопрос, чтобы избавиться от «использования до мельчайшей точности», поскольку это не то же самое, что «точно так же». –