Вверх ↑
Этот топик читают: Гость
Ответов: 16884
Рейтинг: 1239
#16: 2015-03-19 22:25:55 ЛС | профиль | цитата
Леонид писал(а):
Дата должна быть более 01-01-1601
А у меня сколько ?
Add(StrCat,16729375,161,112)
{
Str1="01-01-2000 "
link(onStrCat,15486567:doConvert,[])
link(Str2,2345384:Text,[])
}

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 5227
Рейтинг: 588
#17: 2015-03-20 07:47:41 ЛС | профиль | цитата
Всегда использую vbscript в таких случаях (просто и удобно) code_35362.txt
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
файлы: 1code_35362.txt [1.8KB] [565]
Ответов: 16884
Рейтинг: 1239
#18: 2015-03-20 08:38:55 ЛС | профиль | цитата
andrestudio писал(а):
Всегда использую vbscript в таких случаях (просто и удобно)
А я IC.
andrestudio, вопрос в другом
wvlas писал(а):
Как сложить несколько текстовых ячеек со временем
Сложить, а не узнать сколько времени будет через.
Если "сложить", то 10:00:00 + 10:00:00 + 10:00:00 будет 30 часов 00 минут 00 секунд, а не 6 часов утра следующих суток.

Или я неправильно понял TC.
wvlas, ау-у-у!
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 1088
Рейтинг: 112
#19: 2015-03-20 09:41:39 ЛС | профиль | цитата
Tad, по-моему ТС'у уже дали решения на все случаи жизни.
В том числе случай с суммой более 24 часов(см мой пост).
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
Ответов: 8888
Рейтинг: 823
#20: 2015-03-20 09:57:35 ЛС | профиль | цитата
Tad писал(а):
..А у меня сколько..
Я про то, что при выходе за указанное значение схема ВЫДАЁТ результат, но неизвестно какой, лучше пустую строку, понятно что ошибка.
(Складывать кусочки времени необходимо в сетевых графиках, но там время обозначается не датой, а обычным числом в часах или днях, кто же знает зачем ТС понадобилось )
карма: 19

0
Ответов: 5227
Рейтинг: 588
#21: 2015-03-20 10:05:45 ЛС | профиль | цитата
Tad, режим таймера не на многа сложней
code_35363.txt
------------ Дoбавленo в 10.05:
Хотя с днями я конечно погорячился
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
файлы: 1code_35363.txt [1.2KB] [481]
Ответов: 16884
Рейтинг: 1239
#22: 2015-03-20 11:22:39 ЛС | профиль | цитата
Sniper36, твоё решение, с использованием компонентов математики, верное. Ничего против не имею. Именно правильный ответ на "сложить время".
Да и я вроде
Tad писал(а):
Потому, что компонента для работы с временем кроме математики у нас нет.

Почему после твоего решения TC вопрошал
87.103.208.213 писал(а):
Что нужно поставить между двумя DataConverter, чтобы получить результат? Никак не соображу.
великая загадка. Что бы он не ставил между двумя DataConverter-ами, сложения времени не будет.
Леонид писал(а):
Складывать кусочки времени необходимо в сетевых графиках
и в расчетах любых технологических процессов.
Сколько времени вынашивается ребёнок ? 9 месяцев ? Неправда.
Ответ: 280 дней или 10 акушерских месяцев или 40 акушерских недель, т.к. это тоже технологический процесс, состоящий из суммы времени отдельных периодов развития плода.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 4621
Рейтинг: 746
#23: 2015-03-20 14:33:07 ЛС | профиль | цитата
Предлагаю следующее:
Слева оригинал, справа модификация
1) При конвертировании из строки в VCL и Unix проверяется дата, если равна 0, то в результирующей дате тоже будет 0. Нюанс - дата 01.01.0001 будет представлена 0-вой датой для соответствующего формата (точнее 00.01.0001). Для Unix - не имеет значения, все равно выходит за диапазон, для VCL - дата 01.01.0001 будет представлена как 30.12.1899.
Время будет показано правильно.
Назначение - правильно конвертировать время из строки в соответствующий тип.
2) При конвертировании из строки в Unix проверяется выход за минимальный диапазон. В оригинале происходило двоичное усечение, что приводило к непредсказуемым результатам. В модификации в результате получается минимальная дата Unix. Время тоже затрагивается.
3) При конвертировании из любой даты в строку если дата меньше 01.01.1601, дата стает равной 01.01.1601, время не затрагивается. Все равно, чтобы сконвертировать в строку такие даты, нужно было бы вручную добавлять порцию даты (случай в данной теме).

dateconvertor mod 2013-03-20.7z
карма: 26

0
Ответов: 16884
Рейтинг: 1239
#24: 2015-03-20 16:58:41 ЛС | профиль | цитата
Сложить 23:59:59 + 00:00:01
Никогда, при использовании ни стандартных компонент, ни с предложенной тобой модификацией, не получишь 24:00:00, а получишь 00:00:00 - что не есть суммированием времени, а есть отсчет. Что и делает наш компонент совершенно правильно.
Задача : расчитать продолжительность процесса запуска новой доменной печи:
1. Проверка водоохлаждения до 5 часов
2. Сушка 10 часов, поднять температуру до 80°С
3. Сушка 24 часа, поднять температуру до 200°С
4. Сушка 24 часа, поднять температуру до 300°С
5. Сушка 24 часа, поднять температуру до 450°С
6. Сушка 48 часов при 450°С
7. По окончании сушки печь охлаждают, закрыв все отверстия. Это может занять несколько дней.
И никого не интересует дата потому что начать этот процесс могут и в 10 утра и в 10 вечера. Могут сегодня, а могут и через год, а технологу дали задание составить график режима сушки в прошлом году.
Если будет химический процесс, то там могут быть и часы и минуты и секунды.
------------ Дoбавленo в 16.58:
Для таких заданий нужен специальный компонент или применять компоненты группы "Логика".
ИМХО.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 16884
Рейтинг: 1239
#25: 2015-03-21 19:27:01 ЛС | профиль | цитата
Netspirit,
В книге про KOL Кладов писал(а):
В стандартном модуле SysUtils из Delphi VCL объявляется тип данных TDateTime. Фактически он эквивалентен числу с плавающей запятой двойной точности. В его целой части хранится день, в дробной части - время дня как дробная часть суток, считая сутки единицей. Аналогично типу данных TDateTime в VCL (модуль SysUtils), в KOL вводится свой тип данных TDateTime. С той разницей, что если SysUtils.TDateTime как число с плавающей запятой считает в своей целой части дни от 31 декабря 1899 года, в KOL.TDateTime отсчет начинается от даты 1 января 1 года нашей эры (эры "от рождества Христова") - по Григорианскому календарю. Я сделал так потому, что считаю этот тип данных удобным не только для связи с SQL-серверами, разработчики стандартов для которых решили, что раньше XX века ничего не было такого, что можно было бы посчитать. (На моем сайте есть модуль calenadae.pas, который может использоваться для астрономических, исторических и астрологических расчетов, для пересчета в различные календарные системы, расчета пасхальных дат и т.п.)

Если же кому-то нужна совместимость с SysUtils.TDatetime, то для преобразования из KOL'овской даты в VCL'евскую достаточно прибавить константу VCLDate0 (равную 693594, т.е. числу дней от 1 января 1 года до 31 декабря 1899 года), а для обратного преобразования - вычесть эту же константу. Для удобства конвертирования, такая константа декларирована в KOL под именем VCLDate0.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
1
Голосовали:3042
Ответов: 4621
Рейтинг: 746
#26: 2015-03-21 22:36:42 ЛС | профиль | цитата
Tad, а мне то зачем? Я и так это знаю. Ты мне лучше скажи, почему строковая дата 01-01-0001 00:00:00 после StrFmtToDateReal представляется числом 1.0, а не 0.0? Ведь с 01-01-0001 00:00:00 до 01-01-0001 23:59:59 прошло 0 дней.
И раз уж затронули тему, то
Tad писал(а):
не получишь 24:00:00, а получишь 00:00:00
При таком суммировании получается именно то, что должно. Всё зависит от того, как нужно отобразить результат. 24:00:00 - в твоем примере это не время суток, а суммарный временной интервал в часах. А в наших форматах даты это количество часов "от 0-вой даты". Чтобы отобразить интервал в часах, достаточно всё ту же сумму умножить на 24. И при потребности отформатировать в HH:mm:ss можно простой арифметикой. Наш компонент просто показывает именно как время суток.
Моя модификация касалась трех аспектов:
1) Правильное StrFmtToVCL, StrFmtToUnix строки с 0-ой частью даты
2) Правильное отображение хотя бы часов в результате xxxToStrFmt при 0-ой дате (точнее, меньше 01-01-1601)
3) Более понятное поведение StrFmtToDateUnix при датах, меньших 13.02.1901 20:45:52 (забыл добавить то же при конвертации из остальных xxxToDateUnix)
карма: 26

0
Ответов: 16884
Рейтинг: 1239
#27: 2015-03-22 13:12:37 ЛС | профиль | цитата
Netspirit,
1.
Netspirit писал(а):
01-01-0001 00:00:00
Наверное потому, что это парафия Юлианского календаря. А в Юлианском календаре день начинался в полдень, т.е. в 12:00:00
sql_kol.png
2. в компонентах используется TDateTime, которое не даст тебе отобразить 24:00:00
3. компонент для суммирования времени: http://forum.d2h.ru//getfile/35369

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1sql_kol.png [2.6KB] [722]
Ответов: 4621
Рейтинг: 746
#28: 2015-03-22 14:59:20 ЛС | профиль | цитата
Tad писал(а):
Наверное потому, что это парафия Юлианского календаря
И где об этом сказано в KOL? Если бы это было так, то за 0.0 служила бы дата 01-01-0001 12:00:00, тогда 01-01-0001 00:00:00 - это было бы отрицательное число. Либо 31-12-(-0001) 12:00:00.
Более правильно следует понимать, что KOL.TDateTime - это количество дней, которые прошли с 31-12-(-0001) 00:00:00 (соответствует 0.0). Тогда на 01-01-0001 00:00:00 прошел ровно 1 день, что и показывает KOL.TDateTime. Просто в KOL это вроде нигде не упоминается.

карма: 26

0
Ответов: 8888
Рейтинг: 823
#29: 2015-03-22 15:45:35 ЛС | профиль | цитата
Netspirit, я утром проснулся, смотрю на календарь: сегодня 22 марта 2015 г.,день только начался, но уже 22!, мой предок проснулся 1-го января 1-го года в 1 час 40 мин, включил HiAsm, ввёл дату/время и получил Real: 1.069444.., посчитал сколько секунд прошло с начала новой эры и получил 92400 сек, хотя прошло всего-то 6000 сек
карма: 19

0
Ответов: 16884
Рейтинг: 1239
#30: 2015-03-22 16:32:16 ЛС | профиль | цитата
В SQLite считается началом нашей эры дата 0000-12-31 12:00:00 и никаких проблем.
Хотя года 0000 как такового нет и в помине. Есть 1-й год до н.э. и сразу 1-й год н.э.
О чем говорит
Netspirit писал(а):
дата 01-01-0001 12:00:00
О том, что ИДЕТ! первый день первого месяца первого года. И прошло по Григорианскому календарю этого первого дня первого месяца первого года 12 часов 00 минут 00 секунд, т.е.
дней 0, месяцев 0, лет 0, часов 12, минут 0, секунд 0.
через 23:59:59 + 00:00:01 будет
дней 1, месяцев 0, лет 0, часов 0, минут 0, секунд 0.
Первый месяц станет 1(единицей) через 31-ни сутки
Один год станет после того как пройдёт 31 декабря, а пока он первый.
А первый (день, месяц, год) считать нельзя.
Один и первый это разные понятия.

Время, в отличие от даты, выражается реальными цифрами:
20:01:15
20 часов (уже прошло)
1 минута (тоже уже)
15 секунд (тоже уже натикало)
А, используя Date-формат, иногда говорят - "начало девятого" или "девятый час".

Обычные ошибки http://habrahabr.ru/post/146109/
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
30
Сообщение
...
Прикрепленные файлы
(файлы не залиты)