OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 26 Апрель, 2017 01:23

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: Грубое упущение в интерфейсе Dates?
СообщениеДобавлено: Понедельник, 13 Март, 2017 16:12 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 8648
Откуда: Россия, Орёл
Модуль Dates содержит отдельно процедуры GetDate и GetTime.
Но не содержит GetDateTime для атомарного получения даты!

В итоге, на границе суток есть вероятность, что я получу ещё предыдущую дату, но время вместо 23:59:59 уже 00:00:00. Т.е. отскок назад на сутки.
Это полный п... очень опасный грабль.

Я внезапно вспоминаю один момент ложного срабатывания лиц. защиты нашего ПО, которое вырубалось при обнаружении попытки перевода времени назад. Как бы не с этим было связано.

При этом реализация - хук от HostDialog - содержит одну процедуру GetTime (d, t).
Но в конечном интерфейсе такие вот грабли.

Давайте, коллеги - майнтэйнеры сборок, включим в Dates GetDateTime?
И в документации к модулю пометим сей нюанс.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 13 Март, 2017 19:01 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 1794
Откуда: Красноярск
Внес предложение:
https://forum.blackboxframework.org/vie ... f=41&t=604

Версия для тестирования:
http://blackboxframework.org/unstable/i ... a1.804.zip


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 13 Март, 2017 23:19 

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7535
Откуда: Троицк, Москва
Поскольку ББ не проектировался для настолько hard-RT приложений, то "грубым" это упущение называть не вполне правильно.

Но факт интересен как пример того, насколько трудно предусмотреть всякие тонкости, проектируя библиотеки "из общих соображений". Мир всё-таки заковырист мама-не-горюй.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 14 Март, 2017 16:11 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 8648
Откуда: Россия, Орёл
Ну, оно не только для hard-RT.

Любое приложение базы данных.
Завели запись - а она на сутки раньше. Кому-нибудь какое-нибудь пособие не начислилось. И т.п.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 14 Март, 2017 17:00 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 1794
Откуда: Красноярск
Для UTC тоже предлагается сделать функцию.

https://redmine.blackboxframework.org/p ... 09ddc6ad20

http://blackboxframework.org/unstable/i ... a1.807.zip


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 15 Март, 2017 16:45 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 925
Откуда: СССР v2.0 rc 1
По хорошему, момент времени не может быть только годом-месяцем-днём. Туда же и часы-минуты. ещё и микросекунд надо напихать.
И промышленное время только в UTC.
Локальное время -- это для любителей))


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 15 Март, 2017 20:02 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 114
"Туда же и часы-минуты. ещё и микросекунд надо напихать."
И секунд вполне достаточно ;), а вот с микросекундами геморрой будет возникать :)

Я не ошибаюсь, ЦУП в Королёве ведь не по UTC, не?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 15 Март, 2017 23:11 
Аватара пользователя

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 422
Откуда: Егорьевск
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 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 1794
Откуда: Красноярск
Новые функции добавлены в Dates в альфа-версию 1.7.1.
http://blackboxframework.org/unstable/m ... a1.809.zip

С переименованием процедуры сложнее, ведь нарушится совместимость с 1.7.
Так что это только на 1.8 возможно планировать.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 16 Март, 2017 13:59 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 925
Откуда: СССР v2.0 rc 1
Artyemov писал(а):
"Туда же и часы-минуты. ещё и микросекунд надо напихать."
И секунд вполне достаточно ;), а вот с микросекундами геморрой будет возникать :)


Если говорить про отсечение микросекунд, то, тогда должен быть асинхронный счётчик на каждую секунду в интервале от 0 до 100 тыс. как минимум.
чтобы этот счётчик наращивался каждую секунду заново и +1 по каждому запросу времени. В противном случае, при попытке разобраться в событиях архивной базе на более-менее приличном предприятии точно можно будет геморрой получить в режиме 24*365,25.
Вообще, интенсивные процессы всегда требуют для учёта тысячных долей.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 16 Март, 2017 14:11 
Аватара пользователя

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 422
Откуда: Егорьевск
Код:
   (* 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;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 16 Март, 2017 14:36 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 375
Откуда: Киев
Alexander Shiryaev писал(а):
GetEasterDate → GetGregorianEasterDate

Зачем вообще такие функции нужны в Blackbox?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 16 Март, 2017 16:07 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 8648
Откуда: Россия, Орёл
Исключать старые, думаю, не стоит. Пометить как не рекомендованные.
Кому нужна только дата - пусть остаются на GetDate..


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 16 Март, 2017 17:06 

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7535
Откуда: Троицк, Москва
Comdiv писал(а):
Alexander Shiryaev писал(а):
GetEasterDate → GetGregorianEasterDate

Зачем вообще такие функции нужны в Blackbox?
Да, лучше, наверное, по меньшей мере в отдельном модуле.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2017, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB