Форум: "Прочее";
Текущий архив: 2010.09.05;
Скачать: [xml.tar.bz2];
ВнизРабота TDateTime в отрицательном диапазоне Найти похожие ветки
← →
bss (2010-06-10 16:34) [40]
> а ничего, что при этом 18 часов для 29 дек и 30 дек это
> будут разные величины?
в смысле, одно время cenjr будет иметь различное дробное представление? Да, есть такой момент.
> никакой арифметики с TDateTime, построенном на дабле иметь
> нельзя.
какой арифметике? Да, обрезать с помощью Trunc"а нельзя. Но вычитать, складывать даты вполне можно, разве нет?
Приведи пример арифметического выражения, которое будет глючить в этой линейной парадигме.
← →
Медвежонок Пятачок © (2010-06-10 16:37) [41]Да, обрезать с помощью Trunc"а нельзя.
Что значит нельзя?
Если время это дабл, и дата это целая ее часть, то трунк как раз должен нас поставить в начало любых суток.
иначе с даблом не стоило и заморачиваться.
← →
Медвежонок Пятачок © (2010-06-10 16:39) [42]это тот самый косяк, который я приводил в самом начале.
-0.5 это по идее полдень (по альтернативной борланду реализации) 29 декабря.
Трунк от него поставит нас в начало суток 29 декабря.
Но и трунк от 0.5 (полдень 30 декабря) поставит нас в ту же самую точку.
← →
RWolf © (2010-06-10 16:42) [43]
> Медвежонок Пятачок © (10.06.10 16:37) [41]
Trunc, вообще говоря, делался не для вычисления времени суток по дате, так что нет смысла подгонять систему летоисчисления так, чтобы он делал именно это действие.
В вышеупомянутой системе можно предложить вычислять время суток таким образом: dt - floor(dt);
← →
RWolf © (2010-06-10 16:44) [44]чуть подробнее:
1.25 - floor(1.25) = 0.25;
-1.25 - floor(-1.25) = 0.75;
← →
Медвежонок Пятачок © (2010-06-10 16:47) [45]Trunc, вообще говоря, делался не для вычисления времени суток по дате,
Я и не говорил что он делался для этого.
Я говорил, что борланд решил, что не стоит делать класс для даты/времени, потому что время можно смоделировать даблом.
Если это он так решил, то он был вынужден принять как объективную реальность, что с TDateTime будут обращаться как с даблом.
Кроме того, он сказал, что дата/время представленное даблом - это целая часть (дни) и дробная часть (доли суток)
И после всего этого типа вы мне говорите, что немоги получить из TDateTime начало суток трунком?
Нонсенс!
← →
Медвежонок Пятачок © (2010-06-10 16:49) [46]Не надо мне про флор.
Я знаю, что дата-время это дабл.
Я знаю, что целая часть дабла это чистая дата (начало суток)
Я знаю, что трунк отсекает дробную часть дабла.
Все!
После этого вынь и положь мне такое, что трунк к любой дате/времени перемещал бы меня в начало суток.
← →
RWolf © (2010-06-10 16:49) [47]можно и трунком, но с проверкой знака даты.
← →
Медвежонок Пятачок © (2010-06-10 16:59) [48]тогда уж надо было на уровне компилера запрещать трунк для TDateTime
но как это сделать если он объявлен как
TDateTime = type Double;
опять же никак кроме подпорок и волшебства
← →
RWolf © (2010-06-10 17:03) [49]
> Медвежонок Пятачок © (10.06.10 16:49) [46]
следуя этим требованиям, получаем нынешнюю реализацию, с её кусочно-линейной шкалой времени в области отрицательных значений и неочевидной арифметикой.
Есть мнение, что отказ от этих догм в пользу линейной шкалы упростил бы жизнь программистам; тем не менее, имеем то, что имеем, и работать приходится с борландовской реализацией.
← →
sniknik © (2010-06-10 17:10) [50]> Нужно создавать класс TDateTime и писать в нем методы.
> Оно надо?
ну, в mssql-е сделали. в принципе и в дельфе можно свой класс под него написать... тому кому этого желается. ;)
← →
Медвежонок Пятачок © (2010-06-10 17:11) [51]а чем таким осложнена жизнь программистов сейчас?
вся арифметика плавающей точки работает для даты/времени.
а то что время раньше текло скачками и в разные стороны я только сегодня например узнал. когда разбирались что и как.
никаких неудобств не вижу.
← →
sniknik © (2010-06-10 17:13) [52]> и работать приходится с борландовской реализацией.
sniknik © (10.06.10 15:00) [18]
← →
bss (2010-06-10 17:34) [53]
> а чем таким осложнена жизнь программистов сейчас?
этим например:
procedure TForm1.FormCreate(Sender: TObject);
var
dt1, dt2, dtDelta: TDateTime ;
begin
dt1 := StrToDateTime("29.12.1899 03:00:00.00");
dt2 := StrToDateTime("29.12.1899 05:00:00.00");
if dt1 > dt2 then
ShowMessage("3 часа утра оказалось более поздним, чем 5 часов утра");
end;
← →
RWolf © (2010-06-10 17:48) [54]
> Медвежонок Пятачок © (10.06.10 17:11) [51]
> а чем таким осложнена жизнь программистов сейчас?
вот этим:dt1 := StrToDateTime("29.12.1899 06:00:00.00");
dt2 := StrToDateTime("30.12.1899 06:00:00.00");
delta:=dt1-dt2; //результат — 12 часов, а вовсе не сутки
← →
Медвежонок Пятачок © (2010-06-10 17:54) [55]вот этим:
dt1 := StrToDateTime("29.12.1899 06:00:00.00");
dt2 := StrToDateTime("30.12.1899 06:00:00.00");
И в чем же здесь смыл самой операции?
Сколько (и главное что именно) должно получиться если из даты рождения наполеона вычесть дату выборов президента россии?
← →
Медвежонок Пятачок © (2010-06-10 17:55) [56]а ведь можно еще и умножить и в степень возвести и взять кубический корень.
← →
RWolf © (2010-06-10 17:58) [57]
> Медвежонок Пятачок © (10.06.10 17:54) [55]
Смысл — узнать, сколько времени прошло между двумя моментами.
Если одна дата больше нуля, а вторая меньше — их вычитание даст ошибку.
← →
Медвежонок Пятачок © (2010-06-10 18:01) [58]Полночь 28 дек 1899 - полночь 30 дек 1899 = -2
Где ошибка?
Полночь 28 дек 1899 - Полдень 30 дек 1899 = -2.5
Где ошибка?
← →
RWolf © (2010-06-10 18:02) [59]
> Где ошибка?
[54]
← →
Медвежонок Пятачок © (2010-06-10 18:06) [60]там тоже все ок
ShowMessage(
FloatToStr
(
(EncodeDate(1899,12,29) + EncodeTime(6,0,0,0))
-
(EncodeDate(1899,12,30) + EncodeTime(6,0,0,0))
)
);
Сутки ровно
← →
RWolf © (2010-06-10 18:10) [61]
> Медвежонок Пятачок © (10.06.10 18:06) [60]
> там тоже все ок
А теперь сюрприз:ShowMessage(
DateTimeToStr
(
(EncodeDate(1899,12,29) + EncodeTime(6,0,0,0))
)
);
---------------------------
Project1
---------------------------
30.12.1899 18:00:00
---------------------------
OK
---------------------------
← →
Медвежонок Пятачок © (2010-06-10 18:18) [62]ну и что?
Допустим я вообще не знаю что такое TDateTime у борланда.
сначала я получил дату через EncodeDate
затем прибавил время через EncodeTime
То что дата попала в отрицательный диапазон, я вообще не в курсе.
И вообще не знаю, что дата это дабл.
В итоге получил верный результат.
КРОМЕ ТОГО:
с точки зрения логики нас может интересовать результат в разнице в сутках.
и он у нас есть.
А смысла в операции вычитания одного значения даты времени из другого я не вижу.
Ну скажите, что можно найти вычитанием своего дня рождения (дата + время) из даты последнего дня помпеи (тоже дата и время)?
Какого типа ожидается результат?
← →
bss (2010-06-10 18:38) [63]как элегантно Медвежонок пропустил мой пост [53] )))
← →
Медвежонок Пятачок © (2010-06-10 18:40) [64]я его не пропустил, меня отвлек рволф.
53 очень уж частный случай.
срабатывает только для двух моментов в ОДНИХ и тех же сутках
← →
Дмитрий С © (2010-06-10 18:49) [65]
> Медвежонок Пятачок © (10.06.10 18:06) [60]
Ты доказываешь точку зрения которую оспариваешь.
Caption := FloatToStr(StrToDateTime("29.12.1899 06:00:00.00"))
+ ", "
+ FloatToStr(EncodeDate(1899,12,29) + EncodeTime(6,0,0,0))
Получаем: -1,25, -0,75
В твоем случае получаем дату, которую нельзя использовать, если верить хелпу. :)
← →
Дмитрий С © (2010-06-10 18:52) [66]
> Допустим я вообще не знаю что такое TDateTime у борланда.
:)
← →
Медвежонок Пятачок © (2010-06-10 18:57) [67]я кстати никогда не использую стртудэйттайм
вместо этого EncodeDate + EncodeTime
в первых нет заморочек с региональными стандартами, во вторых второй (неожиданный для меня положительный побочный эффект):
1. Трунк любой даты гарантированно дает начало суток по всей шкале.
2. То же самое делает EncodeDate
3. Разница между началами суток верна по всей шкале времени.
3. Добавление к чистой дате элемента времени (EncodeTime) - всегда смещает момент времени вправо в обоих частях шкалы (минусовой и положительной)
Благодаря этому разница дат остается верной и с учетом компонента времени (несмотря на то, что Encоde сделал отрицательным аргументом не ту дату которую я подразумевал).
← →
Медвежонок Пятачок © (2010-06-10 18:58) [68]> Допустим я вообще не знаю что такое TDateTime у борланда.
:)
Имеется ввиду что допустим я не знаю что
TDateTime = type Double;
← →
Медвежонок Пятачок © (2010-06-10 19:01) [69]Ну кто поспорит, что такой код не логичен:
EncodeDate(1899,12,29) + EncodeTime(6,0,0,0)
EncodeDate(1899,12,30) + EncodeTime(6,0,0,0)
Получаем 6 утра для двух дат.
← →
Дмитрий С © (2010-06-10 19:04) [70]
> Медвежонок Пятачок © (10.06.10 19:01) [69]
>
> Ну кто поспорит, что такой код не логичен:
DateTimeToStr поспорит :)
← →
Дмитрий С © (2010-06-10 19:08) [71]Еще интересно, почему нельзя было взять за 0 "0000.00.00 00:00:00" ? В чем фишка именно 30.12.1899?
← →
Медвежонок Пятачок © (2010-06-10 19:15) [72]ладно, объясните мне смысл вычитания друг из друга двух TDateTime.
Не трункнутых, а с компонентом времени.
Трункнутые дадут разницу в сутках это понятно.
Причем в обоих диапазонах.
Но что должно получиться при вычитании одного момента времни из другого?
Причем один момент древний, 19 века, второй свежий.
Две лопаты + три лопаты это понятно
Даже три яблока + четыре сигареты это тоже почти понятно.
Но точная дата рождения наполеона минус момент финального гола немцев на ЧМ-2006 - это что такое?
Трунк этих моментов даст промежуток в сутках. Это понятно.
Но без трунка это что? Физически это будет TDateTime (третий момент во времени).
Что он означает?
Дату и время когда серверная корея объединится с южной?
Или что?
← →
Anatoly Podgoretsky © (2010-06-10 19:31) [73]> Медвежонок Пятачок (10.06.2010 16:26:38) [38]
Ничего, тоже что и с процентами, конечно занимательно но не более того
← →
Anatoly Podgoretsky © (2010-06-10 19:33) [74]> Медвежонок Пятачок (10.06.2010 16:39:42) [42]
Это не полдень, а половина суток, полдня
← →
Медвежонок Пятачок © (2010-06-10 19:35) [75]Это не половина суток.
Это TDateTime.
А это значит, что это
"какое-то там марта какого-то там года три часа пополудни"
← →
bss (2010-06-10 19:37) [76]
> В чем фишка именно 30.12.1899?
логичнее, конечно, было взять начало 1900 года. Но пошло от MS:
However, when Microsoft brought out Excel, it needed to be compatible with Lotus 1-2-3. Now, 1-2-3 had a bug regarding the year 1900: it thought that 1900 was a leap year, when in fact it wasn"t. To maintain compatibility, the Excel team decided to retain the bug in Excel.
In order not to screw up the dates for the rest of the century, though, they had to shift the zero point back one day. And there you have it.
← →
Медвежонок Пятачок © (2010-06-10 19:38) [77]хотя может и не марта, а термидора или нисана какого-нибудь
но это не количество дней часов минут.
это дата. момент времени.
← →
Anatoly Podgoretsky © (2010-06-10 19:40) [78]> sniknik (10.06.2010 17:10:50) [50]
А в 2008 MS SQL наконец сделали то, от чего отказался Борланд, от базы
1.01.0001
← →
Anatoly Podgoretsky © (2010-06-10 19:44) [79]> RWolf (10.06.2010 18:10:01) [61]
Тоже мне сюрьприх нашел, ты видимо из тех кто не понимает, что такое время и
как оно реализовано в Дельфи.
← →
Anatoly Podgoretsky © (2010-06-10 19:48) [80]> Дмитрий С (10.06.2010 18:49:05) [65]
1.01.2010 + 1.01.2010 = 2.2.4020
Не надо складывать даты это абсурд, можно получать только разницу. При этом
получаем не дату, а интервал
Страницы: 1 2 3 вся ветка
Форум: "Прочее";
Текущий архив: 2010.09.05;
Скачать: [xml.tar.bz2];
Память: 0.62 MB
Время: 0.006 c