IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Delphi: StrToDateTime (http://www.imho.ws/showthread.php?t=100759)

Browin 13.03.2006 11:57

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" эта дата установлена по умолчанию минимальной, то бишь отсчет времени начинается именно с этой даты.
Чем обрабытывать временные переменные в таком случае?

ЕЖ 13.03.2006 12:27

Типа TDateTime хранится как вещественное число, целая часть которого представляет собой количество прошедших дней с минимальной даты, а дробная - представляет собой время. Когда ты вычитаешь две такие даты, и получаешь единицу - то всё логично - один прошедший день с минимальной даты.

Browin 13.03.2006 14:23

Дык мне нужно, чтобы минимальная дата была 0000.00.00, а не "1899.12.31". Иначе не получиться записать в переменную, к примеру, 1 час или 1 год.

ЕЖ 13.03.2006 14:34

А что тебе мешает не пойму? Просто прибавляй к тому что у тебя в DateTime свою минимальную дату с которой ты работаешь, скажем ту же 2000.01.01. Если у тебя в целой части DateTime записана единица, то прибавив её к 2000.01.01 получишь 2000.01.02. Вот и храни DateTime с этой единицей, и плевать тебе что в виде даты/времени оно представляется как 1899.12.31.

Browin 13.03.2006 15:38

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

Если бы поменять минимальную дату на 0000.00.00, то было бы замеательно.

ЕЖ 13.03.2006 16:20

Приведи конкретные примеры операций с временными отрезками, которые у тебя не выходят.

Browin 13.03.2006 19:10

Есть поле 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;

Willow 18.03.2006 01:44

Время и дата хранятся в прекрасном формате.
Вещественное число размером 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.