ZK Teco SDK — Формат даты и времени в контроллерах

В устройствах фирмы ZK Teco время хранится в целочисленном формате. Хоть в функциях библиотеки из комплекта SDK и заявлено автоматическое преобразование времени формата YYYY-MM-DD hh:mm:ss, но у меня не получилось заставить библиотеку преобразовывать время самостоятельно, соответственно необходимо было вычислить и непосредственно в программе преобразовать дату и время в понятные контроллеру перед загрузкой данных или наоборот получить в адекватном виде данные из контроллера.

В качестве примера возьму дату 2019-11-30 22:42:26, в контроллере данная дата выглядит как число 640046546.

Для начала преобразуем дату в понятный контроллеру вид. В документации к SDK есть некое подобие формул, но я лично нифига не понял и единственное что полезного было оттуда подчерпнуто так это то что значения «день» и «месяц» хранятся со значением -1 (тоесть например Январь это месяц 0, Февраль это 1 и т.д.), а год хранится в значении -2000.

Далее просто складываем последовательно все значения начиная с секунд и к каждому последующему прибавляя предыдущее, при этом все значения приводим к секундам и учитываем вышеизложенные поправки к значениям «день», «месяц», «год». Для даты которую выбрали в качестве примера это будет:

секунды = 26
минуты = 42*60 + секунды = 2546
часы = 22*60*60 + минуты = 81746
дни = (30-1)*24*60*60 + часы = 2587346
месяцы = (11-1)*31*24*60*60 + дни = 29371346
годы = (2019-2000)*12*31*24*60*60 + месяцы = 640046546 (итоговое значение)

Для обратного преобразования необходимо будет поочередно извлечь все числа начиная с года в обратном порядке, отделяя целые значения, это можно сделать разными способами. Например можно сразу вычислить целые значения для каждого элемента даты и времени в секундах.

год = 12*31*24*60*60 = 32140800 секунд
месяц = 31*24*60*60 = 2678400 секунд
день = 24*60*60 = 86400 секунд
час = 60*60 = 3600 секунд
минута = 60 секунд

Далее например с помощью цикла вычисляем сколько раз мы сможем отнять каждое значение начиная с года от исходного числа, когда не удается отнять целое, запоминаем остаток и переходим к следующему элементу даты. В конце не забываем добавить к получившемуся поправки для «дня», «месяца» и «года» о которых упоминалось выше. Также можно считать делением.

Для примера у нас есть число 640046546, вычисляем:

год = 640046546/32140800 = 19 целых, то что после запятой отсекаем, вычитаем найденные годы из исходного числа
640046546 - (1932140800) = 29371346 остаток

месяц = 29371346/2678400 = 10 целых
29371346 - (102678400) = 2587346 остаток

день = 2587346/86400 = 29 целых
2587346 - (2986400) = 81746 остаток

час = 81746/3600 = 22 целых
81746 - (223600) = 2546 остаток

минута = 2546/60 = 42 целых
2546 - (42*60) = 26 остаток (это секунды)

Итого берем целые числа, добавляем к «году», «месяцу» и «дню» поправки: 19+2000, 10+1, 29+1
и получаем 2019-11-30 22:42:26

Author: Ameteus

Добавить комментарий