2#ifndef _TIME_SHIELD_TIME_FORMATTING_HPP_INCLUDED
3#define _TIME_SHIELD_TIME_FORMATTING_HPP_INCLUDED
27 std::string& result) {
30 if (repeat_count > 1)
break;
34 if (repeat_count > 1)
break;
38 if (repeat_count == 1) {
41 result += std::string(buffer);
45 if (repeat_count <= 2) {
47 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
hour);
48 result += std::string(buffer);
52 if (repeat_count == 2) {
54 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
hour);
55 result += std::string(buffer);
60 if (repeat_count > 1)
break;
61 result +=
to_str(
static_cast<Month>(dt.
mon), FormatType::SHORT_NAME);
64 if (repeat_count > 1)
break;
65 result +=
to_str(
static_cast<Month>(dt.
mon), FormatType::FULL_NAME);
70 if (repeat_count <= 1){
74 result +=
to_str(
static_cast<Month>(dt.
mon), FormatType::SHORT_NAME);
77 std::fill(buffer, buffer +
sizeof(buffer),
'\0');
78 snprintf(buffer,
sizeof(buffer),
"%2d ", dt.
day);
79 result += std::string(buffer);
81 std::fill(buffer, buffer +
sizeof(buffer),
'\0');
82 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d ", dt.
hour, dt.
min, dt.
sec);
83 result += std::string(buffer);
85 result += std::to_string(dt.
year);
89 if (repeat_count > 1)
break;
90 result += std::to_string(dt.
year/100);
93 if (repeat_count < 2) {
95 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
day);
96 result += std::string(buffer);
100 if (repeat_count == 1) {
102 char buffer[16] = {0};
103 snprintf(buffer,
sizeof(buffer),
"%.2d/%.2d/%.2d", dt.
mon, dt.
day, (
int)(dt.
year % 100LL));
104 result += std::string(buffer);
106 if (repeat_count == 2) {
107 char buffer[4] = {0};
108 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
day);
109 result += std::string(buffer);
113 if (repeat_count == 1) {
114 char buffer[4] = {0};
115 snprintf(buffer,
sizeof(buffer),
"%2d", dt.
day);
116 result += std::string(buffer);
124 if (repeat_count == 1) {
126 char buffer[32] = {0};
127 if (dt.
year <= 9999 || dt.
year >= 0) {
128 snprintf(buffer,
sizeof(buffer),
"%.4d-%.2d-%.2d", (
int)dt.
year, dt.
mon, dt.
day);
131 snprintf(buffer,
sizeof(buffer),
"-%lld-%.2d-%.2d", dt.
year, dt.
mon, dt.
day);
133 snprintf(buffer,
sizeof(buffer),
"+%lld-%.2d-%.2d", dt.
year, dt.
mon, dt.
day);
135 result += std::string(buffer);
144 if (repeat_count == 1) {
145 char buffer[4] = {0};
147 result += std::string(buffer);
151 if (repeat_count == 1) {
152 char buffer[4] = {0};
153 snprintf(buffer,
sizeof(buffer),
"%2d", dt.
hour);
154 result += std::string(buffer);
158 if (repeat_count == 1) {
159 char buffer[4] = {0};
161 result += std::string(buffer);
165 if (repeat_count == 1) {
166 char buffer[4] = {0};
167 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
mon);
168 result += std::string(buffer);
170 if (repeat_count == 2) {
171 char buffer[4] = {0};
172 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
min);
173 result += std::string(buffer);
177 if (repeat_count == 1) {
178 char buffer[4] = {0};
179 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
min);
180 result += std::string(buffer);
182 if (repeat_count == 2) {
183 char buffer[4] = {0};
184 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
mon);
185 result += std::string(buffer);
187 if (repeat_count == 3) {
188 result +=
to_str(
static_cast<Month>(dt.
mon), FormatType::UPPERCASE_NAME);
198 if (dt.
hour < 12) result +=
"AM";
202 if (dt.
hour < 12) result +=
"am";
206 if (repeat_count == 1) {
207 char buffer[16] = {0};
210 result += std::string(buffer);
216 if (repeat_count == 1) {
217 char buffer[8] = {0};
218 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d", dt.
hour, dt.
min);
219 result += std::string(buffer);
223 if (repeat_count == 1) {
224 result += std::to_string(
ts);
227 if (repeat_count == 3) {
228 result += std::to_string(dt.
ms);
233 if (repeat_count <= 2) {
234 char buffer[4] = {0};
235 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
sec);
236 result += std::string(buffer);
238 if (repeat_count == 3) {
239 result += std::to_string(dt.
ms);
244 if (repeat_count > 1)
break;
249 if (repeat_count == 1) {
250 char buffer[16] = {0};
251 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d", dt.
hour, dt.
min, dt.
sec);
252 result += std::string(buffer);
256 if (repeat_count == 1) {
260 result += std::to_string(dw);
271 if (repeat_count == 1) {
274 if (repeat_count == 3) {
280 if (repeat_count == 3) {
291 if (repeat_count == 1) {
292 result += std::to_string(dt.
year % 100);
296 if (repeat_count == 1) {
297 result += std::to_string(dt.
year);
299 if (repeat_count == 6) {
300 char buffer[32] = {0};
301 const int64_t mega_years = dt.
year / 1000000;
302 const int64_t millennia = (dt.
year - mega_years * 1000000) / 1000;
303 const int64_t centuries = dt.
year - mega_years * 1000000 - millennia * 1000;
306 snprintf(buffer,
sizeof(buffer),
"%lldM%lldK%.3lld", mega_years, std::abs(millennia), std::abs(centuries));
308 snprintf(buffer,
sizeof(buffer),
"%lldM%.3lld", mega_years, std::abs(centuries));
312 snprintf(buffer,
sizeof(buffer),
"%lldK%.3lld", millennia, std::abs(centuries));
314 snprintf(buffer,
sizeof(buffer),
"%.4lld", dt.
year);
316 result += std::string(buffer);
318 if (repeat_count == 4) {
319 char buffer[8] = {0};
320 snprintf(buffer,
sizeof(buffer),
"%.4d", (
int)(dt.
year % 10000));
321 result += std::string(buffer);
323 if (repeat_count == 2) {
324 char buffer[8] = {0};
325 snprintf(buffer,
sizeof(buffer),
"%.2d", (
int)(dt.
year % 100));
326 result += std::string(buffer);
331 if (repeat_count == 1) {
333 char buffer[16] = {0};
335 else snprintf(buffer,
sizeof(buffer),
"-%.2d%.2d", tz.
hour, tz.
min);
336 result += std::string(buffer);
377 template<
class T = ts_t>
379 const std::string& format_str,
381 tz_t utc_offset = 0) {
383 if (format_str.empty())
return result;
386 bool is_command =
false;
387 size_t repeat_count = 0;
388 char last_char = format_str[0];
389 if (last_char !=
'%') result += last_char;
390 for (
size_t i = 0; i < format_str.size(); ++i) {
391 const char& current_char = format_str[i];
393 if (current_char ==
'%') {
395 if (repeat_count == 2) {
396 result += current_char;
402 result += current_char;
405 last_char = current_char;
409 if (last_char == current_char) {
426 template<
class T = ts_t>
428 const std::string& format_str,
430 tz_t utc_offset = 0) {
460 template<
class T = ts_ms_t>
462 const std::string& format_str,
464 tz_t utc_offset = 0) {
466 if (format_str.empty())
return result;
469 bool is_command =
false;
470 size_t repeat_count = 0;
471 char last_char = format_str[0];
472 if (last_char !=
'%') result += last_char;
473 for (
size_t i = 0; i < format_str.size(); ++i) {
474 const char& current_char = format_str[i];
476 if (current_char ==
'%') {
478 if (repeat_count == 2) {
479 result += current_char;
485 result += current_char;
488 last_char = current_char;
492 if (last_char == current_char) {
509 template<
class T = ts_t>
511 const std::string& format_str,
513 tz_t utc_offset = 0) {
524 template<
class T = ts_t>
527 char buffer[32] = {0};
528 if TIME_SHIELD_IF_CONSTEXPR (std::is_floating_point<T>::value) {
529 snprintf(buffer,
sizeof(buffer),
"%lld-%.2d-%.2dT%.2d:%.2d:%.2d.%.3d", dt.
year, dt.
mon, dt.
day, dt.
hour, dt.
min, dt.
sec, dt.
ms);
531 snprintf(buffer,
sizeof(buffer),
"%lld-%.2d-%.2dT%.2d:%.2d:%.2d", dt.
year, dt.
mon, dt.
day, dt.
hour, dt.
min, dt.
sec);
533 return std::string(buffer);
543 template<
class T = ts_t>
546 char buffer[32] = {0};
547 snprintf(buffer,
sizeof(buffer),
"%lld-%.2d-%.2d", dt.
year, dt.
mon, dt.
day);
548 return std::string(buffer);
558 template<
class T = ts_t>
561 char buffer[32] = {0};
562 if TIME_SHIELD_IF_CONSTEXPR (std::is_floating_point<T>::value) {
563 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d.%.3d", dt.
hour, dt.
min, dt.
sec, dt.
ms);
565 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d", dt.
hour, dt.
min, dt.
sec);
567 return std::string(buffer);
577 template<
class T = ts_t>
580 char buffer[32] = {0};
581 if TIME_SHIELD_IF_CONSTEXPR (std::is_floating_point<T>::value) {
582 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d.%.3dZ", dt.
hour, dt.
min, dt.
sec, dt.
ms);
584 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2dZ", dt.
hour, dt.
min, dt.
sec);
586 return std::string(buffer);
596 template<
class T = ts_t>
599 char buffer[32] = {0};
600 if TIME_SHIELD_IF_CONSTEXPR (std::is_floating_point<T>::value) {
601 snprintf(buffer,
sizeof(buffer),
"%lld-%.2d-%.2dT%.2d:%.2d:%.2d.%.3dZ", dt.
year, dt.
mon, dt.
day, dt.
hour, dt.
min, dt.
sec, dt.
ms);
603 snprintf(buffer,
sizeof(buffer),
"%lld-%.2d-%.2dT%.2d:%.2d:%.2dZ", dt.
year, dt.
mon, dt.
day, dt.
hour, dt.
min, dt.
sec);
605 return std::string(buffer);
616 char buffer[32] = {0};
617 snprintf(buffer,
sizeof(buffer),
"%lld-%.2d-%.2dT%.2d:%.2d:%.2d.%.3dZ", dt.
year, dt.
mon, dt.
day, dt.
hour, dt.
min, dt.
sec, dt.
ms);
618 return std::string(buffer);
629 char buffer[32] = {0};
630 snprintf(buffer,
sizeof(buffer),
"%lld-%.2d-%.2dT%.2d:%.2d:%.2d.%.3d", dt.
year, dt.
mon, dt.
day, dt.
hour, dt.
min, dt.
sec, dt.
ms);
631 return std::string(buffer);
642 template<
class T = ts_t>
646 char buffer[32] = {0};
647 if TIME_SHIELD_IF_CONSTEXPR (std::is_floating_point<T>::value) {
649 snprintf(buffer,
sizeof(buffer),
"%lld-%.2d-%.2dT%.2d:%.2d:%.2d.%.3d+%.2d:%.2d", dt.
year, dt.
mon, dt.
day, dt.
hour, dt.
min, dt.
sec, dt.
ms, tz.
hour, tz.
min);
651 snprintf(buffer,
sizeof(buffer),
"%lld-%.2d-%.2dT%.2d:%.2d:%.2d.%.3d-%.2d:%.2d", dt.
year, dt.
mon, dt.
day, dt.
hour, dt.
min, dt.
sec, dt.
ms, tz.
hour, tz.
min);
655 snprintf(buffer,
sizeof(buffer),
"%lld-%.2d-%.2dT%.2d:%.2d:%.2d+%.2d:%.2d", dt.
year, dt.
mon, dt.
day, dt.
hour, dt.
min, dt.
sec, tz.
hour, tz.
min);
657 snprintf(buffer,
sizeof(buffer),
"%lld-%.2d-%.2dT%.2d:%.2d:%.2d-%.2d:%.2d", dt.
year, dt.
mon, dt.
day, dt.
hour, dt.
min, dt.
sec, tz.
hour, tz.
min);
660 return std::string(buffer);
673 char buffer[32] = {0};
675 snprintf(buffer,
sizeof(buffer),
"%lld-%.2d-%.2dT%.2d:%.2d:%.2d.%.3d+%.2d:%.2d", dt.
year, dt.
mon, dt.
day, dt.
hour, dt.
min, dt.
sec, dt.
ms, tz.
hour, tz.
min);
677 snprintf(buffer,
sizeof(buffer),
"%lld-%.2d-%.2dT%.2d:%.2d:%.2d.%.3d-%.2d:%.2d", dt.
year, dt.
mon, dt.
day, dt.
hour, dt.
min, dt.
sec, dt.
ms, tz.
hour, tz.
min);
679 return std::string(buffer);
690 char buffer[32] = {0};
691 snprintf(buffer,
sizeof(buffer),
"%lld.%.2d.%.2d %.2d:%.2d:%.2d", dt.
year, dt.
mon, dt.
day, dt.
hour, dt.
min, dt.
sec);
692 return std::string(buffer);
709 char buffer[32] = {0};
710 snprintf(buffer,
sizeof(buffer),
"%lld.%.2d.%.2d", dt.
year, dt.
mon, dt.
day);
711 return std::string(buffer);
722 char buffer[32] = {0};
723 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d", dt.
hour, dt.
min, dt.
sec);
724 return std::string(buffer);
732 char buffer[32] = {0};
733 snprintf(buffer,
sizeof(buffer),
"%lld-%.2d-%.2d_%.2d-%.2d-%.2d", dt.
year, dt.
mon, dt.
day, dt.
hour, dt.
min, dt.
sec);
734 return std::string(buffer);
742 char buffer[32] = {0};
743 snprintf(buffer,
sizeof(buffer),
"%lld-%.2d-%.2d_%.2d-%.2d-%.2d-%.3d", dt.
year, dt.
mon, dt.
day, dt.
hour, dt.
min, dt.
sec, dt.
ms);
744 return std::string(buffer);
752 char buffer[32] = {0};
753 snprintf(buffer,
sizeof(buffer),
"%lld-%.2d-%.2d %.2d:%.2d:%.2d", dt.
year, dt.
mon, dt.
day, dt.
hour, dt.
min, dt.
sec);
754 return std::string(buffer);
762 char buffer[32] = {0};
763 snprintf(buffer,
sizeof(buffer),
"%lld-%.2d-%.2d %.2d:%.2d:%.2d.%.3d", dt.
year, dt.
mon, dt.
day, dt.
hour, dt.
min, dt.
sec, dt.
ms);
764 return std::string(buffer);
Header for date and time structure and related functions.
TIME_SHIELD_CONSTEXPR ts_t timestamp(year_t year, int month, int day)
Alias for to_timestamp.
const T to_time_zone(tz_t offset)
Converts an integer to a time zone structure.
T to_date_time_ms(ts_ms_t ts)
Converts a timestamp in milliseconds to a date-time structure with milliseconds.
TIME_SHIELD_CONSTEXPR ts_t ts(year_t year, int month, int day)
Alias for to_timestamp.
constexpr const T1 day_of_week(year_t year, int month, int day)
Alias for day_of_week_date.
TIME_SHIELD_CONSTEXPR const T hour24_to_12(T hour) noexcept
Converts a 24-hour format hour to a 12-hour format.
constexpr ts_ms_t ts_ms(year_t year, int month, int day)
Alias for to_timestamp_ms.
T1 to_date_time(T2 ts)
Converts a timestamp to a date-time structure.
const T day_of_year(ts_t ts=time_shield::ts())
Get the day of the year.
const std::string & to_str(Weekday value, FormatType format=UPPERCASE_NAME)
Converts a Weekday enum value to a string.
const TimeZoneStruct to_time_zone_struct(tz_t offset)
Converts an integer to a TimeZoneStruct.
int64_t ts_t
Unix timestamp in seconds since 1970‑01‑01T00:00:00Z.
int32_t tz_t
Time zone offset in minutes from UTC (e.g., +180 = UTC+3).
int64_t ts_ms_t
Unix timestamp in milliseconds since epoch.
Main namespace for the Time Shield library.
Structure to represent date and time.
int ms
Millisecond component of time (0-999)
int hour
Hour component of time (0-23)
int64_t year
Year component of the date.
int day
Day component of the date (1-31).
int min
Minute component of time (0-59)
int mon
Month component of the date (1-12).
int sec
Second component of time (0-59)
Structure to represent time zone information.
int hour
Hour component of time (0-23)
int min
Minute component of time (0-59)
bool is_positive
True if the time zone offset is positive, false if negative.
Header file for time conversion functions.
Header for time zone structure and related functions.