Top-office11.ru

IT и мир ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Delphi datetostr formatsettings

Delphi datetostr formatsettings

Как правильно использовать TFormatSettings
пишу
zx.LongDayNames[1]:=»Ïîíåäåëüíèê»;
zx.LongDayNames[2]:=»Âòîðíèê»;
zx.LongDayNames[3]:=»Ñðåäà»;
zx.LongDayNames[4]:=»×åòâåðã»;
zx.LongDayNames[5]:=»Ïÿòíèöà»;
zx.LongDayNames[6]:=»Ñóááîòà»;
zx.LongDayNames[7]:=»Âîñêðåñåíüå»;
и нифига
DateToStr(now,zx) ничего не выдает


TeNY © ( 2004-08-22 16:29 ) [1]

Удалено модератором
Примечание: Создание пустых сообщений


spoyler © ( 2004-08-22 21:56 ) [2]

Нескромный вопрос: а что енто за зверь и где объявлен? И почему в DateToStr результат пишется не в строку, а в массив? 😉
И вывод у него в формате ДД.ММ.ГГ или еще каком, смотри настройки в винде (Панель управления -> Язык и стандарты).


spoyler © ( 2004-08-22 21:58 ) [3]

Сорри, конечно, не массив. Надо по ночам спать меньше. 😉


TeNY © ( 2004-08-24 19:59 ) [4]

енто есть тип рекорд а мой вопрос состоит в том что какие поля и как нужно правильно заполнить чтоб отразилось как нужно то есть 1 день понедельник,2 вторник и тд.


Anatoly Podgoretsky © ( 2004-08-24 20:04 ) [5]

У тебя не дожно компелироваться, если конечно DateToStr не твоя функция. У стандартной только один параметр.


begin. end © ( 2004-08-24 20:22 ) [6]


TeNY © ( 2004-08-25 11:21 ) [7]

смотри внимательнее у этой функции 2 возможных варианта с 1 праметром где TFormatSettings по умолчанию и с 2мя где TFormatSettings запись описывающая формат даты для юзера к примеру живешь ты в зимбабе и английского не знаеш а цифрами смотреть как то отойно.
> Anatoly Podgoretsky © (24.08.04 20:04) [5]
> У тебя не дожно компелироваться, если конечно DateToStr
> не твоя функция. У стандартной только один параметр.

P.S.
кстати вот описание из хелпа
function DateToStr(const DateTime: TDateTime; const FormatSettings: TFormatSettings): string; overload;


Anatoly Podgoretsky © ( 2004-08-25 12:31 ) [8]

Версии 1-6 не наблюдается


TeNY © ( 2004-08-25 14:19 ) [9]

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

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).

Delphi datetostr formatsettings


Стандартный тип дата-время — TDateTime, определенный в модуле System, представляет собой вещественное число типа Double, целая часть которого задает число дней (в том числе и отрицательное), прошедших с 30 декабря 1899 г., а дробная часть — прошедшую долю текущего дня. Так, 35065.75 дает 1 января 1996 г., 18.00. Следует иметь в виду, что символьное представление даты-времени определяется региональной установкой Windows. Здесь под региональной установкой понимается следующее. В разных странах даты, время, а также вещественные числа записываются по-разному. Например, в одних странах в вещественных десятичных числах дробная часть отделяется от целой точкой, а в других — запятой (так, кстати, обозначаются десятичные числа и в нашей стране, однако пользоваться такой записью в тексте самой программы, написанной на Object Pascal, нельзя). По-разному записываются дата и время. Windows позволяет привести символьное представление таких параметров в соответствие с принятыми в данной стране правилами. Delphi может использовать эти установки для соответствующего представления таких параметров. Так, для России следует вводить информацию о дате и времени в виде dd.MM.yy H:mm:ss, где dd — день месяца; ММ — месяц; уу — год; Н — часы; mm — минуты; ss — секунды.

При задании значения даты-времени следует обратить внимание не только на сами значения, но и на знаки препинания. Несущественные части даты-времеи (например, секунды, минуты, часы) можно справа отбросить. В этом случае считается, что соответствующая часть равна нулю. Если в дате-времени отброшено еще и значение года, считается, что имеется в виду текущий год. Обычно тип дата-время используется в параметрах вариантного типа как один из допустимых вариантов, но может использоваться и самостоятельно для фиксации информации о времени.

Примечание. Следует иметь в виду, что при записи года двумя последними цифрами фактический год зависит от текущего года и глобальной переменной заданной в Delphi — TwoDigitYearCenturyWindow. По умолчанию эта переменная имеет значение, равное 50, что означает, что в конце этого столетия и начале следующего задаваемые двумя цифрами годы будут относиться к XX в., если число несколько больше 50, и к XXI в., если число несколько меньше 50.

В модуле SysUtils определен ряд стандартных функции работы с параметрами типа даты-времени.

  • Time — текущее время. Функция возвращает текущее значение времени в формате TTime.
  • Date — текущая дата. Функция возвращает текущее значение даты в формате TDate.
  • Now — текущая дата и время. Функция возвращает текущее значение даты и времени в формате TDateTime.
  • DateTimeToStr (DateTime) — символьное представление даты и времени. Функция формирует для параметра DateTime типа TDateTime символьное представление даты и времени с учетом региональной установки Windows и возвращает полученную строку в качестве результата своей работы.
  • DateTimeToString (Result, Format, DateTime) — сформатированное символьное представление даты и времени. Процедура формирует символьное представление параметра DateTime типа TDateTime с учетом формата, заданного строкой Format, и помещает результат в строку Result.
  • DateToStr (Date) — символьное представление даты. Функция формирует для параметра Date типа TDateTime или TDate символьное представление даты с учетом региональной установки Windows и возвращает полученную строку в качестве результата своей работы.
  • DayOfWeek (Date) — день недели. Функция возвращает день недели заданной даты Date типа TDateTime или TDate в виде числа от 1 до 7, причем нумерация начинается с воскресенья.
  • TimeToStr (Time) — символьное представление времени. Функция формирует для параметра Time типа TDateTime или TTime символьное представление времени с учетом региональной установки Windows и возвращает полученную строку в качестве результата своей работы.
  • DecodeDate (Date, Year, Month, Day) — выделение в дате года, месяца, дня. Процедура выделяет из параметра Date типа TDateTime или TDate год, месяц, день и помещает их соответственно в параметры Year, Month и Day типа Word.
  • DecodeTime (Date, Hour, Min, Sec, MSec) — выделение во времени часа, минуты, секунды и числа миллисекунд. Процедура выделяет из параметра Date типа TDateTime или TTime час, минуту, секунду и число миллисекунд и помещает их соответственно в параметры Hour, Min, Sec и MSec типа Word.
  • EncodeDate (Year, Month, Day) — формирование даты из компонент. Функция формирует из заданного года, месяца и дня (заданных в параметрах Year, Month, Day) комплексный параметр типа TDateTime и возвращает его как результат работы.
  • EncodeTime (Hour, Min, Sec, MSec) — формирование времени из компонент. Функция формирует из заданных часа, минуты, секунды и числа миллисекунд (заданных в параметрах Hour, Min, Sec, MSec) комплексный параметр типа TDateTime и возвращает его как результат работы.
  • FormatDateTime (Format, DateTime) — сформатированное символьное представление даты и времени. Функция формирует символьное представление параметра DateTime типа TDateTime с учетом формата, заданного строкой Format, и возвращает полученную строку как результат своей работы.
  • StrToDate (S) — преобразование символьного представления даты в тип TDateTime. Функция преобразовывает символьное представление даты, находящееся в строке S, в формат TDateTime или TDate и возвращает полученную величину как результат своей работы. Дата должна быть задана в соответствии с региональной установкой Windows.
  • StrToTime (S) — преобразование символьного представления времени в тип TDateTime. Функция преобразовывает символьное представление времени, находящееся в строке S, в формат TDateTime или TTime и возвращает полученную величину как результат своей работы. Время должно быть задано в соответствии с региональной установкой Windows.
  • StrToDateTime (S) — преобразование символьного представления даты и времени в тип TDateTime. Функция преобразовывает символьное представление даты и времени, находящееся в строке S, в формат TDateTime и возвращает полученную величину как результат своей работы. Дата и время должны быть заданы в соответствии с региональной установкой Windows.

Тепеть разберем некоторые функции на примерах.

DateTimeToString

DateTimeToStr

DateToStr

TimeToStr

А сейчас попробуем написать часы, применяя описанные выше процедуры и функции. С созданием цифровых часов не должно возникнуть никаких проблем, а вот с аналоговыми нужно повозиться. Но мы, как настоящие программисты, не боимся трудностей, и возьмемся за реализацию этой задачи. И первое, что мы сделаем при запуске программы, узнаем координаты центра часов и вычислим радиус.

Обновлять информацию о времени будем, используя таймер, и сделаем возможность запуска/остановки часов. Запускать и останавливать таймер будем следующей процедурой.

Таймер, через определенные интервалы времени, будет получать информацию о дате и времени, выводить ее, и вызывать процедуру рисования аналоговых часов.

А вот и сама процедура рисования аналоговых часов.

Из примера видно, что сделать часы, в том числе и аналоговые, не представляет из себя ничего сложного. Я думаю, не возникнет больших проблем при разборе данного примера.

Delphi datetostr formatsettings

Есть такая интересная функция.

Проблема в том, что она не работает. И вот почему:
При использовании в настройках локали формата для ShortDate вида dd.mm.yyyy и подобных все впорядке. Но стоит указать в формате dd-mmm-yyyy или dd-mmmm-yyyy или ddd-mm-yyyy использование этой функции не представляется возможным. Особенность этих форматов — день или месяц указываются не цифрами а буквами.
Если кому-то не лень посмотреть исходник этой функции, то там есть такие интересные строки:

Из этих двух замечательных строчек можно видеть, что борланд вообще не расчитывал принимать буквы в строчке из которой конвертится. Если посмотреть на функцию дальше, то видно, что из FormatSettings ничего кроме DateSeparator и TimeSeparator не используется вообще.

Кто не верит, пусть попробует установить в локали короткий формат для даты dd-mmm-yyyy и преобразовать из строки ’10-янв-2007′ в дату.

Собственно вопросы:
1. Риторический — о чем думали в борланде когда это писали?
2. Как с этим можно бороться (кроме как написать собственный функционал с учетом всего, что на самом деле есть в FormatSettings’ах)? Есть ли готовые решения?

Просто смотря на .NET даж завидно становится, там все учтено. Но в силу обстоятельств приходится использовать детище борланда.
П.С. Извиняюсь за много текста, просто уже накипело

От: OdesitVadim
Дата:20.08.07 11:45
Оценка:

Здравствуйте, Spaun2002, Вы писали:

S>Есть такая интересная функция.

S>

[scip]
А самому розродиться и написать?
Причина почему не написано — банальна. .НЕт затевался с поддержкой юникода, интернационала
А делфи нет. К тому же поддерживать все извраты — уж извольте.
И напоследок, в хелпе сказано что она поддерживает? нет? так что же критикуете. Универсально написать нельзя

От: Spaun2002
Дата:20.08.07 11:59
Оценка:

Здравствуйте, OdesitVadim, Вы писали:

OV>А самому розродиться и написать?
OV>Причина почему не написано — банальна. .НЕт затевался с поддержкой юникода, интернационала
OV>А делфи нет. К тому же поддерживать все извраты — уж извольте.
OV>И напоследок, в хелпе сказано что она поддерживает? нет? так что же критикуете. Универсально написать нельзя

Ну а при чем здесь юникод-то? Эта функция даже текущую локаль не понимает.
А универсальную функцию написать можно. Для этого все необходимое есть в FormatSettings. И я собственно свою реализацию и написал.
Не понимаю я только, почему это в борланде не сделали? Сложно им это было чтоли или лениво?

От: Spaun2002
Дата:20.08.07 12:49
Оценка:
От: Alex.Che
Дата:20.08.07 12:54
Оценка:

Привет, Spaun2002!
Вы пишешь 20 августа 2007:

S> В реестре есть ключ HKEY_CURRENT_USER/Control Panel/International/Calendars/TwoDigitYearMax
S> но он существует не всегда. Есть ли возможность через API или COM вытащить эту границу?

Если ты его не видишь чистА визуально, то это не означает, что для него нет дефолтного значения.


With best regards, Alex Cherednichenko.

От: a18
Дата:20.08.07 15:00
Оценка:

Здравствуйте, Spaun2002, Вы писали:

S>Есть такая интересная функция.
S>
S>Проблема в том, что она не работает. И вот почему:

Кстати, а с какой целью вы её используете?
По своему опыту, напоровшись в детстве на пару граблей с DateTimeToStr/StrToDateTime, клятвенно пообещал себе никогда их больше не использовать, а для хранения даты/времени в текстовом виде применять фиксированный формат (например, ISO).
Пока удаётся этот обет держать, и уже десяток раз убедился в правильности этого подхода.

От: Spaun2002
Дата:20.08.07 15:09
Оценка:

Здравствуйте, a18, Вы писали:

a18>Кстати, а с какой целью вы её используете?
a18>По своему опыту, напоровшись в детстве на пару граблей с DateTimeToStr/StrToDateTime, клятвенно пообещал себе никогда их больше не использовать, а для хранения даты/времени в текстовом виде применять фиксированный формат (например, ISO).
a18>Пока удаётся этот обет держать, и уже десяток раз убедился в правильности этого подхода.

Я бы с радостью избавился от подобного представления дат. Но к сожалению этого нельзя сделать. Смесь из DevExpress + различные компоненты доступа + использование программы в разных странах не оставляют места для маневров.

От: Spaun2002
Дата:20.08.07 15:12
Оценка:

Здравствуйте, Alex.Che, Вы писали:

AC>Если ты его не видишь чистА визуально, то это не означает, что для него нет дефолтного значения.

Я нисколько не сомневаюсь, что это значение есть. И если установленное в системе не отличается от дефолтного, то этот раздел не создается.
Я видимо не правильно выразился ранее: это не ключ, это раздел. А каким образом можно прочитать значения ключей из несуществующего раздела мне неизвестно.

От:Аноним
Дата:20.08.07 15:26
Оценка:
От: a18
Дата:20.08.07 17:07
Оценка:

Здравствуйте, Spaun2002, Вы писали:

S>Я бы с радостью избавился от подобного представления дат. Но к сожалению этого нельзя сделать. Смесь из DevExpress + различные компоненты доступа + использование программы в разных странах не оставляют места для маневров.

Жуть. Мои соболезнования.

Посмотрел в «Королевстве» — народ то же самое пишет (что реализован только короткий формат):
http://www.delphikingdom.com/asp/answer.asp? >
Кстати, возможно, программисты Борланда поступили мудро — лично я бы не рискнул брать ответственность за корректное преобразование строковых дат с учётом особенностей разных языков — хотя бы потому, что в том же Королевстве очень часто задаётся вопрос — как сменить вывод даты с «20 август 2007» на «20 августа 2007 г.» Т.е. обратное преобразование в общем случае будет похоже на разгадку шифра (кстати, интересно, как эти вариации .NET переварит), а учитывая, что, к примеру, строка «01/02/07» для американца и британца обозначает совершенно разные даты, проще застрелиться

От: Spaun2002
Дата:21.08.07 04:04
Оценка:

Здравствуйте, Аноним, Вы писали:

А>GetLocaleFormatSettings() спасает?

Нет. Как я писал в начале, нативная борландовая функция забивает на все, что записано в FormatSettings кроме DateSeparator.

От: OdesitVadim
Дата:21.08.07 08:20
Оценка:
От: Spaun2002
Дата:22.08.07 06:10
Оценка:
От: Bedazzle
Дата:03.10.07 09:21
Оценка:

Здравствуйте, Spaun2002, Вы писали:

S>Есть такая интересная функция.

S>

Ссылка на основную публикацию
Adblock
detector
×
×