2016-05-30 8 views
2

Я пытаюсь показать состояние открытого или закрытого хранилища на основе временного диапазона, хранящегося в базе данных.найти, если текущее время падает между несколькими диапазонами времени.

Каждый магазин может иметь 2 часы работы

Пример:

09:00 до 11:00 утра и 01:00 вечера до 10:00 вечера

работает для одного времени диапазон:

IEnumerable<Timings> timings = allStore.ToList(); // from database 

foreach (var storetime in timings) 
{ 
TimeSpan openSpan = TimeSpan.FromTicks((long)storetime.OpenTime); 

TimeSpan openLocalTime = TimeConversions.UTCTimeToLocalTime(openSpan); 

DateTime openDatetime = DateTime.Today.Add(openLocalTime); 

string openDisplayTime = openDatetime.ToString("hh:mm tt"); 

..... 

TimeSpan closeLocalTime = TimeConversions.UTCTimeToLocalTime(closeSpan); 

if ((now > openLocalTime) && (now < closeLocalTime)) 
{       
//Store is Open   
} 

else 
{ 
//Store is Closed 
} 

} 

несколько диапазонов:

IEnumerable<Timings> timings = allStore.ToList(); // from database 

if((timings.Any(now > d=>d.OpenTime))) // can i use Any ? 
{ 

} 

table описание.

Любая помощь будет отличной.

+0

Решение должно быть в C#? ИМО было бы лучше написать его непосредственно в SQL вместо того, чтобы получать все время открытия. – martin

+0

Я не понимаю ваш код. Почему 'openLocalTime'' Timespan', а не 'DateTime' (то же самое подходит для близкого времени). Что такое 'TimeConversions.UTCTimeToLocalTime' и какой тип объекта' Timings'? – Philippe

+0

@Philippe, я просто использую тики, как указано [здесь] (http://stackoverflow.com/a/8504020/2218697). Я сохранил тики в базе данных, так как «BigInt» и «TimeConversions.UTCTimeToLocalTime» используется для преобразования UTC привязывается к местному временному интервалу, тайминги - это список таймингов для каждого магазина, я обновил сообщение. надеюсь, это поможет. – stom

ответ

0

Да, вы можете использовать Any, так как вам нужно только текущее время находиться в пределах диапазона .

IEnumerable<Timings> timings = allStore.ToList(); // from database 

if(timings.Any(d => (now >= d.OpenTime) && (now <= d.CloseTime))) 
{ 

} 

Как предположил @martin, выполнение этого запроса в базе данных может быть лучшим решением. Я не знаю, как выглядит ваша база данных, но запрос будет примерно таким:

bool isOpen = db.Stores 
    .Single(s => s.Id = whatever) 
    .OpeningHours.Any(d => (now >= d.OpenTime) && (now <= d.CloseTime)); 
+0

Спасибо за ответ, я сохранил тики в базе данных как «BigInt», я получаю эту ошибку, когда использую свой первый метод: 'Operator '> =' не может применяться к операндам типа« System.TimeSpan »и« long? » «Я обновил сообщение. – stom

+0

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