Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

Работа с датой и временем.

тут можно задать вопрос по скриптингу
Post Reply
Murderello
Posts: 2
Joined: 08.03.2012 10:43

Работа с датой и временем.

Post by Murderello »

Здравствуйте все!
Подскажите пожалуйста каков алгоритм работы с переменными типа "дата+время", "время", "дата".
По какому принципу вычитают\прибавляют к TDateTime: год, месяц, день, час, минуту, секунду?

Заранее спасибо!
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Работа с датой и временем.

Post by Vizit0r »

DateUtils с дельфей.
http://www.stealth.od.ua/download/DateUtils.pas
смотри функции типа IncYear, IncDay, IncMnute и т.д.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Murderello
Posts: 2
Joined: 08.03.2012 10:43

Re: Работа с датой и временем.

Post by Murderello »

Да нет же. По операторам и т.д. почти понятно всё, но интересует прежде всего, например, почему конструкция:
var a,b:TDateTime;
begin
a:=now;
b:=a - (1/(24*60)); //или даже b:=now - (1/(24*60));
AddToSystemJournal('a='+DateTimeToStr(a)+ '*** '+'b='+DateTimeToStr(a));
end.

Результат:
22:31:59:187: Compiled succesfully
22:31:59:203: a=08.03.2012 22:31:59*** b=08.03.2012 22:31:59
22:31:59:218: Succesfully executed

...почему такое не работает, хотя должно отнять от даты минуту, но при проверке результата, значения в Стелсе не изменяются... В скудных тех.писах. Паскаль Скрипта объяснения не нашел... Есть подозрения, что перегружается просто переменная по величине, но тем не менее, даже распечаткой циклом значений сложения или вычитания, логики я там нифига не понял.
CFA
Developer
Developer
Posts: 492
Joined: 20.04.2006 6:03
Contact:

Re: Работа с датой и временем.

Post by CFA »

1) - AddToSystemJournal('a='+DateTimeToStr(a)+ '*** '+'b='+DateTimeToStr(a));
два раза выводится переменная "a"
2) b:=a - (1/(24*60)); //или даже b:=now - (1/(24*60));
Эта ошибка уже не очевидна, но конструкция 1/x даст в результате 0, а чтобы получить дробное число надо делить не 1, а 1.0

Это будет работать как ожидается:

Code: Select all

var a,b:TDateTime;
begin
a:=now;
b:= a - (1.0/(24*60)); //или даже b:=now - (1.0/(24*60));
AddToSystemJournal('a='+DateTimeToStr(a)+ '*** '+'b='+DateTimeToStr(b));
end.
Post Reply