Вверх ↑
Этот топик читают: Гость
Ответов: 16884
Рейтинг: 1239
#31: 2008-03-04 02:19:05 ЛС | профиль | цитата
nesco, ты это видел?
procedure THIDateConvertor._work_doConvert9;//DateRealToStrFmt
begin
DateTime:= ReadReal(_Data,_data_Data,0);
if DateTime < 584389 then DateTime:= DateTime+584389;
...............................

после этой переделки считает разницу без проблем.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26151
Рейтинг: 2127
#32: 2008-03-04 03:29:38 ЛС | профиль | цитата
Tad писал(а):
nesco, ты это видел?
Ты такие вещи лучше открытыми делай, чтобы внимание привлечь, а то я сразу в конец ткнулся.

------------ Дoбавленo:


Tad писал(а):
после этой переделки считает разницу без проблем

Очередное удаление гланд черз ж...

------------ Дoбавленo:



if DateTime < 584389 then DateTime:= DateTime+584389;
Тогда лучше вот так

if DateTime < 584389 then DateTime:= 584389 + frac(DateTime);

------------ Дoбавленo:

Мдяяя уж... API-функция GetDateFormat так работает (возвращает 0 при дате меньше 584389 и код ошибки ERROR_INVALID_PARAMETER = 87). Придется дубово фиксить.

Вот что написано в MSDN про это безобразие

MSDN писал(а):
Если день недели неправильный, то функция использует правильную величину и не возвращает никакую ошибку. Если же любой другой параметр даты находится за пределами правильного дипазона, функция терпит неудачу, и устанавливает последнюю ошибку на ERROR_INVALID_PARAMETER

Но вот про конкретное значение -- ни-ни
------------ Дoбавленo:

Короче, я дубово пофиксил этот баг
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#33: 2008-03-04 10:05:31 ЛС | профиль | цитата
Тогда лучше вот так
if DateTime < 584389 then DateTime:= 584389 + frac(DateTime);
по моему так нельзя. Если точка отсчета 584389, то ее и нужно добавлять к разнице без никиких фраков
nesco писал(а):
Короче, я дубово пофиксил этот баг
может не стоило спешить?
Если разница < 584389 тогда к разнице добавить 584389 - прекрасно делается и "внешними компонентами " HiAsma.



карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26151
Рейтинг: 2127
#34: 2008-03-04 11:17:14 ЛС | профиль | цитата
Tad, откатить никогда не поздно.
Tad писал(а):
Если точка отсчета 584389, то ее и нужно добавлять к разнице без никиких фраков

А если разница будет, к примеру -- 1500, то сколько у тебя получится сумма (1500+1600=3100. Мдяяя уж... Точно не доживем )

А предложенный способ хорош только для определения разницы в часах до суток (я тут перед сном еще час думал, как лучше сделать ). Можно попытаться ограничится разницой в 400 лет, а можно вообще ничего не делать, просто написать в описании этот прикол.
------------ Дoбавленo:

Пока откатил обратно.
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#35: 2008-03-04 11:47:40 ЛС | профиль | цитата
code_8540.txt
------------ Дoбавленo:

Вот то что в Info прекрасно работает даже при переходе через 24:00
------------ Дoбавленo:

nesco, ты вообще ложился спать?
------------ Дoбавленo:

nesco писал(а):
А если разница будет, к примеру -- 1500
Это в каких единицах? Если в годах то будет в 3508 году
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1code_8540.txt [4.2KB] [272]
Разработчик
Ответов: 26151
Рейтинг: 2127
#36: 2008-03-04 11:51:58 ЛС | профиль | цитата
Tad, ты ошибся в значении константы ровно на 1, оно должно быть = 584388, так как отсчет ведется с Real=1 (01.01.0001), я специально проверял значение константы коррекции.

------------ Дoбавленo:

Вот схема проверки коррекции



Add(MainForm,10186100,147,70)
{
Left=20
Top=105
Width=343
Height=110
}
Add(Edit,772480,350,126)
{
Left=170
Top=10
Width=155
Text=""
link(onChange,13969180:doConvert,[])
}
Add(DateConvertor,13969180,399,126)
{
Mode=9
Format="dd.MM.yyyy HH:mm"
link(onResult,13722140:doText,[])
}
Add(Edit,13722140,448,126)
{
Left=170
Top=40
Width=155
Text=""
}
Add(DateConvertor,12016611,224,126)
{
Mode=8
Format="dd.MM.yyyy"
Point(Data)
link(onResult,3205452:doOperation,[])
link(Data,14576281:Text,[])
}
Add(Edit,14576281,224,70)
{
Left=10
Top=10
Width=155
Text="01.01.0001"
}
Add(Math,3205452,287,126)
{
Op2=584388
link(onResult,772480:doText,[])
}
Add(Button,2096254,154,126)
{
Left=60
Top=40
link(onClick,12016611:doConvert,[])
}

карма: 22

0
Ответов: 16884
Рейтинг: 1239
#37: 2008-03-04 12:07:04 ЛС | профиль | цитата
nesco писал(а):
Tad, ты ошибся в значении константы
ну не я а ты ( я ее брал из твоего поста !)
------------ Дoбавленo:

и перносил методом CopyPaste - лень набирать шесть знаков
------------ Дoбавленo:

Все. погнал на работу. До вечера.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26151
Рейтинг: 2127
#38: 2008-03-04 12:09:32 ЛС | профиль | цитата
Tad писал(а):
ну не я а ты

Вообще-то я указал минимальное значение даты, а вот это уже не я писАл

if DateTime < 584389 then DateTime:= DateTime+584389;
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#39: 2008-03-04 14:40:36 ЛС | профиль | цитата
Это Tad. Немогу зарегиться
nesco, все верно и константа верная, а вот дата в твоем примере - неверная : нет даты 01:01:0000 - чисто програмистская привычка считать с 0 - если есть день, то уже есть и месяц и год, т.е. 01:01:0001 Помнишь спор - когда праздновать тысячелетие? Это тоже самое.
Вот здесь
code_8544.txt
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1code_8544.txt [2.1KB] [271]
Разработчик
Ответов: 26151
Рейтинг: 2127
#40: 2008-03-04 14:52:14 ЛС | профиль | цитата
Tad писал(а):
01:01:0000
А у меня и нет такой даты в примере, а есть дата 01:01:0001
Ты пробовал вписать разные даты в левое верхнее поле, все числа совпадают и по месяцу и по дню с константой 584388, а с константой 584389 день увеличивается на единицу при любом вводе.

------------ Дoбавленo:


Tad, неверно это -- 02.01.1701 , не должно быть 02, а должно быть 01, тогда будут чистые сто лет, а так сто лет плюс один день
Поставь в пример мою константу и ты получишь именно 01.01.1701
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#41: 2008-03-04 16:00:56 ЛС | профиль | цитата
nesco писал(а):
не должно быть 02
nesco, откуда ты знаешь? Может быть за счет высокосных набежал один месяц и один день. Продумать это все нужно капитально.
100 лет - около 24,25,26 "высокосных дней" (в каждом столетии свои (400-летний цикл тоже учти)) Вполне возможно что разница это учитывает. Леонида нужно подключать - он спец по летоисчислению .

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 3655
Рейтинг: 69
#42: 2008-03-04 18:13:27 ЛС | профиль | цитата
nesco писал(а):
Вот что написано в MSDN про это безобразие

А чем MSDN переводишь?
карма: 0

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#43: 2008-03-04 18:16:02 ЛС | профиль | цитата
Вячеслав писал(а):
А чем MSDN переводишь?
Армянским переводчиком, затем беру напильник и довожу паровоз до самолета
карма: 22

0
Ответов: 8926
Рейтинг: 823
#44: 2008-03-04 18:16:06 ЛС | профиль | цитата
нет, мюнхаузены, я подожду пока вы воскликните "Ура, мы нашли 32 мая!"
Держим в уме, что число дней включает и день расчётный: число 1,5 означает 12 часов 01.01.0001, математик бы обозначил этот момент числом 0,5.
карма: 19

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#45: 2008-03-04 18:17:48 ЛС | профиль | цитата
Леонид писал(а):
"Ура, мы нашли 32 мая!"
Скорее -- 31 июня.
------------ Дoбавленo:

Леонид, ты опять загадками говоришь, нормальные предложения будут, или "как".
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)