RecodeDate — Функция Delphi

Delphi-Help

DecodeDate

DecodeDate

Описание

procedure DecodeDate ( const SourceDate : TDateTime; out Year, Month, Day : Word ) ;

Процедура DecodeDate извлекает значения года, месяца и дня из данного SourceDate TDateTime значение типа.
Она сохраняет значения в переменных вывода: Year, Month и Day.

Пример кода

var
myDate : TDateTime;
myYear, myMonth, myDay : Word;
begin
// Установка переменной myDate в значение декабря 2000
myDate := StrToDate(’29/12/2000′);
// Теперь добавляме месяц к этому значению
myDate := IncMonth(myDate);
// И позволяем нам увидеть, что мы получили
DecodeDate (myDate, myYear, myMonth, myDay);
ShowMessage(‘myDate сейчас = ‘+DateToStr(myDate));
ShowMessage(‘myDay = ‘+IntToStr(myDay));
ShowMessage(‘myMonth = ‘+IntToStr(myMonth));
ShowMessage(‘myYear = ‘+IntToStr(myYear));
end;

myDate сейчас = 29/01/2001
myDay = 29
myMonth = 1
myYear = 2001

Справочник функций и процедур Delphi: DecodeDate

Навигация по первой букве:
Навигация по Unit:

Compiler directives, Directives, Keywords / Types, Variables, Constants / Functions, Procedures

Навигация по категории:
Реклама:
DecodeDate
Процедура
Извлекает значения года, месяца, дня из TDateTime переменной SysUtils unit
procedure DecodeDate ( const SourceDate : TDateTime; out Year, Month, Day : Word ) ;
Описание
Процедура DecodeDate извлекает значения года, месяца и дня из данного SourceDate TDateTime значение типа.

Она сохраняет значения в переменных вывода: Year, Month и Day.

Похожие команды
DecodeDateTime Разбивает TDateTime переменную на ее части даты/времени

DecodeTime Разбивает значение TDateTime на отдельные значения времени

EncodeDate Формирует значение TDateTime из значений года, месяца и дня

EncodeDateTime Формирует значение TDateTime из значений времени и дня

EncodeTime Формирует значение TDateTime из значений часа, минуты, секунды и миллисеккунды

RecodeDate Изменяет только дату переменной TDateTime

RecodeTime Изменяет только время переменной TDateTime

ReplaceDate Изменяет только часть даты TDateTime переменной

ReplaceTime Изменяет только часть времени TDateTime переменной

RecodeDate — Функция Delphi

Описание
Процедура возвращает год (Year) месяц (Month) и день (Day) даты, значение которой указанно в формате TDateTime. Исходная дата передается в параметре D. Если значение D&#60=0 или не содержит значение даты, то в переменные Year, Month, Day записывается 0.

Пример
var
D: TDateTime;
Year, Month, Day: Word;
begin
D:= Now;
DecodeDate(D, Year, Month, Day);
MessageDlg( ‘Сегодня’ +#13#13+ ‘Число: ‘+ IntToStr(Day)+ #13+ ‘Месяц: ‘+ IntToStr(Month)+ #13+ ‘Год: ‘+ IntToStr(Year), mtInformation, [mbOk], 0);
end;

Is there a Delphi EncodeDate/DecodeDate function version that can handle B.C. dates?

The Delphi functions EncodeDate/DecodeDate seem to be able to handle only dates after 1.1.0001. Are there some implementations of EncodeDate/DecodeDate that can handle B.C. tDateTime values?

1 Answer 1

AFAIK TDateTime is a Windows base type, common to COM, Variants, DotNet and Delphi. Negative values can be used for dates before 1899.

But that is not so simple — since with negative values comes some trouble, as stated by this page:

The integral part is the date, the fraction is the time. Date.time. That’s easy. Things get odd when the value is negative. This is on or before #12/30/1899#.

With modern dates time always runs forwards, as you would suspect. With negative historical dates time actually runs backwards! Midnight #1/1/1800# equals −36522, but noon #1/1/1800# is −36522.5 (less than midnight!) and one second before midnight is −36522.9999884259 (even less). At midnight the clock jumps forward to -36521, which equals #1/2/1800#. The decimal fraction still shows the time and the integral part is the date, but each second decrements the clock while each new day increments it, not just by 1, but by almost 2. Negative times are really counterintuitive.

To make things worse, time values for #12/30/1899# are ambigous in two ways. First, a time value without a date equals that time on #12/30/1899#. This means that 0.5 is either noon or noon on #12/30/1899#, depending on context. Zero is either m >

To my knowledge, the current implementation of EncodeDate/DecodeDate will work, but you may go into troubles when working with negative or near to zero TDateTime values.

You should better use your own time format, e.g. ISO-8601 or a simple record as such:

And when computing things about duration or displaying date/time, you must be aware that «our time» is not continuous. So calculation using the TDateTime=double trick won’t always work as expected. For instance, I remember that Teresa of Avila died in 1582, on October 4th, just as Catholic nations were making the switch from the Julian to the Gregorian calendar, which required the removal of October 5–14 from the calendar. :)

Процедуры и функции работы с датой и временем

Function Date: TDateTime;

Возвращает текущую дату.

Function DateTimeToStr(DateTime: TDateTime): String;

Преобразовывает параметр типа TDateTime, содержащий дату и время, в строку. Если параметр DateTime не содержит значения даты, дата устанавливается в 00/00/00. Если параметр DateTime не содержит значения времени, время устанавливается в 00:00:00.

Function DateToStr(Date: TDateTime): String;

Преобразовывает параметр типа TDateTime, содержащий дату, в строку.

Преобразование использует формат, определенный глобальной переменной ShortDateFormat.

Function DayOfWeek(Date: TDateTime): Integer;

Возвращает день недели определенной даты как целое число между 1 и 7. Воскресенье — первый день недели, и суббота — седьмой.

Procedure DecodeDate(Date: TDateTime; var Year, Month, Day: Word);

Извлекает дату из формата TDateTime и помещает год, месяц и день соответственно в переменные Year, Month и Day.

Procedure DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec: Word);

Извлекает время из формата TDateTime и помещает часы, минуты, секунды, и миллисекунды соответственно в переменные Hour, Min, Sec и MSec.

Function EncodeDate(Year, Moth, Day: Word): TDateTime;

Возвращает дату в формате TDateTime, полученную из значений параметров Year, Month и Day.

Year должен быть между 1 и 9999.

Допустимые значения Month — от 1 до 12.

Допустимые значения Day — от 1 до 28, 29, 30, или 31, в зависимости от значения Month. Например, возможные значения Day в течение второго месяца (февраля) — от 1 до 28, или от 1 до 29, в зависимости от того, определяет или нет значение Year високосный год.

Если значения находятся вне диапазона, возникает исключительная ситуация EConvertError. Возникающее в результате значение — единица плюс число дней между 30/12/1899 и данной датой.

Function EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime;

Возвращает время в формате TDateTime, полученное из значений параметров Hour, Min, Sec и MSec.

Если значение типизированной константы Time24Hour ложно (False), значения Hour лежат в пределах от 0 до 12, если истинно (True) — от 0 до 23.

Допустимые значения Min и Sec — от 0 до 59. Допустимые значения MSec — от 0 до 999.

Если значения находятся вне диапазона, возникает исключительная ситуация EConvertError.

Function Now: TDateTime;

Возвращает текущую дату и время в формате TDateTime (дата + время).

Function StrToDate(const S: String): TDateTime;

Преобразовывает строковое представление даты в формат TDateTime. Дата в параметре S должна быть записана по правилам Windows, т.е. должна состоять из двух или трех чисел, отделяемых символом, опреде-ленным в глобальной переменной DateSeparator. Порядок следования месяца, дня и года определен в глобальной переменной ShortDateFormat. Возможные комбинации — m/d/y, d/m/y, и y/m/d.

Если строка содержит только два числа, это интерпретируется как дата (m/d или d/m) в текущем году. Значения Year между 0 и 99 означают год в текущем столетии.

Если строка содержит дату в неверном формате, возбуждается исключительная ситуация EConvertError.

Function StrToTime(Const S: String): TDateTime;

Преобразовывает строковое представление времени в формат TDateTime.

Строка должна состоять из двух или трех чисел, отделяемых символом, определенным в глобальной переменной TimeSeparator. Числа представляют собой часы, минуты, и (необязательно) секунды, в соответствующем порядке.

Если строка содержит время в неверном формате, возбуждается исключительная ситуация EConvertError.

Function Time: TDateTime;

Возвращает текущее время.

Function TimeToStr(Time: TDateTime): String;

Преобразовывает время из формата TDateTime в строковое представление.

Преобразование использует формат, определенный в глобальной переменной LongTimeFormat. Вы можете изменять формат отображения времени, изменяя значения переменных даты и времени (или используя Панель управления Windows).

RecodeDate — Функция Delphi

Не знаю даже куда писать?
Создал пустое приложение на Delphi

procedure TForm1.FormCreate(Sender: TObject);
var wYear, wDay, wMonth : word;
begin
DecodeDate(Now,wYear,wMonth,wDay);
ShowMessage(IntToStr(wYear));
end;
Показывает 2007

В своей программе использую synautil
в ней функция

function Rfc822DateTime(t: TDateTime): string;
var
wYear, wMonth, wDay: word;
begin
DecodeDate(t, wYear, wMonth, wDay);
Result := Format(«%s, %d %s %s %s», [MyDayNames[DayOfWeek(t)], wDay,
MyMonthNames[1, wMonth], FormatDateTime(«yyyy hh»:»nn»:»ss», t), TimeZone]);
end;

исправил function Rfc822DateTime(t: TDateTime): string;
var
wYear, wMonth, wDay: word;
begin
DecodeDate(t, wYear, wMonth, wDay);
MessageBox(0,PChar(IntToStr(wYear)),»Test»,0);
Result := Format(«%s, %d %s %s %s», [MyDayNames[DayOfWeek(t)], wDay,
MyMonthNames[1, wMonth], FormatDateTime(«yyyy hh»:»nn»:»ss», t), TimeZone]);
end;
и перадаю Now
в итоге вижу 3906.

Написал такой program Project1;

var wYear, wDay, wMonth : word;
begin
DecodeDate(Now,wYear,wMonth,wDay);
MsgOK(Int2Str(wYear));

end.
Результат 2007.

Не понимаю — кто виноват? synautil?

Вряд ли.
Может ли Now меняться в программе?

В пустой программе он равен 39300.
В моей больше 700000.

See my reply in the Synapse mailing list.

Do not mix VCL and KOL DateTime functions!
In SynaUtil uses section replace SysUtils with KOL.

From the KOL documentation:

const VCLDate0 = 693594;
Value to convert VCL «date 0» to KOL «date 0» and
back. This value corresponds to 30-Dec-1899, 0:00:00.
So, to convert VCL date to KOL date, just subtract
this value from VCL date. And to convert back from KOL
date to VCL date, add this value to KOL date.

Joe,
Thank you very much. This work!

Существует ли версия функции Delphi EncodeDate / DecodeDate, которая может обрабатывать даты BC?

Функции Delphi EncodeDate / DecodeDate, похоже, способны обрабатывать только даты после 1.1.0001. Существуют ли некоторые реализации EncodeDate / DecodeDate, которые могут обрабатывать значения BC tDateTime?

1 ответ

AFAIK TDateTime — это базовый тип Windows, общий для COM, Variants, DotNet и Delphi. Отрицательные значения можно использовать для дат до 1899 года.

Но это не так просто, поскольку с отрицательными значениями возникают проблемы, как указано на этой странице :

Неотъемлемой частью является дата, а дробью — время. Date.time. Это легко. Вещи становятся странными, когда значение отрицательное. Это на или до # 12/30/1899 #.

С современными датами время всегда идет вперед, как вы и предполагали. С отрицательными историческими датами время фактически бежит назад! Полночь # 1/1/1800 # равняется -36522, но полдень # 1/1/1800 # равна -36522,5 (меньше полуночи!), А за одну секунду до полуночи — -36522.9999884259 (даже меньше). В полночь часы переходят на -36521, что равно # 1/2/1800 #. Десятичная дробь по-прежнему показывает время, а неотъемлемой частью является дата, но каждая секунда уменьшает время, в то время как каждый новый день увеличивает его, не только на 1, но почти на 2. Отрицательные времена действительно противоречат интуитивному принципу.

Что еще хуже, значения времени для # 12/30/1899 # неоднозначны в двух отношениях. Во-первых, значение времени без даты равно этому времени в # 12/30/1899 #. Это означает, что 0.5 — это либо полдень, либо полдень на # 12/30/1899 #, в зависимости от контекста. Ноль — это или полночь, # 12/30/1899 # или полночь # 12/30/1899 #. Другая двусмысленность состоит в том, что все значения времени удваиваются для # 12/30/1899 #. 0.5 — полдень # 12/30/1899 #, но -0.5 также полдень # 12/30/1899 #. Неотъемлемой частью является дата, а дробью — время. Еще один сюрприз здесь: # 12/30/1899 23:59:59 PM # — # 12/29/1899 11:59:59 PM # = 2.99997685185185. Не 1, что вы обычно ожидаете в течение 24 часов. Будьте осторожны при работе с историческими датами.

Насколько мне известно, текущая реализация EncodeDate / DecodeDate будет работать, но у вас могут возникнуть проблемы при работе с отрицательными или близкими к нулю значениями TDateTime .

Вам лучше использовать свой собственный формат времени, например, ISO-8601 или простую запись как таковую:

И при вычислении вещей о продолжительности или отображении даты / времени вы должны знать, что «наше время» не является непрерывным. Таким образом, расчет с использованием трюка TDateTime=double не всегда будет работать должным образом. Например, я помню, что Тереза из Авилы умерла в 1582 году 4 октября , так же, как католические народы переходили от юлианского к григорианскому календарю, что требовало удаления 5–14 октября из календаря. :)

Есть ли версия функции Delphi EncodeDate/DecodeDate, которая может обрабатывать B.C. даты?

Функции Delphi EncodeDate/DecodeDate, похоже, способны обрабатывать только даты после 1.1.0001. Существуют ли некоторые версии EncodeDate/DecodeDate, которые могут обрабатывать B.C. Значения tDateTime?

Создан 28 июл. 11 2011-07-28 09:26:40 blerontin

Хм, хороший вопрос. Есть ли определенный календарь для дат BC? На самом деле, существует ли определенный календарь для дат с TDateTime – David Heffernan 28 июл. 11 2011-07-28 09:35:15

Это утверждение, похоже, противоречит тексту справки, отображаемому для «TDateTime» в моей установке Delphi 2006.Фактически уже значения даты для дат до 1899-12-30 имеют отрицательное значение, и ‘EncodeDate’ явно разрешает их. Текст справки для «TDateTime» не содержит никаких утверждений о допустимом/поддерживаемом диапазоне, только «EncodeDate», кажется, ограничивает диапазон датами после года 1 — вот почему я попросил некоторую расширенную реализацию функций Delphi по умолчанию «EncodeDate/DecodeDate» , – blerontin 28 июл. 11 2011-07-28 09:42:00

Я удалил свой предыдущий комментарий, который, конечно, неверен. Тем не менее, я сомневаюсь, работает ли TDateTime даже для дат до 1.1.0001. В любом случае, какой календарь вы хотите использовать? – David Heffernan 28 июл. 11 2011-07-28 09:43:48

Я думаю, что [пролепический григорианский календарь] (https://secure.wikimedia.org/wikipedia/en/wiki/Proleptic_Gregorian_calendar) будет достаточным. Но в принципе обе функции должны быть просто симметричными, вызывая ‘Date: = MyEncodeDate (-700, 1, 1)’, а иногда иногда ‘MyDecodeDate (Date, Year, Month, Day)’ должен возвращать ‘Year = -700′,’ Месяц = ​​1′ и ‘День = 1’. – blerontin 28 июл. 11 2011-07-28 10:33:00

Дэвид: из того, что я помню из календаря, многие страны Восточной Европы только изменились на григорианские в тридцатые годы. Даже даты после 1899-12-30 годов не всегда верны везде. – Marco van de Voort 28 июл. 11 2011-07-28 11:45:51

До начала принятия григорианского календаря в 1582 году фактические даты не имеют смысла, поскольку универсальный календарь не использовался. Поэтому EncodeDate/DecodeDate не имеет никакого смысла до этого, потому что они моделируются по григорианскому календарю. – Misha 28 июл. 11 2011-07-28 14:14:19

@ Misha Если вы довольны пролептическим григорианским календарем, тогда вы можете просто скопировать свои собственные версии EncodeDate/DecodeDate, которые использовали знаковые целые числа, а не «Word». Вам придется иметь дело с тем, что нет никакого года 0! – David Heffernan 28 июл. 11 2011-07-28 18:24:12

@ Давид, не нужно — я не использую даты задолго до 1900 года. Я думаю, что самые ранние даты, которые я использую, являются датами рождения, поэтому, возможно, даты, которые я использую, не были до 1900 года. Я хочу сказать, что логично не использовать даты до определенного времени, потому что они фактически ничего не значат. Что означает, скажем, 1 июля, 1001 на самом деле означает? Вы не можете разумно рассчитать день недели для этой даты, как вы можете, с 1 июля 2001 года. Я бы назвал оригинальный вопрос столь же странным. – Misha 29 июл. 11 2011-07-29 03:49:38

1 ответ

AFAIK TDateTime — это базовый тип Windows, общий для COM, вариантов, DotNet и Delphi. Отрицательные значения могут быть использованы для дат до 1899.

Но это не так просто — так как с отрицательными значениями приходит некоторые проблемы, как stated by this page:

Неотъемлемой частью является дата, доля время , Date.time. Это легко. Вещи становятся нечетными, когда значение отрицательное. Это включено или до # 12/30/1899 #.

С современными датами время всегда бежит вперед, как вы подозреваете. С отрицательными историческими датами время действительно бежит назад! Midnight # 1/1/1800 # equals -36522, но полдень # 1/1/1800 # -36522.5 (менее полночь!) И за одну секунду до полуночи -36522.9999884259 (даже нет). В полночь часы перескакивают вперед до -36521, что равно # 1/2/1800 #. Десятичная дробь все еще показывает время, а интеграл часть — это дата, но каждая секунда уменьшает часы, в то время как каждый новый день увеличивает его, а не только на 1, но почти на 2. Отрицательное время действительно противоречит интуиции.

Чтобы усугубить ситуацию, значения времени для # 12/30/1899 # являются двусмысленными двумя способами. Во-первых, значение времени без даты равно этому времени на # 12/30/1899 #. Это означает, что 0,5 — это полдень или полдень на # 12/30/1899 #, в зависимости от контекста. Ноль — полночь, # 12/30/1899 # или полночь # 12/30/1899 #. Другая двусмысленность заключается в том, что все значения времени имеют двойные значения для # 12/30/1899 #. 0.5 — полдень # 12/30/1899 #, но -0.5 — полдень # 12/30/1899 #. Неотъемлемой частью является дата, — это время. Еще один сюрприз здесь: # 12/30/1899 11:59:59 PM # — # 12/29/1899 11:59:59 PM # = 2.99997685185185. Не 1, то, что вы обычно ожидаете в течение 24-часового периода. Будьте осторожны, когда работает с историческими датами.

Насколько мне известно, текущая реализация EncodeDate/DecodeDate будет работать, но вы можете пойти в неприятности при работе с отрицательными или вблизи нулевых значений TDateTime .

Вы должны лучше использовать свое собственное время формате, например ISO-8601 или простая запись, как, например:

И при вычислении вещи о продолжительности или отображении даты/времени, вы должны знать, что «наше время» не является непрерывным. Поэтому расчет с использованием трюка TDateTime=double не всегда будет работать должным образом. Например, я помню, что Teresa of Avila died in 1582, on October 4th, так же, как католические народы переключали с юлианского на григорианский календарь, что требовало удаления 5-14 октября из календаря. :)

Создан 28 июл. 11 2011-07-28 10:01:26 Arnaud Bouchez

Существует ли версия функции Delphi EncodeDate/DecodeDate, которая может обрабатывать B.C. даты?

Функции Delphi EncodeDate/DecodeDate, похоже, способны обрабатывать только даты после 1.1.0001. Существуют ли некоторые версии EncodeDate/DecodeDate, которые могут обрабатывать B.C. Значения tDateTime?

AFAIK TDateTime — это базовый тип Windows, общий для COM, Variants, DotNet и Delphi. Отрицательные значения могут использоваться для дат до 1899 года.

Но это не так просто — поскольку с отрицательными значениями возникает какая-то проблема, как указанная на этой странице:

Неотъемлемой частью является дата, дробь — это время. Date.time. Это просто. Вещи становятся нечетными, когда значение отрицательное. Это включено или до # 12/30/1899 #.

С современными датами время всегда бежит вперед, как вы подозреваете. С отрицательными историческими датами время действительно бежит назад! Midnight # 1/1/1800 # equals -36522, но полдень # 1/1/1800 # -36522.5 (меньше полночь!) и за одну секунду до полуночи -36522.9999884259 (даже Меньше). В полночь часы перескакивают вперед до -36521, что равно # 1/2/1800 #. Десятичная дробь все еще показывает время и интеграл часть — это дата, но каждая секунда уменьшает часы, в то время как каждая новая день увеличивает его, а не только на 1, но почти на 2. Отрицательные моменты действительно противоречивый.

Чтобы ухудшить ситуацию, значения времени для # 12/30/1899 # являются двусмысленными двумя способами. Во-первых, значение времени без даты равно этому времени на # 12/30/1899 #. Это означает, что 0,5 — полдень или полдень на # 12/30/1899 #, в зависимости от контекста. Ноль — либо полночь, # 12/30/1899 # или полночь # 12/30/1899 #. Другая двусмысленность в том, что все временные значения в два раза за # 12/30/1899 #. 0,5 — полдень № 12/30/1899 #, но -0,5 — полдень №12/30/1899 #. Неотъемлемой частью является дата, фракция — это время. Еще один сюрприз здесь: # 12/30/1899 11:59:59 PM # — # 12/29/1899 11:59:59 PM # = 2.99997685185185. Не 1, что вы обычно ожидаете в течение 24-часового периода. Будьте осторожны, когда работая с историческими датами.

Насколько я знаю, текущая реализация EncodeDate/DecodeDate будет работать, но вы можете столкнуться с проблемами при работе с отрицательными или близкими к нулю значениям TDateTime .

Вам лучше использовать свой собственный формат времени, например. ISO-8601 или простая запись как таковая:

И когда вы вычисляете информацию о продолжительности или показываете дату/время, вы должны знать, что «наше время» не является непрерывным. Поэтому вычисление с использованием трюка TDateTime=****** не всегда будет работать должным образом. Например, я помню, что Тереза ​​из Авилы умерла в 1582 году, 4 октября, так же, как католические нации перешли от юлианского к григорианскому календарю, что потребовало удаление 5-14 октября из календаря.:)

DecodeDate работает некорректно

15.04.2020, 22:09

Некорректно работает программа
Здравствуйте, прошу помощи в выполнении следующего задания: «Дана последовательность содержащая от.

Программа работает некорректно
После выполнения программы видает ошибку: «Access violation. Write of address. » Задча.

Некорректно работает Делфи
Привет всем, есть проблема, когда открываю проект в делфи, все окна закрываются и остается только.

Delphi работает некорректно
Здравствуйте, у меня возникли некоторые проблемы с Delphi. В течении первого полугодия у меня было.

Некорректно работает программа
Сам код: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes.

Илон Маск рекомендует:  Атрибут controls в HTML
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL