В устройствах фирмы 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