3#ifndef _TIME_SHIELD_TIME_FORMATTING_HPP_INCLUDED
4#define _TIME_SHIELD_TIME_FORMATTING_HPP_INCLUDED
28 std::string& result) {
31 if (repeat_count > 1)
break;
35 if (repeat_count > 1)
break;
39 if (repeat_count == 1) {
42 result += std::string(buffer);
46 if (repeat_count <= 2) {
48 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
hour);
49 result += std::string(buffer);
53 if (repeat_count == 2) {
55 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
hour);
56 result += std::string(buffer);
61 if (repeat_count > 1)
break;
62 result +=
to_str(
static_cast<Month>(dt.
mon), FormatType::SHORT_NAME);
65 if (repeat_count > 1)
break;
66 result +=
to_str(
static_cast<Month>(dt.
mon), FormatType::FULL_NAME);
71 if (repeat_count <= 1){
75 result +=
to_str(
static_cast<Month>(dt.
mon), FormatType::SHORT_NAME);
78 std::fill(buffer, buffer +
sizeof(buffer),
'\0');
79 snprintf(buffer,
sizeof(buffer),
"%2d ", dt.
day);
80 result += std::string(buffer);
82 std::fill(buffer, buffer +
sizeof(buffer),
'\0');
83 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d ", dt.
hour, dt.
min, dt.
sec);
84 result += std::string(buffer);
86 result += std::to_string(dt.
year);
90 if (repeat_count > 1)
break;
91 result += std::to_string(dt.
year/100);
94 if (repeat_count < 2) {
96 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
day);
97 result += std::string(buffer);
101 if (repeat_count == 1) {
103 char buffer[16] = {0};
104 snprintf(buffer,
sizeof(buffer),
"%.2d/%.2d/%.2d", dt.
mon, dt.
day, (
int)(dt.
year % 100LL));
105 result += std::string(buffer);
107 if (repeat_count == 2) {
108 char buffer[4] = {0};
109 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
day);
110 result += std::string(buffer);
114 if (repeat_count == 1) {
115 char buffer[4] = {0};
116 snprintf(buffer,
sizeof(buffer),
"%2d", dt.
day);
117 result += std::string(buffer);
125 if (repeat_count == 1) {
127 char buffer[32] = {0};
128 if (dt.
year <= 9999 || dt.
year >= 0) {
129 snprintf(buffer,
sizeof(buffer),
"%.4d-%.2d-%.2d", (
int)dt.
year, dt.
mon, dt.
day);
132 snprintf(buffer,
sizeof(buffer),
"-%lld-%.2d-%.2d", dt.
year, dt.
mon, dt.
day);
134 snprintf(buffer,
sizeof(buffer),
"+%lld-%.2d-%.2d", dt.
year, dt.
mon, dt.
day);
136 result += std::string(buffer);
145 if (repeat_count == 1) {
146 char buffer[4] = {0};
148 result += std::string(buffer);
152 if (repeat_count == 1) {
153 char buffer[4] = {0};
154 snprintf(buffer,
sizeof(buffer),
"%2d", dt.
hour);
155 result += std::string(buffer);
159 if (repeat_count == 1) {
160 char buffer[4] = {0};
162 result += std::string(buffer);
166 if (repeat_count == 1) {
167 char buffer[4] = {0};
168 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
mon);
169 result += std::string(buffer);
171 if (repeat_count == 2) {
172 char buffer[4] = {0};
173 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
min);
174 result += std::string(buffer);
178 if (repeat_count == 1) {
179 char buffer[4] = {0};
180 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
min);
181 result += std::string(buffer);
183 if (repeat_count == 2) {
184 char buffer[4] = {0};
185 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
mon);
186 result += std::string(buffer);
188 if (repeat_count == 3) {
189 result +=
to_str(
static_cast<Month>(dt.
mon), FormatType::UPPERCASE_NAME);
199 if (dt.
hour < 12) result +=
"AM";
203 if (dt.
hour < 12) result +=
"am";
207 if (repeat_count == 1) {
208 char buffer[16] = {0};
211 result += std::string(buffer);
217 if (repeat_count == 1) {
218 char buffer[8] = {0};
219 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d", dt.
hour, dt.
min);
220 result += std::string(buffer);
224 if (repeat_count == 1) {
225 result += std::to_string(
ts);
228 if (repeat_count == 3) {
229 result += std::to_string(dt.
ms);
234 if (repeat_count <= 2) {
235 char buffer[4] = {0};
236 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
sec);
237 result += std::string(buffer);
239 if (repeat_count == 3) {
240 result += std::to_string(dt.
ms);
245 if (repeat_count > 1)
break;
250 if (repeat_count == 1) {
251 char buffer[16] = {0};
252 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d", dt.
hour, dt.
min, dt.
sec);
253 result += std::string(buffer);
257 if (repeat_count == 1) {
261 result += std::to_string(dw);
272 if (repeat_count == 1) {
275 if (repeat_count == 3) {
281 if (repeat_count == 3) {
292 if (repeat_count == 1) {
293 result += std::to_string(dt.
year % 100);
297 if (repeat_count == 1) {
298 result += std::to_string(dt.
year);
300 if (repeat_count == 6) {
301 char buffer[32] = {0};
302 const int64_t mega_years = dt.
year / 1000000;
303 const int64_t millennia = (dt.
year - mega_years * 1000000) / 1000;
304 const int64_t centuries = dt.
year - mega_years * 1000000 - millennia * 1000;
307 snprintf(buffer,
sizeof(buffer),
"%lldM%lldK%.3lld", mega_years, std::abs(millennia), std::abs(centuries));
309 snprintf(buffer,
sizeof(buffer),
"%lldM%.3lld", mega_years, std::abs(centuries));
313 snprintf(buffer,
sizeof(buffer),
"%lldK%.3lld", millennia, std::abs(centuries));
315 snprintf(buffer,
sizeof(buffer),
"%.4lld", dt.
year);
317 result += std::string(buffer);
319 if (repeat_count == 4) {
320 char buffer[8] = {0};
321 snprintf(buffer,
sizeof(buffer),
"%.4d", (
int)(dt.
year % 10000));
322 result += std::string(buffer);
324 if (repeat_count == 2) {
325 char buffer[8] = {0};
326 snprintf(buffer,
sizeof(buffer),
"%.2d", (
int)(dt.
year % 100));
327 result += std::string(buffer);
332 if (repeat_count == 1) {
334 char buffer[16] = {0};
336 else snprintf(buffer,
sizeof(buffer),
"-%.2d%.2d", tz.
hour, tz.
min);
337 result += std::string(buffer);
378 template<
class T = ts_t>
380 const std::string& format_str,
382 tz_t utc_offset = 0) {
384 if (format_str.empty())
return result;
387 bool is_command =
false;
388 size_t repeat_count = 0;
389 char last_char = format_str[0];
390 if (last_char !=
'%') result += last_char;
391 for (
size_t i = 0; i < format_str.size(); ++i) {
392 const char& current_char = format_str[i];
394 if (current_char ==
'%') {
396 if (repeat_count == 2) {
397 result += current_char;
403 result += current_char;
406 last_char = current_char;
410 if (last_char == current_char) {
427 template<
class T = ts_t>
429 const std::string& format_str,
431 tz_t utc_offset = 0) {
461 template<
class T = ts_ms_t>
463 const std::string& format_str,
465 tz_t utc_offset = 0) {
467 if (format_str.empty())
return result;
470 bool is_command =
false;
471 size_t repeat_count = 0;
472 char last_char = format_str[0];
473 if (last_char !=
'%') result += last_char;
474 for (
size_t i = 0; i < format_str.size(); ++i) {
475 const char& current_char = format_str[i];
477 if (current_char ==
'%') {
479 if (repeat_count == 2) {
480 result += current_char;
486 result += current_char;
489 last_char = current_char;
493 if (last_char == current_char) {
510 template<
class T = ts_t>
512 const std::string& format_str,
514 tz_t utc_offset = 0) {
525 template<
class T = ts_t>
528 char buffer[32] = {0};
529 if TIME_SHIELD_IF_CONSTEXPR (std::is_floating_point<T>::value) {
530 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);
532 snprintf(buffer,
sizeof(buffer),
"%lld-%.2d-%.2dT%.2d:%.2d:%.2d", dt.
year, dt.
mon, dt.
day, dt.
hour, dt.
min, dt.
sec);
534 return std::string(buffer);
544 template<
class T = ts_t>
547 char buffer[32] = {0};
548 snprintf(buffer,
sizeof(buffer),
"%lld-%.2d-%.2d", dt.
year, dt.
mon, dt.
day);
549 return std::string(buffer);
559 template<
class T = ts_t>
562 char buffer[32] = {0};
563 if TIME_SHIELD_IF_CONSTEXPR (std::is_floating_point<T>::value) {
564 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d.%.3d", dt.
hour, dt.
min, dt.
sec, dt.
ms);
566 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d", dt.
hour, dt.
min, dt.
sec);
568 return std::string(buffer);
578 template<
class T = ts_t>
581 char buffer[32] = {0};
582 if TIME_SHIELD_IF_CONSTEXPR (std::is_floating_point<T>::value) {
583 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d.%.3dZ", dt.
hour, dt.
min, dt.
sec, dt.
ms);
585 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2dZ", dt.
hour, dt.
min, dt.
sec);
587 return std::string(buffer);
597 template<
class T = ts_t>
600 char buffer[32] = {0};
601 if TIME_SHIELD_IF_CONSTEXPR (std::is_floating_point<T>::value) {
602 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);
604 snprintf(buffer,
sizeof(buffer),
"%lld-%.2d-%.2dT%.2d:%.2d:%.2dZ", dt.
year, dt.
mon, dt.
day, dt.
hour, dt.
min, dt.
sec);
606 return std::string(buffer);
617 char buffer[32] = {0};
618 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);
619 return std::string(buffer);
630 char buffer[32] = {0};
631 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);
632 return std::string(buffer);
643 template<
class T = ts_t>
647 char buffer[32] = {0};
648 if TIME_SHIELD_IF_CONSTEXPR (std::is_floating_point<T>::value) {
650 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);
652 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);
656 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);
658 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);
661 return std::string(buffer);
674 char buffer[32] = {0};
676 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);
678 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);
680 return std::string(buffer);
691 char buffer[32] = {0};
692 snprintf(buffer,
sizeof(buffer),
"%lld.%.2d.%.2d %.2d:%.2d:%.2d", dt.
year, dt.
mon, dt.
day, dt.
hour, dt.
min, dt.
sec);
693 return std::string(buffer);
710 char buffer[32] = {0};
711 snprintf(buffer,
sizeof(buffer),
"%lld.%.2d.%.2d", dt.
year, dt.
mon, dt.
day);
712 return std::string(buffer);
723 char buffer[32] = {0};
724 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d", dt.
hour, dt.
min, dt.
sec);
725 return std::string(buffer);
733 char buffer[32] = {0};
734 snprintf(buffer,
sizeof(buffer),
"%lld-%.2d-%.2d_%.2d-%.2d-%.2d", dt.
year, dt.
mon, dt.
day, dt.
hour, dt.
min, dt.
sec);
735 return std::string(buffer);
743 char buffer[32] = {0};
744 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);
745 return std::string(buffer);
753 char buffer[32] = {0};
754 snprintf(buffer,
sizeof(buffer),
"%lld-%.2d-%.2d %.2d:%.2d:%.2d", dt.
year, dt.
mon, dt.
day, dt.
hour, dt.
min, dt.
sec);
755 return std::string(buffer);
763 char buffer[32] = {0};
764 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);
765 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.
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.
TIME_SHIELD_CONSTEXPR T hour24_to_12(T hour) noexcept
Converts a 24-hour format hour to a 12-hour format.
T to_time_zone(tz_t offset)
Converts an integer to a time zone structure.
T day_of_year(ts_t ts=time_shield::ts())
Get the day of the year.
constexpr T1 day_of_week(year_t year, int month, int day)
Alias for day_of_week_date.
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 std::string & to_str(Weekday value, FormatType format=UPPERCASE_NAME)
Converts a Weekday enum value to a string.
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.