DateTimeToFileDate — Функция Delphi

DateTimeToFileDate — Функция Delphi

уЕТЧЕТ РПДДЕТЦЙЧБЕФУС
ЛБЖЕДТПК ЙОЖПТНБФЙЛЙ Й ЧЩЮЙУМЙФЕМШОПК ФЕИОЙЛЙ зТзх
ФЕМ. +375-(0)152-445-101
E-mail : kadan@grsu.grodno.by

уРТБЧПЮОЙЛ РП ЖХОЛГЙСН Delphi. тБВПФБ У ДБФБНЙ Й ЧТЕНЕОЕН

ч Delphi ДМС ИТБОЕОЙС ДБФ Щ Й (ЙМЙ) ЧТЕНЕОЙ РТЕДХУНПФТЕО ЖПТНБФ TDateTime, РТЕДУФБЧМСАЭЙК УПВПК, ОБ УБНПН ДЕМЕ, ПВЩЮОПЕ ЮЙУМП У РМБЧБАЭЕК ФПЮЛПК.

рТЙ ЬФПН ДБФБ РТЕДУФБЧМСЕФУС ГЕМПК ЮБУФША ЮЙУМБ, Б ЧТЕНС ? ДТПВОПК. рТЕЙНХЭЕУФЧП ЬФПЗП РПДИПДБ Ч ФПН, ЮФП ФЕРЕТШ ДБФЩ Й ЧТЕНЕОБ НПЦОП ЛПТТЕЛФОП УЛМБДЩЧБФШ Й ЧЩЮЙФБФШ, ОБРТЙНЕТ:

Как правильно работать с датой и временем

26.06.2012, 10:59

Работа с Датой и Временем
Всем привет, помогите решить задачи с датой и временем, ни когда не с сталкивался еще с этим и не.

Работа с датой и временем
ребят. к примеру есть у меня переменная типа дата-время: str:=’12.03.2011 12:23:54′;.

Работа с датой и временем(калькулятор)
Задание: Организовать проект «Калькулятор времени». Вывести на экран текущую дату, а также время(в.

Работа с Датой и Временем. Delphi 7
Подскажите пожалуйста! В ячейке таблицы есть поле со временем длительности. В нем могут.

Сохранение файла с датой и временем в названии
Нужно сохранить текст из Memo1 в текстовый документ, имя которого будет дата и время сохранения .

26.06.2012, 14:05 2

Решение

26.06.2012, 15:51 [ТС] 3

то что вы предлагаете, это неудобно, там нужно складывать часы, дни, месяцы, учитывать сколько дней в месяце ,месяцев в году и тд. а в unixtime достаточно сложить два числа и все.Для тех кто в танке: unix time это кол-во секунд прошедших с 01.01.1970, в дельфе есть аналог, но там только кл-во дней прошедших с 1900 года.а мне нужны месяца, дни, часы,минуты, секунды

Нашел, вот ф-ия преобразующая unixtime и TDateTime в обе стороны

26.06.2012, 15:51

Сделать так, чтобы папка сохранялась с датой и временем в названии
Помогите! не могу понять как в Delphi7 сделать так чтоб папка создавалась с названием даты и время.

Как правильно работать с таблицами Word
Здравствуйте, помогите решить проблему. Строка после таблицы помещается в ее первую ячейку. Как.

Как работать в Perl с датой и временем?
как работать в Perl с датой и временем которые я получаю из MySql, например: как получить.

DateTimeToFileDate — Функция Delphi

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

Примечание. Следует иметь в виду, что при записи года двумя последними цифрами фактический год зависит от текущего года и глобальной переменной заданной в 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-эквивалент C# DateTime.IsDaylightSavingTime() метод нужен

мне нужно как-то определить, есть ли некоторые TDateTime значение находится в диапазоне летнего времени для моего часового пояса или нет (в C# то же самое делает DateTime.IsDaylightSavingTime() метод).

Я знаю, что в Delphi нет подобной функции, потому что Delphi TDateTime Не содержит информации о часовом поясе, но я полагаю, что есть способ сделать это с помощью Win32 API.

Я посмотрел на Win32 API GetTimeZoneInformation и GetTimeZoneInformationForYear функции, но я не совсем понимаю, как их использовать, поэтому я бы прошу вас о помощи. Заранее спасибо за любые советы.

Edit:

в моем часовом поясе (Центрально-Европейском) летнее время началось в этом году 28 марта в 2 часа ночи и заканчивается 31 октября 2010 года в 3 часа ночи.

мне нужна функция с заголовком:

, что вернет true если дата ввода находится между 28 марта 2010 2: 00 и 31 октября 2010 3: 00 и false если не.

(The пример только для 2010 года, но мне нужно, чтобы он работал все годы.)

еще раз, я знаю, что информации, сохраненной только в TDateTime, недостаточно, но я думаю, что с некоторой функцией Win32 API я должен иметь возможность получить, например, информацию о текущем часовом поясе из настроек Windows.

7 ответов

это не так просто, как кажется, потому что:

1) Дата переключения между DST и стандартным временем не одинакова для всех стран

2) Дата переключения между DST и стандартным временем не является одним и тем же алгоритмом для одной и той же страны для всех лет (например, в Центральной Европе это было ранее первое воскресенье в апреле, IIRC, теперь это последнее воскресенье в марте). США изменились с первого воскресенья апреля на второе воскресенье марта 2007 года и на.

Итак-простой даты недостаточно, вам также понадобится географическое местоположение.

но, если вы можете жить с тем фактом, что вы ограничиваете себя датами переключения, которые могут быть рассчитаны из настоящее на настоящее год настоящее locale (country) и что это может быть неправильно для дат как в будущем, так и в прошлом, тогда вы можете использовать информацию в TIME_ZONE_INFORMATION для рассчитайте даты переключения:

петля через 2000-2020 годы на моем ПК (часовой пояс Центральной Европы), я получаю следующие даты:

но, по крайней мере, некоторые из этих лет неверны из-за того, что алгоритм изменился с моего языка в перечисленные годы.

ваша функция будет иметь следующий вид:

может быть, это перебор для вашего конкретного приложения, но проект с открытым исходным кодом «база данных часовых поясов Olson для Delphi» позволяет получить доступ к все часовые пояса при поддержке база данных tz. База данных регулярно обновляется с новейшими переход на летнее время изменения или исправления.

TZDB можно скомпилировать на Delphi 6, 7, 8, 9, 10 2007, , 2009, 2010 и XE или FreePascal 2.0 и выше. TZDB-это лучший используется с Delphi XE, который вводит класс TTimeZone в RTL.

Да, вы правы. Вам нужно:

установить TDateTime в Delphi переменной даты/времени

преобразовать его в Windows SystemTime

вызовите GetTimeZoneInformation (), чтобы получить TTimeZoneInformation

вызовите GetTimeZoneInformationForYear (), с вашей структурой TTimeZoneInformation, чтобы получить информацию DST для вашего часового пояса (я не уверен, где вы получите TTimeZoneInformation для некоторого произвольного часового пояса-но вы должны быть в состоянии найти его на MSDN).

сделайте арифметику, чтобы увидеть, происходит ли ваше системное время после TTZI.StandardDate (в этом случае это стандартное время) или после TTZI.DaylightDate (в этом случае это DST).

возможно, вы могли бы просто преобразовать это в Delphi таблица:

для любого datetime в любом часовом поясе, просто посмотрите, попадает ли данное datetime в DST или вне его. Вуаля! Нет Microsoft APIs-просто простой поиск таблицы или блок if / else case!

‘надеюсь, это поможет .. pSM

Как вы сами говорите, эта информация не хранится в комплекте с датами в Delphi, поэтому вы не можете просто перенести это. Каждую процедуру, которая proceduces в tdatetime бы добавить эту информацию, чего не бывает в Дельфах.

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

я использовал .NET reflector для просмотра реализации этой функции .сеть. Он определяется следующим образом, может быть, вы можете преобразовать математику в Delphi? Если вам нужно копнуть глубже в это, я предлагаю открыть рефлектор для себя. Я думаю, это поможет вам!

вы можете найти пример этого в библиотека кодов джедаев (С открытым исходным кодом) в JclDateTime.блок pas, в функции LocalDateTimeToDateTime. Информация о летнее время извлекается и используется для преобразования В и из времени UTC.

Я знаю, что это не ответ на ваш вопрос, но вас могут заинтересовать следующие две функции: SystemTimeToTzSpecificLocalTime() и TzSpecificLocalTimeToSystemTime() . Первый преобразует универсальное время в соответствующее время для указанного часового пояса (где nil означает локальный часовой пояс). Другой работает наоборот, но включен только в Windows XP и выше, как говорит Borland Help. Если вы собираетесь делать только преобразование времени в зависимости от часового пояса, они должны быть в порядке для вас. И это хорошо знать. что они проверяют, является ли время UTC заданным DST или стандартным временем. Я не читал нигде. Я только что проверил это сам, поэтому, пожалуйста, поправьте меня, если я ошибаюсь.

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

System.SysUtils.DateTimeToFileDate

Properties

Description

Converts a TDateTime value into an OS timestamp value.

A timestamp is a signed 32-bit integer, used by the Operating System to record information such as the date and time a file was modified. The precise format of a timestamp depends on the OS. Use DateTimeToFileDate to convert a TDateTime value to an OS timestamp value.

DateTimeToFileDate is particularly useful for converting the Time field of the TSearchRec type used by the FindFirst and FindNext functions.

DateTimeToFileDate Routine

Unit Edit

Description Edit

Definition (Delphi 6, 2007, 2010):

Technical Comments Edit

(Known issues / Documentation clarifications / Things to be aware of)

Examples Edit

(Please provide links to articles/source code that show how to use this item.)

See Also Edit

(Please provide links to items specifically related to this item.)

User Comments/Tips Edit

(Please leave your name with your comment.)

DateTimeToFileDate doesn’t work

I have this code:

Simply I want to set date of a file, but it doesn’t work, Where do I make a mistake? Thanks for help.

1 Answer 1

The methods you call on TFile expect a TDateTime . So remove the DateTimeToFileDate calls.

Of course, you can remove the time stamp indirection.

Not the answer you’re looking for? Browse other questions tagged delphi delphi-xe2 or ask your own question.

Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

site design / logo © 2020 Stack Exchange Inc; user contributions licensed under cc by-sa 4.0 with attribution required. rev 2020.11.11.35399

DateTimeToFileDate — Функция Delphi

Ниже описываются Delphi функции для работы с файлами. В таблице содержатся практически все Delphi функции для работы с файлами, как создающие, переименовывающие, удаляющие файлы и каталоги, так и Delphi функции поиска файлов, обладающих заданными характеристиками.

Type Visibility Source Unit Parent
function public
procedure AssignFile Связывает файловую переменную F с именем файла FileName.
procedure ChDir Изменяет текущий каталог. Path — переменная, задающая путь к устанавливаемой по умолчанию папке.
procedure CloseFile Закрывает файл, однако связь файловой переменной с именем файла, установленная ранее процедурой AssignFile сохраняется. Функции процедуры CloseFile на системном уровне выполняются автоматически по отношению ко всем открытым файлам при нормальном завершении программы. Если после применения процедуры CloseFile файл нужно открыть повторно, процедуру AssignFile можно не применять, так как связь файловой переменной с файлом не разрывается.
function DateTimeToFileDate Преобразует значение переменной DateTime типа TDateTime Delphi в системный формат времени создания (обновления) файла.
function FileDateToDateTime Преобразует системный формат времени создания (обновления) файла в формат TDateTime Delphi.
function DiskFree Возвращает объём в байтах свободного пространства на указанном диске. Переменная D — номер диска (0 — устройство по умолчанию, текущий диск; 1 — диск А; 2 — диск B; 3 — диск С и т.д.). Функция возвращает значение -1, если указан номер несуществующего диска.
function DiskSpace Возвращает объём в байтах полного пространства на указанном диске. Переменная D — номер диска (0 — устройство по умолчанию, текущий диск; 1 — диск А; 2 — диск B; 3 — диск С и т.д.). Функция возвращает значение -1, если указан номер несуществующего диска.
function EOF Тестирует конец файла и возвращает True, если файловый указатель стоит в конце файла. При записи это означает, что очередной компонент будет добавлен в конец файла, при чтении — что файл исчерпан.
procedure Erase Уничтожает файл F. Перед выполнением процедуры файл должен быть закрыт процедурой CloseFile.
function FileAge Для файла FileName возвращает время его последнего обновления (в системном формате) или -1, если такого файла не существует.
function FileExists Возвращает True, если файл FileName существует, и False в противном случае.
function FileGetDate По заданному дескриптору файла Handle возвращает время и дату его создания (в системном формате). Если дескриптор не существует, возвращает -1.
function FileSetDate Возвращает в переменной F типа TSearchRec первый из файлов, зарегистрированных в указанном каталоге. Path: путь поиска с маской выбора файлов; Attr: атрибуты выбираемых файлов.
function FindNext (var F: TSearchRec): Integer; Возвращает в переменной F следующий файл в каталоге. Переменная F должна быть предварительно инициирована обращением к функции FindFirst.
procedure FindClose Освобождает память, выделенную для поиска файлов функциями FindNext и FindFirst.
procedure Flush(var F); Очищает внутренний буфер файла, гарантируя тем самым сохранность всех последних изменений файла на диске.
procedure GetDir (D: Byte; var S: String); Возвращает текущий каталог (каталог по умлочанию). D — номер устройства (0: устройство по умолчанию, 1 — диск А, 2 — диск В и т.д.); S — переменная типа String, в которой возвращается путь к текущему каталогу на указанном диске.
procedure MkDir (Dir: String); Создаёт новый каталог на текущем диске. Dir — адрес нового каталога, который не может совпадать с именем уже существующего каталога.
procedure Rename (var F; NewName: String); Переименовывает, т.е. задаёт новые адрес и имя файла F.
NewName — строковое выражение, содержащее новые адрес и имя файла. Перед выполнением процедуры необходимо закрыть файл.
procedure Reset (var F: File[; RecSize: Word]); Открывает существующий файл. Переменная RecSize имеет смысл только для нетипизированных файлов и указывает размер блока данных.
procedure Rewrite (var F: File[; RecSize: Word]); Создаёт новый файл. Переменная RecSize имеет смысл только для нетипизированных файлов и указывает размер блока данных.
procedure RmDir (Dir: String); Удаляет каталог Dir. Удаляемый каталог должен быть пустым, т.е. не содержать файлов или вложенных каталогов.
function CopyFile (OldName, NewName: AnsiChar; FileExists: Boolean): Boolean; Копирует файл. Эта функция — не встроенная функция Delphi, а одна из API функций ОС Windows. Возможность работать с ними программа получает после добавления в секцию uses модуля Windows. Параметры функции:
OldName — прежние адрес и имя файла;
NewName — новые адрес и имя файла;
FileExists — переменная, определяющая реакцию на существование файла по новому адресу. При FileExists=False файл будет перезаписан. При FileExists=True функция завершится ошибкой.
function GetLogicalDrives: Cardinal; Эта функция — также из состава WinAPI функций. Как и следует из её названия, позволяет получить структуру логических дисков компьютера. Пример её использования смотрите в комментариях к предыдущей страничке, в ответе на вопрос «как определить состав дисков компьютера»

Работа с файлами В начало урока Работа с дополнительными формами

Одиссей, добавлено 20.08.10, 11:03:29
В таблице отсутствуют функции для записи и чтения файлов! А в остальном очень полезный материал, практически можно научиться работать с файлами, изучив данную таблицу. Автор, добавлено 20.08.10, 11:06:54
В этой таблице содержатся функции управления файлами, а функции записи и чтения можно изучить, читая соответствующие уроки, посвящённые данным вопросам. А эта страничка даже не урок, а просто справочный материал. Вадим Мошев, добавлено 9.04.12, 15:31:27
Здравствуйте. У вас, наверное, описка?
Написано function Erase (var F);
и описание: Уничтожает файл F. Перед выполнением процедуры файл должен быть закрыт процедурой CloseFile.

Наверное, вы хотели написать не function, а Procedure?
То есть, Procedure Erase (var F). Андрей, добавлено 9.04.12, 15:54:27
Вадим, спасибо за внимательность! Сейчас исправлю.

Delphi-эквивалент C# DateTime.IsDaylightSavingTime() метод нужен

мне нужно как-то определить, есть ли некоторые TDateTime значение находится в диапазоне летнего времени для моего часового пояса или нет (в C# то же самое делает DateTime.IsDaylightSavingTime() метод).

Я знаю, что в Delphi нет подобной функции, потому что Delphi TDateTime Не содержит информации о часовом поясе, но я полагаю, что есть способ сделать это с помощью Win32 API.

Я посмотрел на Win32 API GetTimeZoneInformation и GetTimeZoneInformationForYear функции, но я не совсем понимаю, как их использовать, поэтому я бы прошу вас о помощи. Заранее спасибо за любые советы.

Edit:

в моем часовом поясе (Центрально-Европейском) летнее время началось в этом году 28 марта в 2 часа ночи и заканчивается 31 октября 2010 года в 3 часа ночи.

мне нужна функция с заголовком:

, что вернет true если дата ввода находится между 28 марта 2010 2: 00 и 31 октября 2010 3: 00 и false если не.

(The пример только для 2010 года, но мне нужно, чтобы он работал все годы.)

еще раз, я знаю, что информации, сохраненной только в TDateTime, недостаточно, но я думаю, что с некоторой функцией Win32 API я должен иметь возможность получить, например, информацию о текущем часовом поясе из настроек Windows.

7 ответов

это не так просто, как кажется, потому что:

1) Дата переключения между DST и стандартным временем не одинакова для всех стран

2) Дата переключения между DST и стандартным временем не является одним и тем же алгоритмом для одной и той же страны для всех лет (например, в Центральной Европе это было ранее первое воскресенье в апреле, IIRC, теперь это последнее воскресенье в марте). США изменились с первого воскресенья апреля на второе воскресенье марта 2007 года и на.

Итак-простой даты недостаточно, вам также понадобится географическое местоположение.

но, если вы можете жить с тем фактом, что вы ограничиваете себя датами переключения, которые могут быть рассчитаны из настоящее на настоящее год настоящее locale (country) и что это может быть неправильно для дат как в будущем, так и в прошлом, тогда вы можете использовать информацию в TIME_ZONE_INFORMATION для рассчитайте даты переключения:

петля через 2000-2020 годы на моем ПК (часовой пояс Центральной Европы), я получаю следующие даты:

но, по крайней мере, некоторые из этих лет неверны из-за того, что алгоритм изменился с моего языка в перечисленные годы.

ваша функция будет иметь следующий вид:

может быть, это перебор для вашего конкретного приложения, но проект с открытым исходным кодом «база данных часовых поясов Olson для Delphi» позволяет получить доступ к все часовые пояса при поддержке база данных tz. База данных регулярно обновляется с новейшими переход на летнее время изменения или исправления.

TZDB можно скомпилировать на Delphi 6, 7, 8, 9, 10 2007, , 2009, 2010 и XE или FreePascal 2.0 и выше. TZDB-это лучший используется с Delphi XE, который вводит класс TTimeZone в RTL.

Да, вы правы. Вам нужно:

установить TDateTime в Delphi переменной даты/времени

преобразовать его в Windows SystemTime

вызовите GetTimeZoneInformation (), чтобы получить TTimeZoneInformation

вызовите GetTimeZoneInformationForYear (), с вашей структурой TTimeZoneInformation, чтобы получить информацию DST для вашего часового пояса (я не уверен, где вы получите TTimeZoneInformation для некоторого произвольного часового пояса-но вы должны быть в состоянии найти его на MSDN).

сделайте арифметику, чтобы увидеть, происходит ли ваше системное время после TTZI.StandardDate (в этом случае это стандартное время) или после TTZI.DaylightDate (в этом случае это DST).

возможно, вы могли бы просто преобразовать это в Delphi таблица:

для любого datetime в любом часовом поясе, просто посмотрите, попадает ли данное datetime в DST или вне его. Вуаля! Нет Microsoft APIs-просто простой поиск таблицы или блок if / else case!

‘надеюсь, это поможет .. pSM

Как вы сами говорите, эта информация не хранится в комплекте с датами в Delphi, поэтому вы не можете просто перенести это. Каждую процедуру, которая proceduces в tdatetime бы добавить эту информацию, чего не бывает в Дельфах.

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

я использовал .NET reflector для просмотра реализации этой функции .сеть. Он определяется следующим образом, может быть, вы можете преобразовать математику в Delphi? Если вам нужно копнуть глубже в это, я предлагаю открыть рефлектор для себя. Я думаю, это поможет вам!

вы можете найти пример этого в библиотека кодов джедаев (С открытым исходным кодом) в JclDateTime.блок pas, в функции LocalDateTimeToDateTime. Информация о летнее время извлекается и используется для преобразования В и из времени UTC.

Я знаю, что это не ответ на ваш вопрос, но вас могут заинтересовать следующие две функции: SystemTimeToTzSpecificLocalTime() и TzSpecificLocalTimeToSystemTime() . Первый преобразует универсальное время в соответствующее время для указанного часового пояса (где nil означает локальный часовой пояс). Другой работает наоборот, но включен только в Windows XP и выше, как говорит Borland Help. Если вы собираетесь делать только преобразование времени в зависимости от часового пояса, они должны быть в порядке для вас. И это хорошо знать. что они проверяют, является ли время UTC заданным DST или стандартным временем. Я не читал нигде. Я только что проверил это сам, поэтому, пожалуйста, поправьте меня, если я ошибаюсь.

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

В Delphi есть функция для преобразования даты и времени XML в TDateTime

XML дата и время представлены в формате

‘-‘? гггг ‘-‘ мм ‘-‘ дд ‘т’ чч ‘:’ мм ‘:’ ss (‘.’ s +)? (Zzzzzz)?

были

• ‘-‘? yyyy — это число из четырех или более цифр, необязательно, со знаком минус, которое представляет год; если более четырех цифр, начальные нули запрещены, а ‘0000’ запрещен

• остальные ‘- это разделители между частями части даты;

• первый мм — двузначное число, обозначающее месяц;

• dd — двузначное число, обозначающее день;

• ‘T’ — разделитель, указывающий, что время суток следует;

• чч — двузначное число, обозначающее час; «24» допускается, если представленные минуты и секунды равны нулю, а значение dateTime, представленное таким образом, является первым моментом следующего дня (свойство часа объекта dateTime в · пространстве значений · не может иметь значение больше 23) ;

• ‘:’ — это разделитель между частями времени суток;

• второй мм — двузначное число, обозначающее минуты;

• ss — это двузначное число, представляющее целые секунды;

• » s + (если присутствует) представляет доли секунды;

• zzzzzz (если присутствует) представляет часовой пояс (как описано ниже).

вот больше примеров

Простой пример 2009-08-31T19: 30:00

Более сложные примеры

2002-10-10T12: 00: 00-05: 00 (полдень 10 октября 2002 года, центральное летнее время, а также восточное стандартное время в США): 2002- 10-10T17: 00: 00Z , на пять часов позже, чем 2002-10-10T12: 00: 00Z .

3 ответа

(есть и другие, например, /a>, вы поняли)

Все они содержат по крайней мере эти два метода:

На этот вопрос уже отвечено, но я добавлю кое-что, что я закончил в аналогичном случае, который у меня был. В модуле XSBuiltIns я нашел метод

который, казалось, был тем, что я хотел. Я хотел иметь возможность анализировать все различные временные строки XML, определенные здесь: http://www.w3schools.com/schema/schema_dtypes_date.asp

Сюда входят строки, содержащие только дату, просто время или дату и время, и все это с параметрами указанного часового пояса или времени UTC или локального для исходной строки и возвращаемого значения в качестве местного времени. Кроме того, когда дано только время, я хотел, чтобы оно всегда было в пределах «нулевого дня», то есть после операции вся часть возвращаемого TDateTime (приведенного к действительному числу) была равна нулю.

Наконец, я хотел, чтобы функция возвращала DateTime.MinValue при ошибочном вводе (в основном, когда дана пустая строка).

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

Основные проблемы (я уже могу забыть некоторые):

  • В результате пустой строки DateTime соответствует дате в 1-м году, а MinDateTime в Delphi — в 100-м году.
  • Строки, содержащие только дату, всегда считаются UTC независимо от наличия или отсутствия Z или явного определения часового пояса.
  • Строки, содержащие только время, ошибочно идентифицируются как строки даты и неправильно анализируются.
  • Модификаторы часовых поясов применяются ТОЛЬКО, если они явно определены, в противном случае предполагается, что все они обозначены как UTC, даже если нет ‘Z’.
  • Дробные секунды не поддерживаются, а скорее миллисекунды всегда преобразуются в 0.
  • Поскольку строки only-Time не поддерживаются, мне пришлось добавить в них фиктивную дату, а затем убедиться, что это текущая дата (чтобы охватить проблемы DST при преобразовании в /из UTC, что, в свою очередь, пришлось сделать из-за ошибочные соображения UTC) и затем в конце снова вычтите его из результата, и, наконец, в этих случаях обеспечьте требование нулевого дня для строк only-Time.

Конечный результат — это функция длиной около 100 строк (включая комментарии и т. д.), которая использует изрядное количество вспомогательных функций (которые должны быть довольно понятными и которые не являются темой этого сообщения :)). Я скопировал соответствующие биты кода в отдельный файл и юнит-тесты, которые я использовал, чтобы проверить это в другом, я включаю оба ниже. Не стесняйтесь использовать и комментировать по мере необходимости. Обратите внимание, что форма и связанные с ней операции и т. Д. — это как раз то, что Delphi поместил в демонстрационный проект, в котором я это описал, они ни в чем не нужны.

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