Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2013, 13:41   #1
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию Лежит ли дата в периоде

Даны 3 даты: dd1,dd2,dd3, mm1,mm2,mm3,yy1,yy2,yy3.

Нужно проверить лежит ли дата dd1.mm1.yy1. в заданном промежутке времени (dd2.mm2.yy2 - dd3.mm3.yy3)

Вот привожу свои наработки.

Код:
if(info[i].orders[p].date.yy<date1[0].yy)
						{
							if((date1[1].yy > info[i].orders[p].date.yy) && (info[i].orders[p].date.yy<date1[0].yy))
							{
								flagg=1;
							}
							else
								flagg=0;
						}
						else
						{
							if((date1[1].mm < info[i].orders[p].date.mm) || (date1[1].mm>date1[0].mm))
							{
								flagg=0;
							}
							else
							{
								if(info[i].orders[p].date.mm < date1[0].mm)
								{
									if((date1[1].mm>info[i].orders[p].date.mm) && (date1[1].mm<date1[0].mm))
									{
										flagg=1;
									}
									else
										flagg=0;
								}
								else
								{
									if((date1[1].dd > info[i].orders[p].date.dd) && (date1[1].dd<date1[0].dd))
									{
										flagg=1;
									}
									else
										flagg=0;
								}
							}
						}
где info[i].order[p].date - первая дата (которую мы проверяем в периоде)
date1[0] - вторая дата
date1[1] - третья дата.
Praud вне форума Ответить с цитированием
Старый 23.11.2013, 14:00   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если так подходить, то гораздо более многоэтажно условие должно быть. Проще: каждую дату преобразовать в yy*10000+mm*100+dd и сравнить три числа
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.11.2013, 15:20   #3
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

Хорошо, тогда объясните мне, как мне каждый раз высчитывать кол-во дней в месяце и дней в году?

был вариант dd+mm*31+yy*365, но такой метод не давал требуемой точности

Последний раз редактировалось Stilet; 23.11.2013 в 16:03.
Praud вне форума Ответить с цитированием
Старый 23.11.2013, 15:28   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Хорошо, тогда объясните мне, как мне каждый раз высчитывать кол-во дней в месяце и дней в году?
Зачем? Например сравнение дат 13.11.2013 и 27.12.2013 выльется в сравнение чисел 20131113 и 20131227 и ни каких подсчетов дней
13.11.2013 -> 2013*10000+11*100+13 = 20131113
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 23.11.2013 в 15:31.
Аватар вне форума Ответить с цитированием
Старый 23.11.2013, 15:33   #5
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Или альтернативный вариант (C#, но принцип думаю понятен)

Код:
  public class DT
        {
            public int dd;
            public int mm;
            public int yy;
        }

// 1 если first > second; 0 если first = second; -1 если first < second
        public static int Compare(DT first, DT second)
        {
            if (first.yy < second.yy)
                return -1;
            if (first.yy > second.yy)
                return 1;

            if (first.mm < second.mm)
                return -1;
            if (first.mm > second.mm)
                return 1;

            if (first.dd < second.dd)
                return -1;
            if (first.dd > second.dd)
                return 1;

            return 0;
        }

        public static bool IsInRange(DT target, DT start, DT end)
        {
            return (Compare(target, start) >= 0 && Compare(target, end) <= 0);
        }
Благодарить в репутацию. Проклинать — туда же

Последний раз редактировалось Luuzuk; 23.11.2013 в 15:36.
Luuzuk вне форума Ответить с цитированием
Старый 23.11.2013, 15:37   #6
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Зачем? Например сравнение дат 13.11.2013 и 27.12.2013 выльется в сравнение чисел 20131113 и 20131227 и ни каких подсчетов дней
13.11.2013 -> 2013*10000+11*100+13 = 20131113
Сейчас проверю, звучит убедительно. Если заработает, то аплодисменты вам за такой хитрый метод)

Цитата:
Сообщение от Luuzuk Посмотреть сообщение
Или альтернативный вариант (C#, но принцип думаю понятен)

Код:
  public class DT
        {
            public int dd;
            public int mm;
            public int yy;
        }

// 1 если first > second; 0 если first = second; -1 если first < second
        public static int Compare(DT first, DT second)
        {
            if (first.yy < second.yy)
                return -1;
            if (first.yy > second.yy)
                return 1;

            if (first.mm < second.mm)
                return -1;
            if (first.mm > second.mm)
                return 1;

            if (first.dd < second.dd)
                return -1;
            if (first.dd > second.dd)
                return 1;

            return 0;
        }

        public static bool IsInRange(DT target, DT start, DT end)
        {
            return (Compare(target, start) >= 0 && Compare(target, end) <= 0);
        }
последняя строчка к сожалению не понятна.

Последний раз редактировалось Stilet; 23.11.2013 в 16:05.
Praud вне форума Ответить с цитированием
Старый 23.11.2013, 15:42   #7
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Цитата:
последняя строчка к сожалению не понятна.
В последней строчке операторная скобка, закрывающая

Дата входит в период, если она больше даты начала периода, но меньше даты конца периода (или равна им, зависит от условий задачи)

Compare(target, start) – сравниваем целевую дату (target) и начало периода (start). Если результат сравнения больше нуля, то target > start. Если результат нулевой, то target = start.

Далее - аналогично с датой окончания
Изображения
Тип файла: png Сравнение дат.png (9.0 Кб, 31 просмотров)
Благодарить в репутацию. Проклинать — туда же

Последний раз редактировалось Luuzuk; 23.11.2013 в 15:50.
Luuzuk вне форума Ответить с цитированием
Старый 23.11.2013, 15:44   #8
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Зачем? Например сравнение дат 13.11.2013 и 27.12.2013 выльется в сравнение чисел 20131113 и 20131227 и ни каких подсчетов дней
13.11.2013 -> 2013*10000+11*100+13 = 20131113
Аватар, а можете объяснить почему именно 10000 и 100 ?
Praud вне форума Ответить с цитированием
Старый 23.11.2013, 15:56   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сообщение от Praud Посмотреть сообщение
почему именно 10000 и 100 ?
Чтобы цифры года, месяца и дня расположить позиционно по старшинству не перекрывая друг друга
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Количество дней недели в периоде Fox River Microsoft Office Excel 6 10.12.2011 22:53
лежит ли точка внутри треугольника х-prof Помощь студентам 1 16.06.2011 20:16
Дата введённая "ручками" и дата полученная по ссылке kzld Microsoft Office Excel 0 06.05.2011 14:45
Вычитание дат(дата-дата=кол.дней) zallza Общие вопросы Delphi 1 31.05.2010 22:50
Дата Конечная (ДД.ММ.ГГГГ) - Дата Начальная (ДД.ММ.ГГГГ) = Количество Месяцев stanislav24 Microsoft Office Excel 5 20.12.2008 10:36