elektroyar
elektroyar личный блог
28 сентября 2021, 21:58

Библиотека для работы с временем и датой ztime

 С++ библиотека для работы с датой и временем Z-time

Библиотека для работы с временем и датой ztime

Всем привет! Ранее я уже писал про библиотеку для работы с датой и временем. С тех пор я добавил в нее новый функционал и адаптировал под использование в VS (оказалось, что в VS имя xtime уже занято). Эта библиотека очередной велосипед, но что поделать, люблю делать велосипеды
boost::posix_time, std, boost ::chrono… надо учиться эффективно использовать чужие велосипеды, иначе легко завязнуть в своих...

В трейдинге данная библиотека может быть полезна, если нужно измерять точное время в программе при помощи NTP без корректировки времени самого сервера/ПК, для проверки взаимосвязи настроения рынка с фазами Луны, для различных преобразований времени в разные форматы.


Описание


Данная библиотека представляет собой сборник алгоритмов, классов, функций и констант для удобной работы с временем:

  • Измерение точного времени при помощи NTP
  • Получение реального времени компьютера с точностью до микросекунд
  • Преобразование даты в метку времени и обратно
  • Парсинг строк или формирование строки из даты
  • Расчет фаз Луны, поиск следующего новолуния
  • Преобразование UINX времени в OLE Automation Date и обратно
  • Получение секунды, минуты, часа дня из метки времени, получение последней метки времени месяца и т.п.
  • И многие другие возможности...

Форматы времени, с которыми работает библиотека:

  • метка времени (timestamp)
  • юлианский день (JD или JDN)
  • дата автоматизации (OADate)
  • «понятная дата» (human readable date)

Файлы ztime.hppztime_cpu_time.hppztime_ntp.hpp содержат подробные комментарии.

Для хранения и преобразования меток времени используется тип данных uint64, поэтому у данной библиотеки нет проблемы 2038 года

Примеры использования различных функций и классов можно найти в папке code_blocks/test.

 

Пример использования
#include <iostream>
#include "ztime_ntp.hpp"
#include "ztime.hpp"

int main() {
    ztime::ntp::init();
	
    // Time synchronized with the Internet
    std::cout << "ntp timestamp (us): " << ztime::ntp::get_timestamp_us() << std::endl;
    std::cout << "ntp timestamp  (s): " << ztime::ntp::get_timestamp() << std::endl;
    std::cout << "ntp timestamp  (s): " << ztime::ntp::get_ftimestamp() << std::endl;
    std::cout << "ntp offset    (us): " << ztime::ntp::get_offset_us() << std::endl;
	
    // Computer time
    std::cout << "pc  timestamp (us): " << ztime::get_timestamp_us() << std::endl;
    std::cout << "pc  timestamp  (s): " << ztime::get_timestamp() << std::endl;
    std::cout << "pc  timestamp  (s): " << ztime::get_ftimestamp() << std::endl;
	
    // Date
    std::cout << "date: " << ztime::get_timestamp(17, 5, 2021) << std::endl;
    std::cout << "date: " << ztime::get_timestamp(17, 5, 2021, 11, 5, 50) << std::endl;
	
    DateTime iTime(12, 6, 2013, 15, 23, 01);
    iTime = DateTime("2013-12-06T15:23:01+00:00");
	
    ztime::timestamp_t timestamp = iTime.get_timestamp();
	
    // translating GMT time during CET
    DateTime iTimeCET(convert_gmt_to_cet(timestamp));
    timestamp = iTimeCET.get_timestamp();
	
    std::cout << "date: " << ztime::get_str_date_time(timestamp) << std::endl;
	
	
    // Julian day
    std::cout << "jd: " << ztime::get_julian_date(17.5, 5, 2021) << std::endl;
    std::cout << "jd: " << ztime::get_julian_date(17, 5, 2021, 11, 5, 50) << std::endl;
    std::cout << "jdn: " << ztime::get_julian_day_number(1, 1, 1970) << std::endl;

    // Moon Phase
    ztime::MoonPhase moon_phase;
    moon_phase.init(ztime::get_ftimestamp(18, 5, 2021, 0, 0,0));
	
    std::cout << "age: " << moon_phase.age << std::endl;
    std::cout << "age_in_degrees: " << moon_phase.age_in_degrees << std::endl;
    std::cout << "phase: " << moon_phase.phase << std::endl;

    std::cout << "get_moon_phase: " << ztime::get_moon_phase(ztime::get_ftimestamp(18, 5, 2021, 0, 0, 0)) << std::endl;
    std::cout << "get_moon_phase: " << ztime::get_moon_phase_v2(ztime::get_ftimestamp(18, 5, 2021, 0, 0, 0)) << std::endl;
    std::cout << "get_moon_age: " << ztime::get_moon_age(ztime::get_ftimestamp(18, 5, 2021, 0, 0,0)) << std::endl;
	
    return 0;
}

 
Репозиторий тут

7 Комментариев
  • Андрей К
    28 сентября 2021, 22:15
    Я сначала подумал, что про Луну это шутка ))
    • Дмитрий Овчинников
      28 сентября 2021, 23:11
      Андрей К, 
      фазы Луны это круто. Где бы взять какой-нибудь простецкий csv или xls файл с этими данными. А еще бы файл такого же типа, но с актуальным переводом американского времени в наше российское. И все это года с 2015 по н.в.
      А хипстеры все делают какие-то ни разу не практичные вещи на 
      • Андрей К
        28 сентября 2021, 23:13
        Дмитрий Овчинников, я на фазы луны обращал внимание примерно в 2013-2014, тогда еще Василий как то публично сказал, что в полнолуние рынки разворачиваются, что действительно было так ) потом забросил
        • Дмитрий Овчинников
          28 сентября 2021, 23:16
          Андрей К, 
          а у меня все руки не доходят до тестов, все данных в нормальном виде нет, а мастерить лень :)
          Хотя в книжке https://smart-lab.ru/books/encyclopedia-torgovyh-strategiy/ говорят, что не работает, так у них там ничего не работает, с таким то подходом.

          • Андрей К
            28 сентября 2021, 23:22
            Дмитрий Овчинников, я раньше очень много данных для тестов добывал путем парсинга сайтов. Достаточно интересные задачки. Есть даже парсер смартлаба, у меня все пользователи пересчитаны и загнаны в базу )
            • Дмитрий Овчинников
              28 сентября 2021, 23:24
              Андрей К, 
              так ты программист и айтишник, тебе проще. А мне для любого такого действия надо ОЧЕНЬ сильно напрягаться, я лучше в других местах понапрягаюсь, это будет более эффективно.
              • Андрей К
                28 сентября 2021, 23:36
                Дмитрий Овчинников, логично ) напрягаться нужно там, где эффективнее 

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн