OberonCore https://forum.oberoncore.ru/ |
|
Грубое упущение в интерфейсе Dates? https://forum.oberoncore.ru/viewtopic.php?f=23&t=6027 |
Страница 1 из 1 |
Автор: | Илья Ермаков [ Понедельник, 13 Март, 2017 16:12 ] |
Заголовок сообщения: | Грубое упущение в интерфейсе Dates? |
Модуль Dates содержит отдельно процедуры GetDate и GetTime. Но не содержит GetDateTime для атомарного получения даты! В итоге, на границе суток есть вероятность, что я получу ещё предыдущую дату, но время вместо 23:59:59 уже 00:00:00. Т.е. отскок назад на сутки. Это полный п... очень опасный грабль. Я внезапно вспоминаю один момент ложного срабатывания лиц. защиты нашего ПО, которое вырубалось при обнаружении попытки перевода времени назад. Как бы не с этим было связано. При этом реализация - хук от HostDialog - содержит одну процедуру GetTime (d, t). Но в конечном интерфейсе такие вот грабли. Давайте, коллеги - майнтэйнеры сборок, включим в Dates GetDateTime? И в документации к модулю пометим сей нюанс. |
Автор: | Иван Денисов [ Понедельник, 13 Март, 2017 19:01 ] |
Заголовок сообщения: | Re: Грубое упущение в интерфейсе Dates? |
Внес предложение: https://forum.blackboxframework.org/vie ... f=41&t=604 Версия для тестирования: http://blackboxframework.org/unstable/i ... a1.804.zip |
Автор: | Info21 [ Понедельник, 13 Март, 2017 23:19 ] |
Заголовок сообщения: | Re: Грубое упущение в интерфейсе Dates? |
Поскольку ББ не проектировался для настолько hard-RT приложений, то "грубым" это упущение называть не вполне правильно. Но факт интересен как пример того, насколько трудно предусмотреть всякие тонкости, проектируя библиотеки "из общих соображений". Мир всё-таки заковырист мама-не-горюй. |
Автор: | Илья Ермаков [ Вторник, 14 Март, 2017 16:11 ] |
Заголовок сообщения: | Re: Грубое упущение в интерфейсе Dates? |
Ну, оно не только для hard-RT. Любое приложение базы данных. Завели запись - а она на сутки раньше. Кому-нибудь какое-нибудь пособие не начислилось. И т.п. |
Автор: | Иван Денисов [ Вторник, 14 Март, 2017 17:00 ] |
Заголовок сообщения: | Re: Грубое упущение в интерфейсе Dates? |
Для UTC тоже предлагается сделать функцию. https://redmine.blackboxframework.org/p ... 09ddc6ad20 http://blackboxframework.org/unstable/i ... a1.807.zip |
Автор: | prospero78 [ Среда, 15 Март, 2017 16:45 ] |
Заголовок сообщения: | Re: Грубое упущение в интерфейсе Dates? |
По хорошему, момент времени не может быть только годом-месяцем-днём. Туда же и часы-минуты. ещё и микросекунд надо напихать. И промышленное время только в UTC. Локальное время -- это для любителей)) |
Автор: | Artyemov [ Среда, 15 Март, 2017 20:02 ] |
Заголовок сообщения: | Re: Грубое упущение в интерфейсе Dates? |
"Туда же и часы-минуты. ещё и микросекунд надо напихать." И секунд вполне достаточно , а вот с микросекундами геморрой будет возникать Я не ошибаюсь, ЦУП в Королёве ведь не по UTC, не? |
Автор: | Alexander Shiryaev [ Среда, 15 Март, 2017 23:11 ] |
Заголовок сообщения: | Re: Грубое упущение в интерфейсе Dates? |
GetEasterDate → GetGregorianEasterDate https://en.wikipedia.org/wiki/Computus http://www.tondering.dk/claus/cal/julperiod.php http://www.tondering.dk/claus/cal/easter.php |
Автор: | Иван Денисов [ Четверг, 16 Март, 2017 06:11 ] |
Заголовок сообщения: | Re: Грубое упущение в интерфейсе Dates? |
Новые функции добавлены в Dates в альфа-версию 1.7.1. http://blackboxframework.org/unstable/m ... a1.809.zip С переименованием процедуры сложнее, ведь нарушится совместимость с 1.7. Так что это только на 1.8 возможно планировать. |
Автор: | prospero78 [ Четверг, 16 Март, 2017 13:59 ] |
Заголовок сообщения: | Re: Грубое упущение в интерфейсе Dates? |
Artyemov писал(а): "Туда же и часы-минуты. ещё и микросекунд надо напихать." И секунд вполне достаточно , а вот с микросекундами геморрой будет возникать Если говорить про отсечение микросекунд, то, тогда должен быть асинхронный счётчик на каждую секунду в интервале от 0 до 100 тыс. как минимум. чтобы этот счётчик наращивался каждую секунду заново и +1 по каждому запросу времени. В противном случае, при попытке разобраться в событиях архивной базе на более-менее приличном предприятии точно можно будет геморрой получить в режиме 24*365,25. Вообще, интенсивные процессы всегда требуют для учёта тысячных долей. |
Автор: | Alexander Shiryaev [ Четверг, 16 Март, 2017 14:11 ] |
Заголовок сообщения: | Re: Грубое упущение в интерфейсе Dates? |
Код: (* http://www.tondering.dk/claus/cal/julperiod.php *)
PROCEDURE DateJulToJDN (IN d: Dates.Date): INTEGER; VAR a, y, m: INTEGER; BEGIN a := (14 - d.month) DIV 12; y := d.year + 4800 - a; m := d.month + 12 * a - 3; RETURN d.day + (153 * m + 2) DIV 5 + 365 * y + y DIV 4 - 32083 END DateJulToJDN; (* http://www.tondering.dk/claus/cal/julperiod.php *) PROCEDURE DateGregToJDN (IN d: Dates.Date): INTEGER; VAR a, y, m: INTEGER; BEGIN a := (14 - d.month) DIV 12; y := d.year + 4800 - a; m := d.month + 12 * a - 3; RETURN d.day + (153 * m + 2) DIV 5 + 365 * y + y DIV 4 - y DIV 100 + y DIV 400 - 32045 END DateGregToJDN; (* http://www.tondering.dk/claus/cal/julperiod.php *) PROCEDURE BCToDateJulGreg (b, c: INTEGER; OUT date: Dates.Date); VAR d, e, m: INTEGER; BEGIN d := (4 * c + 3) DIV 1461; e := c - (1461 * d) DIV 4; m := (5 * e + 2) DIV 153; date.day := e - (153 * m + 2) DIV 5 + 1; date.month := m + 3 - 12 * (m DIV 10); date.year := 100 * b + d - 4800 + m DIV 10 END BCToDateJulGreg; (* http://www.tondering.dk/claus/cal/julperiod.php *) PROCEDURE JDNToDateJul (jdn: INTEGER; OUT d: Dates.Date); BEGIN ASSERT(jdn >= 0, 20); ASSERT(jdn <= 536838829, 21); (* 1465072.8.11 *) BCToDateJulGreg(0, jdn + 32082, d) END JDNToDateJul; (* http://www.tondering.dk/claus/cal/julperiod.php *) PROCEDURE JDNToDateGreg (jdn: INTEGER; OUT d: Dates.Date); VAR a, b, c: INTEGER; BEGIN ASSERT(jdn >= 0, 20); ASSERT(jdn <= 536838867, 21); (* 1465102.10.18 *) a := jdn + 32044; b := (4 * a + 3) DIV 146097; c := a - (146097 * b) DIV 4; BCToDateJulGreg(b, c, d) END JDNToDateGreg; (* Gauss *) PROCEDURE AlexandrianEasterJul (year: INTEGER; OUT d: Dates.Date); VAR a, b: INTEGER; BEGIN a := (19 * (year MOD 19) + 15) MOD 30; b := (2 * (year MOD 4) + 4 * (year MOD 7) + 6 * a + 6) MOD 7; IF a + b > 9 THEN d.month := 4; d.day := a + b - 9 ELSE d.month := 3; d.day := 22 + a + b END; d.year := year END AlexandrianEasterJul; (* year, d: Gregorian *) PROCEDURE GetAlexandrianEasterDate* (year: INTEGER; OUT d: Dates.Date); BEGIN ASSERT(year >= 326); ASSERT(year <= 10900); (* d.year := year; d.month := 3; d.day := 21; JDNToDateJul(DateGregToJDN(d), d); ASSERT(d.year = year, 100); *) AlexandrianEasterJul(year, d); JDNToDateGreg(DateJulToJDN(d), d); ASSERT(d.year = year, 101) END GetAlexandrianEasterDate; |
Автор: | Comdiv [ Четверг, 16 Март, 2017 14:36 ] |
Заголовок сообщения: | Re: Грубое упущение в интерфейсе Dates? |
Alexander Shiryaev писал(а): GetEasterDate → GetGregorianEasterDate Зачем вообще такие функции нужны в Blackbox? |
Автор: | Илья Ермаков [ Четверг, 16 Март, 2017 16:07 ] |
Заголовок сообщения: | Re: Грубое упущение в интерфейсе Dates? |
Исключать старые, думаю, не стоит. Пометить как не рекомендованные. Кому нужна только дата - пусть остаются на GetDate.. |
Автор: | Info21 [ Четверг, 16 Март, 2017 17:06 ] |
Заголовок сообщения: | Re: Грубое упущение в интерфейсе Dates? |
Comdiv писал(а): Alexander Shiryaev писал(а): GetEasterDate → GetGregorianEasterDate Зачем вообще такие функции нужны в Blackbox? |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |