imho.ws |
![]() |
![]() |
![]() |
# 1 |
Junior Member
Регистрация: 28.07.2004
Сообщения: 148
![]() |
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" эта дата установлена по умолчанию минимальной, то бишь отсчет времени начинается именно с этой даты. Чем обрабытывать временные переменные в таком случае? |
![]() |
![]() |
# 2 |
::VIP::
Регистрация: 19.03.2004
Сообщения: 1 329
![]() ![]() ![]() ![]() |
Типа TDateTime хранится как вещественное число, целая часть которого представляет собой количество прошедших дней с минимальной даты, а дробная - представляет собой время. Когда ты вычитаешь две такие даты, и получаешь единицу - то всё логично - один прошедший день с минимальной даты.
|
![]() |
![]() |
# 4 |
::VIP::
Регистрация: 19.03.2004
Сообщения: 1 329
![]() ![]() ![]() ![]() |
А что тебе мешает не пойму? Просто прибавляй к тому что у тебя в DateTime свою минимальную дату с которой ты работаешь, скажем ту же 2000.01.01. Если у тебя в целой части DateTime записана единица, то прибавив её к 2000.01.01 получишь 2000.01.02. Вот и храни DateTime с этой единицей, и плевать тебе что в виде даты/времени оно представляется как 1899.12.31.
|
![]() |
![]() |
# 7 |
Junior Member
Регистрация: 28.07.2004
Сообщения: 148
![]() |
Есть поле 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 |
Junior Member
Регистрация: 23.12.2003
Адрес: Киев
Сообщения: 118
![]() ![]() ![]() ![]() |
Время и дата хранятся в прекрасном формате.
Вещественное число размером 8-мь байт (обычны double) Целая часть отвечает за кол-во дней. Дробная за время, проичем единица подразумевает полные 24-ре часа. То есть чтобы прибавить одинг час нужно прибавить 1/24. Одну минуту 1/24/60 Одну секунду 1/24/60/60 Не вижу никаких проблем. При использовании арифметики над датами даже не нужно использовать функции Encode и Decode ![]() P.S. Даты с нулевым годом в природе не существует. Так что минимально возможная это 0001/01/01. Что принципиально не отличается от 1899/12/31 Последний раз редактировалось Willow; 18.03.2006 в 01:48. |
![]() |