![]() |
Delphi: StrToDateTime
Необходимо текстовую строку перевести в "дату-время". Для этого используется StrToDateTime.
Проблема состоит в том, что для перевода строки, к примеру, '01 00:00' выдается ошибка "'01 00:00' is not valid date and time" хоть и установлен соответствующий формат: fs.LongDateFormat := 'dd'; fs.LongTimeFormat := 'hh:mm'; TDs2 := StrToDateTime(Edit3.Text, fs); Более того, если сделать следующее: D1 := StrToDateTime('2000.01.01', fs); D2 := StrToDateTime('2000.01.02', fs); D3 := D2 - D1; S3 := DateTimeToStr(D3, fs); То в S3 мы не получим значение '0000.00.01'. "1899.12.31" эта дата установлена по умолчанию минимальной, то бишь отсчет времени начинается именно с этой даты. Чем обрабытывать временные переменные в таком случае? |
Типа TDateTime хранится как вещественное число, целая часть которого представляет собой количество прошедших дней с минимальной даты, а дробная - представляет собой время. Когда ты вычитаешь две такие даты, и получаешь единицу - то всё логично - один прошедший день с минимальной даты.
|
Дык мне нужно, чтобы минимальная дата была 0000.00.00, а не "1899.12.31". Иначе не получиться записать в переменную, к примеру, 1 час или 1 год.
|
А что тебе мешает не пойму? Просто прибавляй к тому что у тебя в DateTime свою минимальную дату с которой ты работаешь, скажем ту же 2000.01.01. Если у тебя в целой части DateTime записана единица, то прибавив её к 2000.01.01 получишь 2000.01.02. Вот и храни DateTime с этой единицей, и плевать тебе что в виде даты/времени оно представляется как 1899.12.31.
|
Можно конечно (сейчас так и поступаю). А нужно для того, что необходимо оперировать с временными отрезками (вводятся пользователем) от минуты до года.
Если бы поменять минимальную дату на 0000.00.00, то было бы замеательно. |
Приведи конкретные примеры операций с временными отрезками, которые у тебя не выходят.
|
Есть поле TEdit1.Text, куда вводится временной шаг, к примеру, "01 00:00", означающий шаг в один день. Его нужно преобразовать из текста и записать во временнУю переменную.
Сейчас же приходится обходиться двумя полями TEdit, в первом начало, во втором конец периода, разница между вторым и первым - наш искомый шаг. Но это громоздко и не удобно. Удивляет, кто такой умный догадался поставить ограничение 12/31/1899. В SysUtils.pas есть такая запись: { Days between 1/1/0001 and 12/31/1899 } DateDelta = 693594; { Days between TDateTime basis (12/31/1899) and Unix time_t basis (1/1/1970) } UnixDateDelta = 25569; |
Время и дата хранятся в прекрасном формате.
Вещественное число размером 8-мь байт (обычны double) Целая часть отвечает за кол-во дней. Дробная за время, проичем единица подразумевает полные 24-ре часа. То есть чтобы прибавить одинг час нужно прибавить 1/24. Одну минуту 1/24/60 Одну секунду 1/24/60/60 Не вижу никаких проблем. При использовании арифметики над датами даже не нужно использовать функции Encode и Decode :contract: P.S. Даты с нулевым годом в природе не существует. Так что минимально возможная это 0001/01/01. Что принципиально не отличается от 1899/12/31 |
Часовой пояс GMT +4, время: 15:55. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.