Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отнять Дату от Даты, и получить g=Год m=Месяцев d=Дней 
:(
    Опции темы
AlexanderI
  Дата 17.4.2005, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.7.2004

Репутация: 1
Всего: 3



Подскажите как отнять дату от даты и получить разницу между ними т.е. g=Год m=Месяцев d=Дней
Пользовался YearsBetween но чтото с днями там путаница.

Подскажить что нибудь. smile
--------------------
Магазин детских игрушек  | Авто ВАЗ
PM MAIL   Вверх
z-END
Дата 17.4.2005, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: 11
Всего: 102



Код

g := YearsBetween (Date1, Date2);
m :=  MonthsBetween (Date1, Date2);
d := DaysBetween  (Date1, Date2);



--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
AlexanderI
Дата 17.4.2005, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.7.2004

Репутация: 1
Всего: 3



Я так и делал. Но эта функция выводит или общее число дней, или общее число месяцев, или общее число лет.

Например я задаю две даты:
01.01.2004
и
01.01.2005

Результат должен быть таким:
g = 1
m = 0
d = 0

или

01.01.2004
и
04.03.2005

g = 1
m = 2
d = 3

Как мне лучше такое реализовать ? чтоб и весокосные дни учитывались...


--------------------
Магазин детских игрушек  | Авто ВАЗ
PM MAIL   Вверх
z-END
Дата 17.4.2005, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: 11
Всего: 102



AlexanderI Если тебе нужна разница дней (0..31) месяцев (0..12) и годов тогда так:
Код

DecodeDate (Date1, y1, m1, d1);
DecodeDate (Date2, y2, m2, d2);
y := y1 - y2;
m := m1 - m2;
d := d1 - d2;

в таком случае високосность года тогда роли не играет, или я тебя опять непонял?


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
AlexanderI
Дата 17.4.2005, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.7.2004

Репутация: 1
Всего: 3



Я уже сам запутался smile

У меня задача стоит так:
Есть человек (рабочий). У него имеется стаж работы (на предыдущей работе): 5 дней 2 месяца 7 лет (d1,m1,g1). На последнию работу его приняли 04.02.05 числа (d2,m2,g2).
Формирую отчёт на сегоднешнее число 17.04.05 (d3,m3,g3).

Вот мне и нужно От сегодняшнего числа отнять число когда его приняли на работу, и прибавить его стаж на предыдущей работе.

Что мне лучше подайдёт ?

Это сообщение отредактировал(а) AlexanderI - 17.4.2005, 14:01
--------------------
Магазин детских игрушек  | Авто ВАЗ
PM MAIL   Вверх
Poseidon
Дата 17.4.2005, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Вот, бери. Юнит с наиболее нужными функциями работы с датами. Писал кагда-то для себя, но вижу, что и тебе не помешает.

Присоединённый файл ( Кол-во скачиваний: 36 )
Присоединённый файл  DateUtils.pas


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Петрович
Дата 18.4.2005, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



to AlexanderI.
Интересно, а когда ты говоришь: "Он работал 3 года 1 месяц и 3 дня", какой месяц ты имеешь ввиду? От этого зависит сколько в нем было дней 28, 28, 30, или 31?
Т.е., например, если
d1 = 01 янв 2001
и
d2 = 01 фев 2001,
то разница между этими датами составляет 31 день. Но, если это записать в N месяцев и N дней, то возможны варианты:
1 месяц 0 дней (если имеется ввиду месяц с 31 днем)
1 месяц 1 день (если имеется ввиду месяц с 30-ю днями)
1 месяц 2 дня (если имеется ввиду месяц с 29-ю днями)
1 месяц 3 дня (если имеется ввиду месяц с 28-ю днями)

Какой ответ ты считаешь правильным?

Поэтому, когда речь идет о том что прошло какое то время, например срок работы, то говорить можно лишь о числе прошедших дней.




--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
AlexanderI
Дата 20.4.2005, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.7.2004

Репутация: 1
Всего: 3



Цитата(Poseidon @ 17.4.2005, 17:30)
Вот, бери. Юнит с наиболее нужными функциями работы с датами. Писал кагда-то для себя, но вижу, что и тебе не помешает.

Конешно спасибо за помощь, но Это тоже самое что и YearsBetween. Не помогло.
--------------------
Магазин детских игрушек  | Авто ВАЗ
PM MAIL   Вверх
AlexanderI
Дата 20.4.2005, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.7.2004

Репутация: 1
Всего: 3



Цитата
to AlexanderI.
Интересно, а когда ты говоришь: "Он работал 3 года 1 месяц и 3 дня", какой месяц ты имеешь ввиду?

Вот я сам низнаю.
У меня есть программа написанная под DOS. Мне её нужно переписать под Винду. Исходников нет, ничего нет.
Она выдаёт вот такие результаты:
Начальная дата | Конечная дата | Результат (лет, месяцев, дней)
01.02.2002_______20.04.2005_____3, 2, 19
17.09.1972_______20.04.2005_____32,7,3
17.01.1994_______20.04.2005_____8,4,7
01.09.1993_______20.04.2005_____11,0,8

Это сообщение отредактировал(а) AlexanderI - 20.4.2005, 21:13
--------------------
Магазин детских игрушек  | Авто ВАЗ
PM MAIL   Вверх
Cetus
Дата 21.4.2005, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 18.4.2004

Репутация: нет
Всего: 1



01.09.1993_______20.04.2005_____11,0,8

по моему прога глючит smile


Если я правильно понял то задача решается следующим алгоритмом:

function GetYDM(DateFrom, DateTo : TDate; var Y,M,D : integer): boolean;
var
Yl, Ml, Dl, l,
Yh, Mh, Dh : integer;
begin
Result := False;
if (DateFrom > DateTo) then
exit
else
Result := True;

Yl := YearOf(DateFrom);
Ml := MonthOf(DateFrom);
Dl := DayOf(DateFrom);
Yh := YearOf(DateTo);
Mh := MonthOf(DateTo);
Dh := DayOf(DateTo);

// calculate days
D := Dh - Dl;
l := 1;
if (D < 0) then
case Ml of
1,3,5,7,8,10,12 : d := 31 + d;
2 : if (Yl mod 4) = 0 then
d := 29 + d
else
d := 28 + d;
4,6,9,11 : d := 30 + d;
end
else
l := 0;

// calculate monthes
M := Mh - Ml - l;
l := 1;
if (M < 0) then
M := 12 + M
else
l := 0;

// calculate years
Y := Yh - Yl - l;
end;

--------------------
Легко внести изменения в код.Трудно сделать это корректно.
PM MAIL   Вверх
Петрович
Дата 21.4.2005, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Цитата(AlexanderI @ 20.4.2005, 22:12)
Вот я сам низнаю.
У меня есть программа написанная под DOS. Мне её нужно переписать под Винду. Исходников нет, ничего нет.

Ну если не знаешь, то опираться надо на семантику задачи.
А так, это попытка реализовать кишки черного ящика.

Цитата(AlexanderI @ 20.4.2005, 22:12)
Она выдаёт вот такие результаты:
Начальная дата | Конечная дата | Результат (лет, месяцев, дней)
01.02.2002_______20.04.2005_____3, 2, 19
17.09.1972_______20.04.2005_____32,7,3
17.01.1994_______20.04.2005_____8,4,7
01.09.1993_______20.04.2005_____11,0,8

На мой взгляд, это полный бред.
Например, каким это образом она считает что между датами 17.01.1994 и 20.04.2005 прошло всего 8 лет?
Короче, таких вопросов здесь много, если внимательно посмотреть.

Повторюсь, критерием истины может быть только семантика задачи.



--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0828 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.