![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Разница между датами [D7, XP]
Andy BitOff (ppc) © (2007-11-08 13:07:00)Здравствуйте.
Что-то у меня уже башка не варит, сижу парюсь и шарики за ролики заходят...
Никак не удается получить разничу между датами в формате dd.mm.yy.
Например.
05.11.2007 и 08.11.2007 должно получиться 03.00.00, но при работе с типом дата месяц (как и год) не может быть равен 0.
Может кто подскажет как это можно реализовать?
Andy BitOff (2007-11-13 01:03:00) [1]
> Johnmen © (12.11.07 21:47) [162]
> ЗЫ
> А вообще, мне уже не интересно. Ну не хочешь понять - и ладно.
> Алгоритм тебя устраивает - и ладно....
Да мне-то собстно. Интересно тебе или не интересно... Не хочешь признать, что этот алгоритм работает и выдает правильный результат для любых дат, не надо, но ты так же и не доказал обратного. Я же не срашиваю тебя, почему у нас такой календарь, почему в феврале 28 дней, а (почти) каждые 4 года - 29, почему в июле и августе по 31 дню, а в других месяцах чередуется.
Вот в том-то и дело. Из-за такого календаря.
А алгоритм работает правильно и выдает правильный результат и это легко проверяется, что уже не раз было сделано.
SergeyIT (2007-11-12 21:49:00) [2]> Может быть ты мне назовешь эту дату?
Не дождетесь - будет очередной вопрос. Проходили - знаем :-)
Не обращайте внимания.
Johnmen (2007-11-12 21:47:00) [3]
> Andy BitOff © (12.11.07 20:53) [161]
> За сим, мне по барабану, можно ли получить обратный результат и т.п.
Не надо получать обратный результат. Просто скажи, какая дата там должна быть.
> Может быть ты мне назовешь эту дату? ;)
Нет, конечно! Это ты придумываешь алгоритмы, а не я.
ЗЫ
А вообще, мне уже не интересно.
Ну не хочешь понять - и ладно. Алгоритм тебя устраивает - и ладно....
Andy BitOff (2007-11-12 20:53:00) [4]
> Johnmen © (12.11.07 19:38) [160]
> Вопрос31.01.2007 - ??? = 00.01.00ЗЫИ в [156] и далее знак
> "-" считать не как вычитание, а как "с .. по ...". Впрочем,
> я думаю, все поняли.
считать не как вычитание, а как "с .. по ... включительно"!
ЗЫ
Вопрос не имеет решения, т.к. уравнение с одним неизвестным.
Читай [154]:
P.P.S.
К тому же я уже говорил, что ЭТО КОНЕЧНЫЙ СТАТИСТИЧЕСКИЙ РЕЗУЛЬТАТ и никакой дальнейшей обработки этой строки производиться не будет. За сим, мне по барабану, можно ли получить обратный результат и т.п.
Может быть ты мне назовешь эту дату? ;)
Johnmen (2007-11-12 19:38:00) [5]Вопрос
31.01.2007 - ??? = 00.01.00
ЗЫ
И в [156] и далее знак "-" считать не как вычитание, а как "с .. по ...". Впрочем, я думаю, все поняли.
Andy BitOff (2007-11-12 19:08:00) [6]Почему не существует? Очень даже существует.
01.01.2007 - 31.01.2007 = 00.01.00 потому, что в январе 31 день, что в свою очередь, является эквивалентом месяца (для января). Так же как и 01.02.2004 - 29.02.2004 = 00.01.00 и 01.02.2005 - 28.02.2005 = 00.01.00
В то время как:
01.01.2007 - 01.02.2007 = 01.01.00
а
01.02.2005 - 29.02.2005 вообще вернет ошибку еще до начала работы алгоритма, т.к. будет проверка валидности дат.
Основы алгоритма, это изначальное вычитание дат, дабы узнать количество дней их разделяющих. И далее, начиная от заданной меньшей даты вычитать из общего количества дней, количество дней в "текущем" месяце, который изначально совпадает с наименьшей датой, а в последствии передвигается вперед по календарю до конечной даты.
Johnmen (2007-11-12 15:50:00) [7]
> Andy BitOff © (12.11.07 15:23) [157]
Т.е. при заданной начальной дате в непрерывной казалось бы разнице дат возникают разрывы!!!
Не существует разницы 01.01.00! А также 00.01.00!
Как же так?
Andy BitOff (2007-11-12 15:23:00) [8]
> Johnmen © (12.11.07 14:39) [156]
Попробуй прочитать еще раз.
Последние две строчки не правильно, потому что "зерно истины, предыдущий месяц", а там он уже январь, где 31 день.
Johnmen (2007-11-12 14:39:00) [9]
> Andy BitOff © (12.11.07 10:21) [154]
Хорошо. Я правда не понял алгоритма.
Итак имеем
31.01.2007 - 02.03.2007 = 03.01.00
уменьшаем вычитаемое на 1 сутки
31.01.2007 - 01.03.2007 = 02.01.00
уменьшаем вычитаемое на 1 сутки
31.01.2007 - 28.02.2007 = 01.01.00 так, да?
уменьшаем вычитаемое на 1 сутки
31.01.2007 - 27.02.2007 = 00.01.00 так, да?
Продолжай думать...:)
Anatoly Podgoretsky (2007-11-12 11:53:00) [10]> Andy BitOff (12.11.2007 10:21:34) [154]
> так что возможна некоторая сумбурность.
Хм, я думал, что у слова некоторая немного другое значение, это не некоторая, а большая ее половина.
Andy BitOff (2007-11-12 10:21:00) [11]
> Johnmen © (10.11.07 21:51) [144]
> Следуя этой логике между
> 31.01.2007 и 02.03.2007 ровно месяц, т.е. 31 сутки, ведь это
> "зерно истины, предыдущий месяц". Да?Я думаю, что ты все
> равно не понял сути. Почитай последние посты дяди Толи (не
> флудерские), подумай...
> "зерно истины, предыдущий месяц". Да?
Да!
Я думаю, что ты все равно не понял сути. (c)Johnmen
31.01.2007 и 02.03.2007
Мне сейчас лень считать, но про 31 сутки ты не прав, предыдущий месяц 28 суток, вот и посчитай сколько будет.
Смотри, на данном примере. Берем общее количество дней между датами (нет дельфей под рукой, сколько там будет?) примерно 1+28+2, т.е. 31 (впрочем, как ты и заметил). Теперь получаем количество дней в 01.2007, их 31. Число текущего обрабатываемого месяца 31 (31.01.2007), увеличим некую переменную отвечающую за количество дней на результат их разницы (кол.д.тек.мес. - чис.обр.дня) = 0 дней + 1 день, чтобы текущим стал 02.2007 итого 1. Вычтем из общего числа дней эту некую переменную = 30. Поскольку январь кончился (и мы об этом знаем), то переходим к февралю. Получаем количество дней в 02.2007 = 28.
Увеличим ту некую переменную отвечающую за количество дней на результат их разницы (кол.д.тек.мес. - чис.обр.дня) = 27 дней + 1 день, чтобы текущим стал 03.2007 итого 1 + 28. Вычтем из общего числа дней эту некую переменную = 1. НО ПОСКОЛЬКУ МЫ ТОЛЬКО ЧТО ОБРАБОТАЛИ ЦЕЛЫЙ МЕСЯЦ, то увеличим некую переменную отвечающую за количество месяцев и обнулим ту, которая дней. Получаем количество дней в 03.2007 = 31, но это явно меньше чем у нас осталось от общего количества, за сим просто возьмем остаток дней 2 и еще +1 и прибавим их к той некой переменной, которая отвечала за дни = 3. Всё. Результат 03.01.00
P.S.
Это грубое описание алгоритма. Но в ОБЩЕМ всё понятно и правильно.
P.P.S.
К тому же я уже говорил, что ЭТО КОНЕЧНЫЙ СТАТИСТИЧЕСКИЙ РЕЗУЛЬТАТ и никакой дальнейшей обработки этой строки производиться не будет. За сим, мне по барабану, можно ли получить обратный результат и т.п.
P.P.P.S.
Этот текст я набирал сегодня в пять утра, так что возможна некоторая сумбурность. За это прошу прощения. Сейчас пришел с работы после бессонной ночи и собираюсь поспать.
ari_9 (2007-11-11 13:49:00) [12]да, конечно в этом случае будет интересная ситуация, например, между 2006.08.31 и 2006.10.01, потому что полный месяц разницы - один, а даты (2006+0).(8+1).31 не существует (в сентябре 30 дней). но это просто означает, что необходимо определить поведение в этом случае - либо переносить дни в следующий месяц, либо всего обрезать число даты до максимального в полученном месяце
самый интересный вопрос - можно ли добиться таким образом свойста аддитивности алгоритма. то есть сумма разниц (дата 1 - дата 2) и (дата 2 - дата 3) будет равна (дата 1 - дата 3) для любых дат ?... ясно, что обрезая числа месяца - нельзя. а перенося их в следующий, мне кажется - да
ari_9 (2007-11-11 13:31:00) [13]я понимаю, как глупо влезать в такую тему на третий день флуда, но тем не менее. если автору нужен ответ в ОБЩЕГУМАНИТАРНОМ смысле, что-ли, то он, очевидно, может быть дан
ведь когда говорят, мне "двадцать восемь лет, один месяц и 16 дней" этот ответ тоже никак не может быть однозначно преобразован в дни (високосные годы и разные длины месяцев). но так иногда говорят
есть первая дата year1.month1.day1 и вторая, year2.month2.day2. тогда ответом будет yearХ.monthХ.dayХ, где :
yearХ - количество ПОЛНЫХ лет между year1.month1.day1 и year2.month2.day2
monthХ - количество ПОЛНЫХ месяцев между year1+yearХ.month1.day1 и year2.month2.day2
dayХ - количество дней между year1+yearХ.month1+monthХ.day1 и year2.month2.day2
Sergey Masloff (2007-11-11 09:03:00) [14]Ну и флуда... Там за полчаса пишется
см. http://www.delphimaster.ru/cgi-bin/forum.pl?n=3&id=1194730016&p=6пост [101]
Progs (2007-11-11 07:21:00) [15]>>>Виталий Панасенко(дом) (10.11.07 23:47) [146]
Между датами можно получить РАЗНИЦУ В ДНЯХ.
Странная конечно ситуация.
Хорошо, а почему бы автору не разбить заранее кол-во дней по месяцам (что то типа констант некоторых, вдобавок проработав календарь :) проги же есть), а получив результат в виде разницы в количестве дней, преобразовать в тот вид который ему нужен и не ломать голову. Конечно грубовато, в одну строку код не получится.
Потому что, как посмотрю, спор уже идет по терминологии, сколько дней там, сколько здесь и т.д. и т.п.
С уважением.
Германн (2007-11-11 00:15:00) [16]"Time is the Simplest Thing"
Copyright © 1961 Clifford D. Simak
Anatoly Podgoretsky (2007-11-11 00:05:00) [17]
> Время и пространство когда-то были единой сущностью.
Но потом появились программисты.
Johnmen (2007-11-11 00:00:00) [18]
> Anatoly Podgoretsky © (10.11.07 22:28) [145]
> Ты скоро будешь писать - дедушки Толи :-)
Ты станешь дедом? Серьезно?
> А по сути, очень мало кто понимает, что такое время.
Это точно. Но не понимая еще и пальцы гнут и неокрепшие души развращают... :)
Грустно...
Виталий Панасенко(дом) (2007-11-10 23:47:00) [19]
> Anatoly Podgoretsky © (10.11.07 22:28) [145]
Время и пространство когда-то были единой сущностью..А по сути вопроса.. фигня какая-то, а не вопрос.. Между датами можно получить РАЗНИЦУ В ДНЯХ..Но то, что просит автор... Я думаю DateDiff поможет...Из JEDI.. возвращает разницу между датами в днях, месяцах, годах
Anatoly Podgoretsky (2007-11-10 22:28:00) [20]> Johnmen (10.11.2007 21:51:24) [144]
Ты скоро будешь писать - дедушки Толи :-)
А по сути, очень мало кто понимает, что такое время.