• T-Hist binlog, SessionStart

    From Alexey Matrosov@2:203/910 to Mikhail Markovskiy on Mon Sep 28 20:21:18 2026
    Hello Mikhail,

    После тестов бинарного логирования обратил внимание, что все таблицы начинались с сессий, прошедших после 01:00 по местному времени.
    Дело в том, что qico честно пишет в бинарный лог UTC метку времени (Unix-timestamp of sesion start), а T-Hist, похоже, считает ее в местном часовом поясе.

    Если я правильно понимаю, это исторически пошло еще со времен T-Mail'а и дальше binkd, в котором это реализовали так же, из-за DOS часов, в которых нет UTC, и перекочевало в новые форматы v1/v2. T-Mail под DOS писал в поле то, что вернул time(). а практике это были секунды от 1970 года по местным часам. Посмотрел, как это делает binkd:

    _TS.fSTime = (u32)(state->start_time + tz_off(state->start_time, tzoff)*60)_

    Т.е, он записывает туда не Unix-timestamp с UTC временем, а местное время (с учетом tz_off из конфига).
    а практике, сий подход дает неприятный эффект два раза в году, при переводе часов лето-зима и обратно.

    Пример с центрально-европейским временем (мое местное время):
    - Весной (02:00 CET --> 03:00 CEST): В метках получается скачок: после 01:59:59 сразу идёт 03:00:00. Часа 02:00-02:59 в логе нет, но в это время и не было сессий по местным часам. В суточном отчёте будет 23 часа. Всё не так уж и плохо.
    - Осенью (03:00 CEST --> 02:00 CET): Час 02:00-02:59 проходит дважды, и метки идут назад на час. апример, сессия в 00:30 UTC (02:30 летнего времени) и сессия в 01:30 UTC (02:30 зимнего) получат одинаковую метку 02:30, хотя между ними час. В суточный отчёт попадают все 25 часов реальных сессий (но с наложенными метками времени).

    Как будем делать? :)

    - Если решим писать UTC время - этой проблемы не будет, но нужно это учесть в формате v1/v2 на стороне T-Hist.
    - Если на стороне qico писать время как binkd, T-Hist будет показывать правильное местное время. о раз в год, в ночь осеннего перевода, неизбежно появится повторяющийся час.

    Поправь меня, если ошибаюсь в рассуждениях ;)

    Mvh,
    Alex.

    --- .-. .- -... .- .-. -... . .-.
    * Origin: Rabarber > Skelleftea > Sweden (2:203/910)
  • From Mikhail Markovskiy@2:5020/378 to Alexey Matrosov on Mon Sep 28 23:00:28 2026
    Hello Alexey!

    Monday September 28 2026 20:21, Alexey Matrosov (2:203/910) => Mikhail Markovskiy:

    Т.е, он записывает туда не Unix-timestamp с UTC временем, а местное
    время (с учетом tz_off из конфига). а практике, сий подход дает
    неприятный эффект два раза в году, при переводе часов лето-зима и
    обратно.

    Как будем делать? :)

    Для начала попробовать в конфиге T-Hist использовать параметр 'TimeShift Auto'. (А в следующей версии к нему в пару будет ещё ключ командной строки.)

    - Если решим писать UTC время - этой проблемы не будет, но нужно это учесть в формате v1/v2 на стороне T-Hist. - Если на стороне qico
    писать время как binkd, T-Hist будет показывать правильное местное
    время. о раз в год, в ночь осеннего перевода, неизбежно появится повторяющийся час.

    В своё время я замучался с этим временами - одни мейлеры писали локальное (то же Binkd), другие UTC (Bink/+). В итоге я на это плюнул и сделал обработку, считая что время локальное. А в для тех случаев, где это неверно, сделал парметр TimeShift, в котором можно либо явно задать сдвиг в часах, либо написать 'Auto'.

    Так что лучше в лог писать UTC, чтобы в самом логе коллизий не было, а в T-Hist для начала использовать параметр TimeShift.

    Правда, всё равно будет особенность: если ночью сдвинули время, и мы сегодня с сегодняшним TimeShift обрабатыаем вчерашний лог, то сессии окажутся сдвинутыми.
    о это уже не проблема мейлера и формата, а проблема обработки. Можно, например, в T-Hist для каждой записи, имеющей время в UTC, определять, какая была разница между локальным временем и UTC именно в момент этой сессии и прибавлять его. Что-то типа:

    struct tm* RTime = localtime(&Record.SessionStart);
    #ifdef _WIN32
    Record.SessionStart += Time - mktime(gmtime(&Time));
    #else
    Record.SessionStart += RTime->tm_gmtoff;
    #endif

    о тогда надо будет в конфиге T-Hist вводить параметр, с помощью которого указывать, находится ли в бинарном логе UTC-время или локальное время.


    Mikhail

    --- GoldED+/LNX 2.0.0-b20260923
    * Origin: https://klug-photo.dreamwidth.org (2:5020/378)
  • From Mikhail Markovskiy@2:5020/378 to Mikhail Markovskiy on Mon Sep 28 23:08:00 2026
    Hello Mikhail!

    Monday September 28 2026 23:00, Mikhail Markovskiy (2:5020/378) => Alexey Matrosov:

    Правда, всё равно будет особенность: если ночью сдвинули время, и мы сегодня с сегодняшним TimeShift обрабатыаем вчерашний лог, то сессии окажутся сдвинутыми. о это уже не проблема мейлера и формата, а
    проблема обработки. Можно, например, в T-Hist для каждой записи,
    имеющей время в UTC, определять, какая была разница между локальным временем и UTC именно в момент этой сессии и прибавлять его.

    Сейчас понял, что не надо для каждой записи. Достаточно сдвиг при TimeShift Auto определять не для сегодняшнего дня (как это у меня сейчас делается), а для той даты, для которой строится статистика. Так что в лог надо писать UTC, а при обработке таких логов, где время в UTC, в T-Hist использовать TimeShift Auto.
    В T-Hist я сделаю изменение алгоритма вычисления сдвига времени.


    Mikhail

    --- GoldED+/LNX 2.0.0-b20260923
    * Origin: https://klug-photo.dreamwidth.org (2:5020/378)
  • From Alexey Matrosov@2:203/910 to Mikhail Markovskiy on Mon Sep 28 22:17:48 2026
    Hello Mikhail,

    Monday September 28 2026 23:00, you wrote to me:

    - Если решим писать UTC время - этой проблемы не будет, но нужно
    это учесть в формате v1/v2 на стороне T-Hist. - Если на стороне
    qico писать время как binkd, T-Hist будет показывать правильное
    местное время. о раз в год, в ночь осеннего перевода, неизбежно
    появится повторяющийся час.

    В своё время я замучался с этим временами - одни мейлеры писали
    локальное (то же Binkd), другие UTC (Bink/+). В итоге я на это плюнул
    и сделал обработку, считая что время локальное. А в для тех случаев,
    где это неверно, сделал парметр TimeShift, в котором можно либо явно задать сдвиг в часах, либо написать 'Auto'.

    "TimeShift Auto" на любых ОС вернет текущее смещение относительно UTC?

    Так что лучше в лог писать UTC, чтобы в самом логе коллизий не было, а
    в T-Hist для начала использовать параметр TimeShift.

    Ок, тогда оставляю Unix-timestamp с UTC временем.
    Продолжаю тестировать.

    Правда, всё равно будет особенность: если ночью сдвинули время, и мы сегодня с сегодняшним TimeShift обрабатыаем вчерашний лог, то сессии окажутся сдвинутыми. о это уже не проблема мейлера и формата, а
    проблема обработки.

    Да, временно поставил "TimeShift Auto" для теста, в секцию [LINE] для qico.
    о это не убережет от вышеописанных проблем в дни перевода часов, как ты верно заметил.

    Можно, например, в T-Hist для каждой записи,
    имеющей время в UTC, определять, какая была разница между локальным временем и UTC именно в момент этой сессии и прибавлять его.
    [...]
    о тогда надо будет в конфиге T-Hist вводить параметр, с помощью
    которого указывать, находится ли в бинарном логе UTC-время или
    локальное время.

    Имхо, это самое универсальное и корректное решение. Полностью исключит проблемы с переходом на летнее/зимнее время.
    Хорошо, если можно будет выбрать режим сохранения метки времени - глобально или для определнной секции [LINE]. Местное время (Local), или классический Unix-timestamp (UTC).

    Mvh,
    Alex.

    --- .-. .- -... .- .-. -... . .-.
    * Origin: Rabarber > Skelleftea > Sweden (2:203/910)
  • From Alexey Matrosov@2:203/910 to Mikhail Markovskiy on Mon Sep 28 22:34:00 2026
    Hello Mikhail,

    Monday September 28 2026 23:08, you wrote to you:

    Правда, всё равно будет особенность: если ночью сдвинули время, и
    мы сегодня с сегодняшним TimeShift обрабатыаем вчерашний лог, то
    сессии окажутся сдвинутыми. о это уже не проблема мейлера и
    формата, а проблема обработки. Можно, например, в T-Hist для
    каждой записи, имеющей время в UTC, определять, какая была
    разница между локальным временем и UTC именно в момент этой
    сессии и прибавлять его.

    Сейчас понял, что не надо для каждой записи. Достаточно сдвиг при TimeShift Auto определять не для сегодняшнего дня (как это у меня
    сейчас делается), а для той даты, для которой строится статистика. Так
    что в лог надо писать UTC, а при обработке таких логов, где время в
    UTC, в T-Hist использовать TimeShift Auto. В T-Hist я сделаю изменение алгоритма вычисления сдвига времени.

    В общем да, точно ;)
    То есть, не нужен новый параметр конфига будет?

    Mvh,
    Alex.

    --- .-. .- -... .- .-. -... . .-.
    * Origin: Rabarber > Skelleftea > Sweden (2:203/910)
  • From Mikhail Markovskiy@2:5020/378 to Alexey Matrosov on Tue Sep 29 17:25:16 2026
    Hello Alexey!

    Monday September 28 2026 22:17, Alexey Matrosov (2:203/910) => Mikhail Markovskiy:

    "TimeShift Auto" на любых ОС вернет текущее смещение относительно UTC?

    Поскольку T-Hist есть только под линукс и под винду, то сейчас смещение получается так:

    В линуксе используется поле tm_gmtoff структуры tm

    struct tm* RTime = localtime(&Time);
    UTC_Offset = RTime->tm_gmtoff;

    При кросс-компиляции для винды в виндовой библиотеке этого поля в структуре нет, поэтому вычисляется так:

    UTC_Offset = Time - mktime(gmtime(&Time));

    Если когда-нибудь T-Hist будет компилироваться под ещё какую-нибудь ОС, то надеюсь, что один из этих способов подойдёт.

    Ок, тогда оставляю Unix-timestamp с UTC временем.

    Да.


    Mikhail

    --- GoldED+/LNX 2.0.0-b20260923
    * Origin: https://klug-photo.dreamwidth.org (2:5020/378)
  • From Mikhail Markovskiy@2:5020/378 to Alexey Matrosov on Tue Sep 29 17:36:09 2026
    Hello Alexey!

    Monday September 28 2026 22:34, Alexey Matrosov (2:203/910) => Mikhail Markovskiy:

    Сейчас понял, что не надо для каждой записи. Достаточно сдвиг при
    TimeShift Auto определять не для сегодняшнего дня (как это у меня
    сейчас делается), а для той даты, для которой строится
    статистика. Так что в лог надо писать UTC, а при обработке таких
    логов, где время в UTC, в T-Hist использовать TimeShift Auto. В
    T-Hist я сделаю изменение алгоритма вычисления сдвига времени.

    В общем да, точно ;)
    То есть, не нужен новый параметр конфига будет?

    е нужен, ибо будет полным аналогом TimeShift Auto.

    А вычисление смещения от UTC (при TimeShift Auto) я, пожалуй, сделаю для каждой считываемой из лога записи. Это пригодится в LnkStat, который строит общую статистику за несколько дней.


    Mikhail

    --- GoldED+/LNX 2.0.0-b20260923
    * Origin: https://klug-photo.dreamwidth.org (2:5020/378)
  • From Alexey Matrosov@2:203/910 to Mikhail Markovskiy on Tue Sep 29 21:03:39 2026
    Hello Mikhail,

    Tuesday September 29 2026 17:25, you wrote to me:

    "TimeShift Auto" на любых ОС вернет текущее смещение относительно
    UTC?
    Поскольку T-Hist есть только под линукс и под винду, то сейчас
    смещение получается так:
    В линуксе используется поле tm_gmtoff структуры tm
    struct tm* RTime = localtime(&Time);
    UTC_Offset = RTime->tm_gmtoff;

    Попробовал указать в конфиге "TimeShift Auto" - не помогло, попробовал разные смещения вручную: 2, -2, 1 (для теста). о, как результат, сессии выводятся всегда начиная с 01:00. Вот пример:

    From 0:00:00 to 23:59:59, 28 September 2026, Monday

    ╔════════════╤═════╤════════════════════╤══════════╤═════════════════╤════════╗ ║ Session │ Dir │ Address │ Time │ Traffic │ CPS ║ ║ start │ │Prot Abrt│ Online │ Rcvd Sent │ bytes/s║ ╠════════════╪═════╪│══════════════════│╪══════════╪════════╤════════╪════════╣ ║ 01:00:03 │ In │√ 2:201/127.0 │ 0:00:01 │ 0 │ 0 │ 0 ║ ║ 01:01:11 │ In │√ 2:203/0.0 │ 0:00:01 │ 8806 │ 0 │ 8806 ║ ║ 01:04:15 │ In │√ 2:5001/100.0 │ 0:00:01 │ 0 │ 0 │ 0 ║ ║ 01:06:22 │ In │√ 2:203/0.0 │ 0:00:01 │ 14324 │ 0 │ 14324 ║ ║ 01:09:32 │ In │√ 2:203/0.0 │ 0:00:01 │ 9378 │ 0 │ 9378 ║ ║ 01:10:03 │ In │√ 2:201/127.0 │ 0:00:01 │ 0 │ 0 │ 0 ║ ║ 01:13:51 │ In │√ 2:5015/46.0 │ 0:00:01 │ 1906 │ 0 │ 1906 ║


    Фактическое время начала этих сессий (прочитано из бинарного лога):

    Address Start (UTC) Start (UTC+2) Duration -------------------- ------------------- ------------------- -------- 2:201/127 2026-09-27 23:00:03 2026-09-28 01:00:03 0:00:00
    2:203/0 2026-09-27 23:01:11 2026-09-28 01:01:11 0:00:00 2:5001/100 2026-09-27 23:04:15 2026-09-28 01:04:15 0:00:00
    2:203/0 2026-09-27 23:06:22 2026-09-28 01:06:22 0:00:00
    2:203/0 2026-09-27 23:09:32 2026-09-28 01:09:32 0:00:01 2:201/127 2026-09-27 23:10:03 2026-09-28 01:10:03 0:00:00 2:5015/46 2026-09-27 23:13:51 2026-09-28 01:13:51 0:00:00

    Для удобство, указаны 2 метки времени: UTC, и мой текущий локальный пояс (+2).

    Mvh,
    Alex.

    --- .-. .- -... .- .-. -... . .-.
    * Origin: Rabarber > Skelleftea > Sweden (2:203/910)