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

#define VOID void
Начинающий
Статус
Оффлайн
Регистрация
13 Май 2017
Сообщения
120
Реакции[?]
24
Поинты[?]
13K
Описание: Класс для работы с датой и временем по Интернет-стандарту. Класс предназначен для работы с 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++:
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++:
using namespace std::chrono_literals;
std::cout << (date_time{"2023-09-07T00:00:00Z"} + 15min)
                 .format(date_format::ISO_8601)
          << std::endl;
Исходник:
Пожалуйста, авторизуйтесь для просмотра ссылки.


Если возникли проблемы или идеи по улучшению функционала - создавайте Issue на GH.
 
Stop Staring At the Shadows
Участник
Статус
Оффлайн
Регистрация
10 Окт 2020
Сообщения
519
Реакции[?]
497
Поинты[?]
86K
Пожалуйста, авторизуйтесь для просмотра ссылки.

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

Вложения

#define VOID void
Начинающий
Статус
Оффлайн
Регистрация
13 Май 2017
Сообщения
120
Реакции[?]
24
Поинты[?]
13K
Пожалуйста, авторизуйтесь для просмотра ссылки.

есть причина отказа от std::stringstream?
имхо, но реализация через него смотрелась бы понятнее, была бы более читаемой и конечно же более модернизированной
Я хотел сделать через него, но нормально спарсить дату не получилось, потому что std::get_time записывает дату сразу в struct tm. Плюс это просто работает быстрее. Скорее всего в дальнейшем я не буду ебаться с SYSTEMTIME, просто напишу свой экстрактор и манипулятор для потоков.
 
#define VOID void
Начинающий
Статус
Оффлайн
Регистрация
13 Май 2017
Сообщения
120
Реакции[?]
24
Поинты[?]
13K
прикольно, но я не знаю, где это можно использовать
Лично я использую в связке с
Пожалуйста, авторизуйтесь для просмотра ссылки.
. Их класс utility::datetime может парсить, но не работает с временными зонами и имеет странный интерфейс. Мой сервер отдаёт время в таймозне +03:00 (MSK)
 
#define VOID void
Начинающий
Статус
Оффлайн
Регистрация
13 Май 2017
Сообщения
120
Реакции[?]
24
Поинты[?]
13K
Обновление от 12.09.2023:
  • Добавлены операторы для работы с value_type = long long;
  • Исправлен код операторов сложения и вычитания;
 
Эксперт
Статус
Оффлайн
Регистрация
29 Мар 2021
Сообщения
1,605
Реакции[?]
607
Поинты[?]
48K
Плюс это просто работает быстрее
нет.
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
Почему не сделать на enum'е с временными зонами?
.format(date_format::ISO_8601)
можно оверлоаднуть << оператор с этим форматтером чтоб получить

<< date_format::ISO_8601 << ...
 
Последнее редактирование:
#define VOID void
Начинающий
Статус
Оффлайн
Регистрация
13 Май 2017
Сообщения
120
Реакции[?]
24
Поинты[?]
13K
можно оверлоаднуть << оператор с этим форматтером чтоб получить
Спасибо, но как ты представляешь это? Эта функция форматирует хранящийся timestamp в строку, это не потоковый класс.
Почему не сделать на enum'е с временными зонами?
Спасибо, но как ты представляешь это? Этот класс полностью работает на функциях WINAPI. У меня нет никакого контроля над временными зонами, всё что я могу сделать - получить её по названию, сам посмотри код. Тем более временных зон там не один десяток.
Да.
 
Последнее редактирование:
#define VOID void
Начинающий
Статус
Оффлайн
Регистрация
13 Май 2017
Сообщения
120
Реакции[?]
24
Поинты[?]
13K
очень, очень, и очень вряд-ли :roflanEbalo:
Ну вы сначала проверьте, а потом говорите. std::sprintf это функция CRT и она написана на языке ассемблера, ничего не использует из вне и встраивается на этапе компиляции. В то время как std::stringstream отличается высоким уровнем абстракции и похдом ООП. Если вы поочерёдно циклично вызовете эти функции, то почувствуете разницу.
 
Эксперт
Статус
Оффлайн
Регистрация
29 Мар 2021
Сообщения
1,605
Реакции[?]
607
Поинты[?]
48K
А, ну раз мы из рантайма вызываем линкед функу црт - то это обязательным образом быстрее🤗

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

нахуя тебе вообще обращаться к долбоебскому апи винды чтобы узнать сколько тебе часов к времени плюсануть эт для меня конечно загадка
Спасибо, но как ты представляешь это? Эта функция форматирует хранящийся timestamp в строку, это не потоковый класс.
Оверлоаднуть std::ostream& operator << не позволяют.. УК?
Плюс это просто работает быстрее
да с чего ты это нахуй взяяяяял
 
Последнее редактирование:
#define VOID void
Начинающий
Статус
Оффлайн
Регистрация
13 Май 2017
Сообщения
120
Реакции[?]
24
Поинты[?]
13K
нахуя тебе вообще обращаться к долбоебскому апи винды чтобы узнать сколько тебе часов к времени плюсануть эт для меня конечно загадка
Я не хочу сейчас это объяснять, просто почитай что такое временные зоны и как они устроены.
Оверлоаднуть std::ostream& operator << не позволяют.. УК?
Я не понимаю, ты хочешь чтобы я добавил поддержку форамтирования для потоков или что?
да с чего ты это нахуй взяяяяял
Я больше не хочу спорить на эту тему, оставайся при своём мнении. Всё равно std::istringstream не позволяет мне получить дату в том формате, который нужен.
 
Ревёрсер среднего звена
Пользователь
Статус
Оффлайн
Регистрация
24 Ноя 2022
Сообщения
303
Реакции[?]
108
Поинты[?]
57K
Так си-стайл хуита лучше/быстрее стрингстрима по каким-то бенчмаркам, или вы тут под эффектом плацебо сидите(CRT = просто = быстро, STL = сложна = медленна)?
 
Stop Staring At the Shadows
Участник
Статус
Оффлайн
Регистрация
10 Окт 2020
Сообщения
519
Реакции[?]
497
Поинты[?]
86K
ладно, проверив - я соглашусь, sscanf_s работает в 1.5-2 раза быстрее, но разница в скорости составляет буквально 0.22 - 1.99 МИКРОсекунд (исходя из результата chrono), есть ли смысл использовать Сишный стиль (вроде-бы в проекте который хочет использовать modern-cpp код) вызывая sscanf_s, имея возможность использовать std::stringstream из стандарта языка, сделав код более читаемым и менее восприимчивым к ошибкам?
1694587085873.png
Я больше не хочу спорить на эту тему, оставайся при своём мнении. Всё равно std::istringstream не позволяет мне получить дату в том формате, который нужен.
а это ещё по какой причине ?)
 
std::X$$V::Z::_Func_impl_no_alloc
Пользователь
Статус
Оффлайн
Регистрация
30 Мар 2019
Сообщения
389
Реакции[?]
103
Поинты[?]
1K
Пожалуйста, авторизуйтесь для просмотра ссылки.

есть причина отказа от std::stringstream?
имхо, но реализация через него смотрелась бы понятнее, была бы более читаемой и конечно же более модернизированной
даже в нём смысла нет std::format с 20 стандарта существует
 
Пользователь
Статус
Оффлайн
Регистрация
23 Авг 2021
Сообщения
521
Реакции[?]
53
Поинты[?]
20K
ебать вы конечно любите доебаться до любой хуйни, иногда думаю где ещё такие люди имеются кроме этого форума :roflanPominki:
 
std::X$$V::Z::_Func_impl_no_alloc
Пользователь
Статус
Оффлайн
Регистрация
30 Мар 2019
Сообщения
389
Реакции[?]
103
Поинты[?]
1K
ебать вы конечно любите доебаться до любой хуйни, иногда думаю где ещё такие люди имеются кроме этого форума :roflanPominki:
например на любом форуме с программистами в виде комьюнити
его же никто не заставляет это переписывать, они просто высказывают своё мнение на вещь, которую он выложил на общее обозрение

если уж реально доебываться до хуйни, то он использует std::cout вместо std::print/std::println, он использует хедеры вместо модулей, половину его кода можно пометить constexpr, а ещё у библиотеки тесты не написаны
 
#define VOID void
Начинающий
Статус
Оффлайн
Регистрация
13 Май 2017
Сообщения
120
Реакции[?]
24
Поинты[?]
13K
ебать вы конечно любите доебаться до любой хуйни, иногда думаю где ещё такие люди имеются кроме этого форума :roflanPominki:
Это моя первая тема на форуме и до меня уже доебались 4 человека. Хули вам не имётся?
На других форумах люди предлагают нормальные вещи добавить, а не слепо преследовать последние стандарты C++.
 
Пользователь
Статус
Оффлайн
Регистрация
23 Авг 2021
Сообщения
521
Реакции[?]
53
Поинты[?]
20K
например на любом форуме с программистами в виде комьюнити
его же никто не заставляет это переписывать, они просто высказывают своё мнение на вещь, которую он выложил на общее обозрение

если уж реально доебываться до хуйни, то он использует std::cout вместо std::print/std::println, он использует хедеры вместо модулей, половину его кода можно пометить constexpr, а ещё у библиотеки тесты не написаны
это выглядит не как высказывание своего мнения, а как доеб до чужого кода
факт что один человек уже подумал о таком - говорит о том что либо слишком сильно критикуют, либо это натуральной воды доеб
мне кажется что в таких мелких реализациях не нуждается ТАКАЯ критика и тут каждый просто меряется своими ТоПоВыМи знаниями япа друг с другом, доказывая кто из них лучше ответил
 
#define VOID void
Начинающий
Статус
Оффлайн
Регистрация
13 Май 2017
Сообщения
120
Реакции[?]
24
Поинты[?]
13K
это выглядит не как высказывание своего мнения, а как доеб до чужого кода
факт что один человек уже подумал о таком - говорит о том что либо слишком сильно критикуют, либо это натуральной воды доеб
мне кажется что в таких мелких реализациях не нуждается ТАКАЯ критика и тут каждый просто меряется своими ТоПоВыМи знаниями япа друг с другом, доказывая кто из них лучше ответил
Ладно бы просто мерялись, так они ещё настаивают на своём, ахахаххаах. Я в ахуе, такие дураки сидят - достаточно было чекнуть профиль OXXXYMlRON, у него кроме пассивно-агрессивных комментариев никаких тем нет.
 
Сверху Снизу