Форум: "Начинающим";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];
ВнизРазница между датами Найти похожие ветки
← →
Malik (2007-11-08 20:37) [40]
> Anatoly Podgoretsky © (08.11.07 19:43) [36]
Я это знаю
Ладно ма держи:S:=IntToStr(Round(DaysBetween(DateTimePicker2.Date,DateTimePicker1.Date)-MonthsBetween(DateTimePicker2.Date,DateTimePicker1.Date)*365.25/12))+"."+IntToStr(MonthsBetween(DateTimePicker2.Date,DateTimePicker1.Date)mod 12)+"."+IntToStr(YearsBetween(DateTimePicker2.Date,DateTimePicker1.Date));
Учти небольшой шлиф... и должно получиться, А так даёт максимум ошибку на день из-за округлений и не определённости величин месяцов, годов
← →
Leonid Troyanovsky © (2007-11-08 21:14) [41]
> Malik (08.11.07 20:37) [40]
> > Anatoly Podgoretsky © (08.11.07 19:43) [36]
> Я это знаю
Не верю.
--
Regards, LVT.
← →
SergeyIT (2007-11-08 22:18) [42]
> Что получится
С моей функцией
16.06.2007 - 15.07.2007 = 29.0.0
16.07.2007 - 15.08.2007 = 30.0.0
01.01.2004 - 01.03.2004 = 0.2.0
01.01.2004 - 29.02.2004 = ошибка в Дельфи5 (можно обойти - в Делфи есть функция проверки на високосный год)
Как я и говорил - надо проверять. Я это делал когда-то в Делфи1 и часть функция пришлось переписать
← →
Johnmen © (2007-11-08 23:35) [43]
> SergeyIT (08.11.07 22:18) [42]
> С моей функцией
> 16.06.2007 - 15.07.2007 = 29.0.0
> 16.07.2007 - 15.08.2007 = 30.0.0
15.06.2007 - 15.07.2007 = ?
15.06.2007 - 16.07.2007 = ?
15.06.2007 - 17.07.2007 = ?
> Как я и говорил - надо проверять.
Кому надо? Мне - не надо, т.к. я знаю, что все твои ф-ии, и написанные и будущие на данную тему, НИКОГДА не дадут ВЕРНЫЙ результат. Ну когда перестанут выдавать "ошибки в Дельфи5"...
И что по поводу "Что выше - кислый или темный?"?
← →
SergeyIT (2007-11-09 00:06) [44]
> Johnmen © (08.11.07 23:35) [43]
> ... все твои ф-ии,
Хам и демагог. Предлагаю Вам написать программу для расчета вашего возраста в годах, месяцах, днях - если не можете - то вам здесь не место, ведь помогать новичкам - это обмен информацией, а не словесным поносом. (я свой возраст подсчитал = 20.6.53)
А автору темы просто надо проверить и подстроить под то, что ему надо (и под тот Дельфи, который он использует).
← →
Dmitro (2007-11-09 00:16) [45]function CarToInt(dt: TDate): Cardinal;
var
y, m, d: string;
begin
y:= formatdatetime(dt, "yyyy");
m:= formatdatetime(dt, "mm");
d:= formatdatetime(dt, "dd");
y:= y + m + d;
Result:= StrToInt(y)
end;
Таким образом можно сравнивать любые даты т. е.:
CarToInt("02/09/01") - CarToInt("01/09/01") = 1
Кавычки здесь образо поставлены - туда надо реальные даты передавать!
← →
korneley © (2007-11-09 00:29) [46]
> Dmitro (09.11.07 00:16) [45]
>...Таким образом можно сравнивать любые даты...
С любым результатом.... Прикольно... :)
> CarToInt("02/09/01") - CarToInt("01/09/01") = 1
а еще можно просто вычесть "таймстамп" друг из друга и получить разницу в днях...
← →
SergeyIT (2007-11-09 00:36) [47]
> Andy BitOff
Хочу добавить, что в моей функции надо обработать правильно в d2 не только 29 февраля, но и 30 и 31 число месяца (январь, март...), а может и 29.
(Как? - подумайте.)
← →
Dmitro (2007-11-09 00:43) [48]
> korneley © (09.11.07 00:29) [46]
>
> > Dmitro (09.11.07 00:16) [45]
> >...Таким образом можно сравнивать любые даты...
>
> С любым результатом.... Прикольно... :)
>
> > CarToInt("02/09/01") - CarToInt("01/09/01") = 1
>
> а еще можно просто вычесть "таймстамп" друг из друга и получить
> разницу в днях...
НАЗВАНИЕ ФОРУМА ПРОЧИТАЙ!!!
← →
korneley © (2007-11-09 00:48) [49]
> Dmitro (09.11.07 00:43) [48]
> НАЗВАНИЕ ФОРУМА ПРОЧИТАЙ!!!
Упс!!! Был не прав, вспылил. Опять же, считаю своё поведение безобразной ошибкой. Количество дней в месяце пошёл считать по костяшкам рук. Точно помню: впадина - меньше 31 дня. %)
← →
Dmitro (2007-11-09 00:54) [50]
> korneley © (09.11.07 00:48) [49]
Не важно! Я эту хрень вспомнил из VB, т.е. VB в Excell. Там при смене версий этой хр.......и API иногда показывают разные результаты - вот и пришлось делать такие пируэты.
← →
Германн © (2007-11-09 01:21) [51]
> Dmitro (09.11.07 00:16) [45]
>
> function CarToInt(dt: TDate): Cardinal;
> var
> y, m, d: string;
> begin
> y:= formatdatetime(dt, "yyyy");
> m:= formatdatetime(dt, "mm");
> d:= formatdatetime(dt, "dd");
> y:= y + m + d;
> Result:= StrToInt(y)
> end;
> Таким образом можно сравнивать любые даты т. е.:
> CarToInt("02/09/01") - CarToInt("01/09/01") = 1
Я не такой вспыльчивый как korneley ©, поэтому просто спрошу. А какое отношение имеет десятичная система счисления к многосистемному способу счисления времени и к совершенно безсистемному календарю?
Ты бы хоть сам подумал головой хоть чуть-чуть. Сравни например своим способом даты "01/01/01" и "01/02.01".
Только не удивляйся ещё и сообщениям компилятора об ошибках. Ты и стандартные функции ещё пока не знаешь.
Т.е. "КОНФЕРЕНЦИЯ" - "Начинающим" конечно. Но это не оправдание "начинающих" ответов, которые перед постированием на форум не проверяются на своём компьютере.
← →
Johnmen © (2007-11-09 01:21) [52]
> SergeyIT (09.11.07 00:06) [44]
Прошу заметить, что Вы пока только повествуете о какой-то мифической функции. Которая якобы работает без runtime ошибок и якобы выводит достоверные данные. При этом самой ф-ии не приводите. В классической философии именно это называется демагогией.
А в остальном Ваша юношеская мнительность не позволяет Вам почему-то ответить на простые, казалось бы, для Вас вопросы:
1.
15.06.2007 - 15.07.2007 = ?
15.06.2007 - 16.07.2007 = ?
15.06.2007 - 17.07.2007 = ?
15.07.2007 - 15.08.2007 = ?
15.07.2007 - 16.08.2007 = ?
15.07.2007 - 17.08.2007 = ?
2.
Что выше - кислый или темный?
ЗЫ
Впрочем, на второй можете не отвечать.
← →
korneley © (2007-11-09 01:27) [53]Имхо тема исчерпана, т.к. все так или иначе высказались, что разница в днях может быть по разному интерпретирована в разницу в днях.месяцах.годах. Все от первой и второй даты зависит. А именно от дня, месяца и, как не странно, года. ;)
← →
korneley © (2007-11-09 01:29) [54]ЗЫ: А выше - тёмный. Тёмная сторона Силы привлекает сильнее...
← →
Германн © (2007-11-09 01:41) [55]
> korneley © (09.11.07 01:27) [53]
>
> Имхо тема исчерпана
Имхо, тема будет исчерпана только после того как автор темы осознает, что вышеописанное:
> Johnmen © (08.11.07 14:08) [16]
>
>
> > Andy BitOff (ppc) (08.11.07 14:05) [14]
>
> Дело в том, что неглупые грамотные люди тебе уже и сказали
> и намекнули, что никак. Поясняю - ни один, тобой придуманный
> "алгоритм", не будет правильным. Т.е. не будет давать верных
> с любой т.з. решений.
> <Цитата>
>
> Andy BitOff (ppc) (08.11.07 14:21) [17]
>
> Johnmen © (08.11.07 14:08) [16]
> Неверю.
> Любую задачу, тем более эту, можно решить/запрограммировать.
> Другое дело сколько понадобится для этого ресурсов (чел/часов,
> нервов и т.п).
>
означает очень большой (даже скажу слишком большой геморрой). А для чего так нужно мучиться не понятно. Может стоит упростить задачу?
(Меня как-то мой псевдоначальник попросил выводить в СтатусБаре количество минут, часов, дней, МЕСЯЦЕВ, ЛЕТ которые проработала программа :)
← →
Dmitro (2007-11-09 01:47) [56]
> Германн © (09.11.07 01:21) [51]
Я говорил лишь о СРАВНЕНИИ дат..., уважаемый Германннн
← →
Johnmen © (2007-11-09 01:52) [57]
> Dmitro (09.11.07 01:47) [56]
> Я говорил лишь о СРАВНЕНИИ дат...
Для лишь сравнения дат никаких преобразований вовсе не надо.
← →
Германн © (2007-11-09 02:06) [58]
> Dmitro (09.11.07 01:47) [56]
>
>
> > Германн © (09.11.07 01:21) [51]
>
> Я говорил лишь о СРАВНЕНИИ дат..., уважаемый Германннн
>
Ну тогда в подобных случаях употребляй неофициальный тэг" <offtop>. Поскольку твой пост не имеет никакого отношения к сабжу. Да и всё-таки изучи синтаксис функции FormatDateTime.
А про сравнение дат см.
> Johnmen © (09.11.07 01:52) [57]
← →
Dmitro (2007-11-09 02:40) [59]
> Германн © (09.11.07 02:06) [58]
Учел Ваши комментарии:
y:= strtoint(formatdatetime("yyyy", datetimepicker1.date));
y:= y - strtoint(formatdatetime("yyyy", datetimepicker2.date));
y:= y * 365;
m:= strtoint(formatdatetime("mm", datetimepicker1.date));
m:= m - strtoint(formatdatetime("mm", datetimepicker2.date));
if m < 0 then
m:= m * -1;
y:= y + m * 30;
y:= y + strtoint(formatdatetime("dd", datetimepicker1.date)) - strtoint(formatdatetime("dd", datetimepicker2.date));
Разумеется DateTimePickerr2 всегда < DateTimePickerr1 (Value).
Функция не абсолютна и не точна, но раскрывает алгоритм вычитания дат.
Готов выслушать критику и советы......
← →
Германн © (2007-11-09 02:54) [60]
> Функция не абсолютна и не точна, но раскрывает алгоритм
> вычитания дат.
> Готов выслушать критику и советы......
>
А чего тут критиковать? Сам же сказал, что "не абсолютна и не точна". Прочитай ещё раз всю ветку. Поймёшь что ты не первый и далеко не первый, кто именно такую формулировку применил.
← →
Германн © (2007-11-09 03:05) [61]Пардон. Отнёсся к [59] слишком "бездумно". Однако стоило ужесточить мнение.
Сия функция не только
> не абсолютна и не точна
, но и не
> раскрывает алгоритм вычитания дат
.
← →
Dmitro (2007-11-09 03:18) [62]
> но и не
> > раскрывает алгоритм вычитания дат
Как раз-то и РАСКРЫВАЕТ Ваш же "многосистемный" метод. Сколько читаю эту ветку - еще не увидел ни одного абсолютного и верного ответа на вопрос (в любом варианте есть исключения).
Думаю - напишу func"s для работы с дт/вр.
← →
d@nger (2007-11-09 08:07) [63]Извените, меня конечно, а разве нельзя просто сделать так:
function DatesBetween (FirstDate, SecondDate : TDateTime) : String;
var y1,m1,d1,y2,m2,d2:word;y,m,d:string;
begin
decodedate(firstdate,y1,m1,d1);
decodedate(seconddate,y2,m2,d2);
y:=inttostr(y1-y2);
m:=inttostr(m1-m2);
d:=inttostr(d1-d2);
result:=d+"."+m+"."+y;
end;
а привести допустим день 1 в вид 01, месяц 8 в вид 08, а год 1 в вид 0001, не составит труда.....
тока не кидайтесь камнями...если я не прав....
← →
homm © (2007-11-09 08:19) [64]> Здравствуйте.
> Что-то у меня уже башка не варит, сижу парюсь и шарики за
> ролики заходят...
> Никак не удается получить
Имеено эту фразу видят люди в качестве описания вопроса. Очень емко и информативно, главное сразу понятно что нужно автору, можно даже в ветку не заходить.
← →
Думкин © (2007-11-09 08:19) [65]
> d@nger (09.11.07 08:07) [63]
> Johnmen © (08.11.07 14:54) [19]
>
> > engine © (08.11.07 14:36) [18]
>
> Что получится
> 29.02.1996 - 28.02.1995 = ?
> 01.03.1996 - 28.02.1995 = ?
← →
Skyle © (2007-11-09 09:08) [66]
> Думкин © (09.11.07 08:19) [65]
Я подобный вопрос задал ещё в [2]. Автор не хочет уточнить :(
← →
Leonid Troyanovsky © (2007-11-09 09:20) [67]
> Skyle © (09.11.07 09:08) [66]
> Я подобный вопрос задал ещё в [2]. Автор не хочет уточнить
> :(
Дык, он же не в состоянии (см. анамнез),
у него ж паралич мыслительной мышцы.
Кста, видимо, это заразно.
--
Regards, LVT.
← →
Думкин © (2007-11-09 09:29) [68]> Skyle © (09.11.07 09:08) [66]
У тебя не так интересно. A вот с кодом того, кому писал - это интереснее выходит. Для 1 марта.
← →
SergeyIT (2007-11-09 09:47) [69]
> Johnmen © (09.11.07 01:21) [52]
>
> Прошу заметить, что Вы пока только повествуете о какой-то
> мифической функции. Которая якобы работает без runtime ошибок
> и якобы выводит достоверные данные. При этом самой ф-ии
> не приводите.
А не пора ли Вам проснуться? - пост [28] с учетом [47].
← →
Думкин © (2007-11-09 09:57) [70]> SergeyIT (09.11.07 09:47) [69]
Вы бы все-таки ответили на его 19 пост. А то некрасиво как-то.
← →
Johnmen © (2007-11-09 10:06) [71]
> SergeyIT (09.11.07 09:47) [69]
Я, конечно понимаю, что чукча не читатель, чукча писатель, но попробую ещё раз, последний:
1.
SergeyIT © (08.11.07 18:07) [28]
Надо проверять.
SergeyIT (08.11.07 22:18) [42]
01.01.2004 - 29.02.2004 = ошибка в Дельфи5
Как я и говорил - надо проверять.
Johnmen © (09.11.07 01:21) [52]
Вы пока только повествуете о какой-то мифической функции. Которая якобы работает без runtime ошибок и якобы выводит достоверные данные.
Где работающая ф-ия, выдающая достоверные результаты?
2.
15.06.2007 - 16.07.2007 = ?
15.06.2007 - 17.07.2007 = ?
15.07.2007 - 16.08.2007 = ?
15.07.2007 - 17.08.2007 = ?
← →
SergeyIT (2007-11-09 10:06) [72]По-моему так
29.02.1996 - 28.02.1995 = 0.0.1
01.03.1996 - 28.02.1995 = 1.0.1
и так
28.02.1996 - 28.02.1995 = 0.0.1
Эти исключения надо решить, как обработать - это к автору темы - смотря что ему надо
← →
Johnmen © (2007-11-09 10:13) [73]
> SergeyIT (09.11.07 10:06) [72]
> По-моему так
> 29.02.1996 - 28.02.1995 = 0.0.1
Т.е. всего 1 (одни) сутки разницы???
Мило...:)
← →
Думкин © (2007-11-09 10:15) [74]
> Johnmen © (09.11.07 10:13) [73]
1 год. :)
← →
Johnmen © (2007-11-09 10:20) [75]
> Думкин © (09.11.07 10:15) [74]
> 1 год. :)
А-а-а... У него года в конце.
> SergeyIT (09.11.07 10:06) [72]
> По-моему так
> 29.02.1996 - 28.02.1995 = 0.0.1
> 28.02.1996 - 28.02.1995 = 0.0.1
А это как понимать? Куда сутки исчезли?
← →
ЮЮ © (2007-11-09 10:31) [76]> [72] SergeyIT (09.11.07 10:06)
> По-моему так
По моему лучше так:
0.0.1 = 27.02.1996 - 28.02.1995, т.к. с 28.02.1995 по 27.02.1996 (включительно) ровно 1 год.
Соответственно, для 28.02.1995, имеем
1.0.1 - 28.02.1996
2.0.1 - 29.02.1996
3.0.1 - 01.03.1996
...
0.1.1 - 27.03.1996
Кажеттся, что затруднения возникают, когда дней месяце начала перриода больще, чем дней конца перриода.
Что считать "ровно через месяц", начиная с 31.01, а с 30.01.
Но с доугой стороны имеет место
30.01 ... 29.02 = 0.1.x
тогда
31.01 ... 29.02 = 30.0.x (ну и что что в феврале 30 дней не бывает, зато функция однозначная ддя любой даты)
← →
korneley © (2007-11-09 10:33) [77]Неожиданно подумалось:" Если мы оперируем абстрактными "год" и "месяц", то со второгого марта по первое (включительно) пройдет один год, независимо от того, високосный он или нет, а с первого числа любого месяца по последнее - один месяц". Во как.
← →
korneley © (2007-11-09 10:40) [78]Поэтому получаем год = 12 месяцев, и по барабану сколько в этих месяцах дней. В [63] такой подход озвучен, правда только подход, сам пример нерабочий, потому что, если из 9 - го месяца вычесть 10 - й будет не -1, а 12 месяцев.
← →
Anatoly Podgoretsky © (2007-11-09 10:52) [79]> Думкин (09.11.2007 10:15:14) [74]
Что бы нагляднее
28.02.1996 - 28.02.1995 = 0.0.1 ???
29.02.1996 - 28.02.1995 = 0.0.1 ???
и
28.02.1997 - 28.02.1996 = 0.0.1
28.02.1997 - 29.02.1996 = ?
← →
Anatoly Podgoretsky © (2007-11-09 10:54) [80]> korneley (09.11.2007 10:33:17) [77]
> а с первого числа любого месяца по последнее - один месяц". Во как.
С чего бы
Страницы: 1 2 3 4 5 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];
Память: 0.63 MB
Время: 0.058 c