Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1195027023
F@T@L_Err0r
2007-11-14 10:57
2007.12.09
Запуск программы


2-1195052926
olevacho_
2007-11-14 18:08
2007.12.09
Компонент для отображения форматированого текста и графики


1-1189867818
andreil
2007-09-15 18:50
2007.12.09
Преобразовать строку в дробное число


15-1194876938
Hint
2007-11-12 17:15
2007.12.09
Задания от Яндекса


15-1194342098
sergey
2007-11-06 12:41
2007.12.09
Математики, подскажите из какой "оперы" задача?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский