imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 13.03.2006, 11:57     # 1
Browin
Junior Member
 
Регистрация: 28.07.2004
Сообщения: 148

Browin Путь к славе только начался
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" эта дата установлена по умолчанию минимальной, то бишь отсчет времени начинается именно с этой даты.
Чем обрабытывать временные переменные в таком случае?
Browin вне форума  
Старый 13.03.2006, 12:27     # 2
ЕЖ
::VIP::
 
Регистрация: 19.03.2004
Сообщения: 1 329

ЕЖ Бог с наворотамиЕЖ Бог с наворотами
ЕЖ Бог с наворотамиЕЖ Бог с наворотами
Типа TDateTime хранится как вещественное число, целая часть которого представляет собой количество прошедших дней с минимальной даты, а дробная - представляет собой время. Когда ты вычитаешь две такие даты, и получаешь единицу - то всё логично - один прошедший день с минимальной даты.
ЕЖ вне форума  
Старый 13.03.2006, 14:23     # 3
Browin
Junior Member
 
Регистрация: 28.07.2004
Сообщения: 148

Browin Путь к славе только начался
Дык мне нужно, чтобы минимальная дата была 0000.00.00, а не "1899.12.31". Иначе не получиться записать в переменную, к примеру, 1 час или 1 год.
Browin вне форума  
Старый 13.03.2006, 14:34     # 4
ЕЖ
::VIP::
 
Регистрация: 19.03.2004
Сообщения: 1 329

ЕЖ Бог с наворотамиЕЖ Бог с наворотами
ЕЖ Бог с наворотамиЕЖ Бог с наворотами
А что тебе мешает не пойму? Просто прибавляй к тому что у тебя в DateTime свою минимальную дату с которой ты работаешь, скажем ту же 2000.01.01. Если у тебя в целой части DateTime записана единица, то прибавив её к 2000.01.01 получишь 2000.01.02. Вот и храни DateTime с этой единицей, и плевать тебе что в виде даты/времени оно представляется как 1899.12.31.
ЕЖ вне форума  
Старый 13.03.2006, 15:38     # 5
Browin
Junior Member
 
Регистрация: 28.07.2004
Сообщения: 148

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

Если бы поменять минимальную дату на 0000.00.00, то было бы замеательно.
Browin вне форума  
Старый 13.03.2006, 16:20     # 6
ЕЖ
::VIP::
 
Регистрация: 19.03.2004
Сообщения: 1 329

ЕЖ Бог с наворотамиЕЖ Бог с наворотами
ЕЖ Бог с наворотамиЕЖ Бог с наворотами
Приведи конкретные примеры операций с временными отрезками, которые у тебя не выходят.
ЕЖ вне форума  
Старый 13.03.2006, 19:10     # 7
Browin
Junior Member
 
Регистрация: 28.07.2004
Сообщения: 148

Browin Путь к славе только начался
Есть поле 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;
Browin вне форума  
Старый 18.03.2006, 01:44     # 8
Willow
Junior Member
 
Регистрация: 23.12.2003
Адрес: Киев
Сообщения: 118

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


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 17:29.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.