C++ Receiver::date_time - класс для работы со временем и зонами

#define VOID void
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Май 2017
Сообщения
121
Реакции
25
Описание: Класс для работы с датой и временем по Интернет-стандарту. Класс предназначен для работы с Windows и работает с его API. Временные зоны берутся из реестра Windows. Вы можете найти их всех по этому пути: Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones. Все функции задокументированы в коде, вы можете разобраться сами, посмотрев файл src/date_time.h. Метод date_time::current использует время UTC без часового пояса. Вы можете установить пояс самостоятельно, используя date_time::set_timezone. Вы так же можете инициализировать класс с помощью timestamp.
Демонстрация:
Очень краткий пример всего функционала: парсинг и форматирование по стандарту ISO_8601, а также указание начального часового пояса.
C++:
Expand Collapse Copy
std::cout << date_time{"2023-09-07T00:00:00Z", date_format::ISO_8601,
                    time_zone{"Russia TZ 2 Standard Time"}}.format(date_format::ISO_8601) << std::endl;
Вы можете добавить/отнять секунды/минуты/часы/дни через std::chrono:
C++:
Expand Collapse Copy
using namespace std::chrono_literals;
std::cout << (date_time{"2023-09-07T00:00:00Z"} + 15min)
                 .format(date_format::ISO_8601)
          << std::endl;
Исходник:
Пожалуйста, авторизуйтесь для просмотра ссылки.


Если возникли проблемы или идеи по улучшению функционала - создавайте Issue на GH.
 
Пожалуйста, авторизуйтесь для просмотра ссылки.

есть причина отказа от std::stringstream?
имхо, но реализация через него смотрелась бы понятнее, была бы более читаемой и конечно же более модернизированной
 

Вложения

  • 1694436677839.png
    1694436677839.png
    22.1 KB · Просмотры: 123
Пожалуйста, авторизуйтесь для просмотра ссылки.

есть причина отказа от std::stringstream?
имхо, но реализация через него смотрелась бы понятнее, была бы более читаемой и конечно же более модернизированной
Я хотел сделать через него, но нормально спарсить дату не получилось, потому что std::get_time записывает дату сразу в struct tm. Плюс это просто работает быстрее. Скорее всего в дальнейшем я не буду ебаться с SYSTEMTIME, просто напишу свой экстрактор и манипулятор для потоков.
 
прикольно, но я не знаю, где это можно использовать
 
прикольно, но я не знаю, где это можно использовать
Лично я использую в связке с
Пожалуйста, авторизуйтесь для просмотра ссылки.
. Их класс utility::datetime может парсить, но не работает с временными зонами и имеет странный интерфейс. Мой сервер отдаёт время в таймозне +03:00 (MSK)
 
Обновление от 12.09.2023:
  • Добавлены операторы для работы с value_type = long long;
  • Исправлен код операторов сложения и вычитания;
 
Плюс это просто работает быстрее
нет.
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
Почему не сделать на enum'е с временными зонами?
.format(date_format::ISO_8601)
можно оверлоаднуть << оператор с этим форматтером чтоб получить

<< date_format::ISO_8601 << ...
 
Последнее редактирование:
можно оверлоаднуть << оператор с этим форматтером чтоб получить
Спасибо, но как ты представляешь это? Эта функция форматирует хранящийся timestamp в строку, это не потоковый класс.
Почему не сделать на enum'е с временными зонами?
Спасибо, но как ты представляешь это? Этот класс полностью работает на функциях WINAPI. У меня нет никакого контроля над временными зонами, всё что я могу сделать - получить её по названию, сам посмотри код. Тем более временных зон там не один десяток.
Да.
 
Последнее редактирование:
очень, очень, и очень вряд-ли :roflanEbalo:
Ну вы сначала проверьте, а потом говорите. std::sprintf это функция CRT и она написана на языке ассемблера, ничего не использует из вне и встраивается на этапе компиляции. В то время как std::stringstream отличается высоким уровнем абстракции и похдом ООП. Если вы поочерёдно циклично вызовете эти функции, то почувствуете разницу.
 
А, ну раз мы из рантайма вызываем линкед функу црт - то это обязательным образом быстрее?

Знаешь чем ещё std::string_stream отличается? Его компилтаймовым ктором. Не неси хуйни.
Спасибо, но как ты представляешь это?
...вставляя их абсолютно все в энумераторы?

нахуя тебе вообще обращаться к долбоебскому апи винды чтобы узнать сколько тебе часов к времени плюсануть эт для меня конечно загадка
Спасибо, но как ты представляешь это? Эта функция форматирует хранящийся timestamp в строку, это не потоковый класс.
Оверлоаднуть std::ostream& operator << не позволяют.. УК?
Плюс это просто работает быстрее
да с чего ты это нахуй взяяяяял
 
Последнее редактирование:
нахуя тебе вообще обращаться к долбоебскому апи винды чтобы узнать сколько тебе часов к времени плюсануть эт для меня конечно загадка
Я не хочу сейчас это объяснять, просто почитай что такое временные зоны и как они устроены.
Оверлоаднуть std::ostream& operator << не позволяют.. УК?
Я не понимаю, ты хочешь чтобы я добавил поддержку форамтирования для потоков или что?
да с чего ты это нахуй взяяяяял
Я больше не хочу спорить на эту тему, оставайся при своём мнении. Всё равно std::istringstream не позволяет мне получить дату в том формате, который нужен.
 
Так си-стайл хуита лучше/быстрее стрингстрима по каким-то бенчмаркам, или вы тут под эффектом плацебо сидите(CRT = просто = быстро, STL = сложна = медленна)?
 
ладно, проверив - я соглашусь, sscanf_s работает в 1.5-2 раза быстрее, но разница в скорости составляет буквально 0.22 - 1.99 МИКРОсекунд (исходя из результата chrono), есть ли смысл использовать Сишный стиль (вроде-бы в проекте который хочет использовать modern-cpp код) вызывая sscanf_s, имея возможность использовать std::stringstream из стандарта языка, сделав код более читаемым и менее восприимчивым к ошибкам?
1694587085873.png

Я больше не хочу спорить на эту тему, оставайся при своём мнении. Всё равно std::istringstream не позволяет мне получить дату в том формате, который нужен.
а это ещё по какой причине ?)
 
Пожалуйста, авторизуйтесь для просмотра ссылки.

есть причина отказа от std::stringstream?
имхо, но реализация через него смотрелась бы понятнее, была бы более читаемой и конечно же более модернизированной
даже в нём смысла нет std::format с 20 стандарта существует
 
ебать вы конечно любите доебаться до любой хуйни, иногда думаю где ещё такие люди имеются кроме этого форума :roflanPominki:
 
ебать вы конечно любите доебаться до любой хуйни, иногда думаю где ещё такие люди имеются кроме этого форума :roflanPominki:
например на любом форуме с программистами в виде комьюнити
его же никто не заставляет это переписывать, они просто высказывают своё мнение на вещь, которую он выложил на общее обозрение

если уж реально доебываться до хуйни, то он использует std::cout вместо std::print/std::println, он использует хедеры вместо модулей, половину его кода можно пометить constexpr, а ещё у библиотеки тесты не написаны
 
ебать вы конечно любите доебаться до любой хуйни, иногда думаю где ещё такие люди имеются кроме этого форума :roflanPominki:
Это моя первая тема на форуме и до меня уже доебались 4 человека. Хули вам не имётся?
На других форумах люди предлагают нормальные вещи добавить, а не слепо преследовать последние стандарты C++.
 
например на любом форуме с программистами в виде комьюнити
его же никто не заставляет это переписывать, они просто высказывают своё мнение на вещь, которую он выложил на общее обозрение

если уж реально доебываться до хуйни, то он использует std::cout вместо std::print/std::println, он использует хедеры вместо модулей, половину его кода можно пометить constexpr, а ещё у библиотеки тесты не написаны
это выглядит не как высказывание своего мнения, а как доеб до чужого кода
факт что один человек уже подумал о таком - говорит о том что либо слишком сильно критикуют, либо это натуральной воды доеб
мне кажется что в таких мелких реализациях не нуждается ТАКАЯ критика и тут каждый просто меряется своими ТоПоВыМи знаниями япа друг с другом, доказывая кто из них лучше ответил
 
это выглядит не как высказывание своего мнения, а как доеб до чужого кода
факт что один человек уже подумал о таком - говорит о том что либо слишком сильно критикуют, либо это натуральной воды доеб
мне кажется что в таких мелких реализациях не нуждается ТАКАЯ критика и тут каждый просто меряется своими ТоПоВыМи знаниями япа друг с другом, доказывая кто из них лучше ответил
Ладно бы просто мерялись, так они ещё настаивают на своём, ахахаххаах. Я в ахуе, такие дураки сидят - достаточно было чекнуть профиль @Maybe Baby, у него кроме пассивно-агрессивных комментариев никаких тем нет.
 
Назад
Сверху Снизу