3#ifndef _TIME_SHIELD_TIME_FORMATTING_HPP_INCLUDED
4#define _TIME_SHIELD_TIME_FORMATTING_HPP_INCLUDED
30 std::string& result) {
33 if (repeat_count > 1)
break;
37 if (repeat_count > 1)
break;
41 if (repeat_count == 1) {
44 result += std::string(buffer);
48 if (repeat_count <= 2) {
50 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
hour);
51 result += std::string(buffer);
55 if (repeat_count == 2) {
57 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
hour);
58 result += std::string(buffer);
63 if (repeat_count > 1)
break;
64 result +=
to_str(
static_cast<Month>(dt.
mon), FormatType::SHORT_NAME);
67 if (repeat_count > 1)
break;
68 result +=
to_str(
static_cast<Month>(dt.
mon), FormatType::FULL_NAME);
73 if (repeat_count <= 1){
77 result +=
to_str(
static_cast<Month>(dt.
mon), FormatType::SHORT_NAME);
80 std::fill(buffer, buffer +
sizeof(buffer),
'\0');
81 snprintf(buffer,
sizeof(buffer),
"%2d ", dt.
day);
82 result += std::string(buffer);
84 std::fill(buffer, buffer +
sizeof(buffer),
'\0');
85 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d ", dt.
hour, dt.
min, dt.
sec);
86 result += std::string(buffer);
88 result += std::to_string(dt.
year);
92 if (repeat_count > 1)
break;
93 result += std::to_string(dt.
year/100);
96 if (repeat_count < 2) {
98 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
day);
99 result += std::string(buffer);
103 if (repeat_count == 1) {
105 char buffer[16] = {0};
106 snprintf(buffer,
sizeof(buffer),
"%.2d/%.2d/%.2d", dt.
mon, dt.
day, (
int)(dt.
year % 100LL));
107 result += std::string(buffer);
109 if (repeat_count == 2) {
110 char buffer[4] = {0};
111 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
day);
112 result += std::string(buffer);
116 if (repeat_count == 1) {
117 char buffer[4] = {0};
118 snprintf(buffer,
sizeof(buffer),
"%2d", dt.
day);
119 result += std::string(buffer);
127 if (repeat_count == 1) {
129 char buffer[32] = {0};
130 if (dt.
year <= 9999 || dt.
year >= 0) {
131 snprintf(buffer,
sizeof(buffer),
"%.4d-%.2d-%.2d", (
int)dt.
year, dt.
mon, dt.
day);
134 snprintf(buffer,
sizeof(buffer),
"-%" PRId64
"-%.2d-%.2d", dt.
year, dt.
mon, dt.
day);
136 snprintf(buffer,
sizeof(buffer),
"+%" PRId64
"-%.2d-%.2d", dt.
year, dt.
mon, dt.
day);
138 result += std::string(buffer);
147 if (repeat_count == 1) {
148 char buffer[4] = {0};
150 result += std::string(buffer);
154 if (repeat_count == 1) {
155 char buffer[4] = {0};
156 snprintf(buffer,
sizeof(buffer),
"%2d", dt.
hour);
157 result += std::string(buffer);
161 if (repeat_count == 1) {
162 char buffer[4] = {0};
164 result += std::string(buffer);
168 if (repeat_count == 1) {
169 char buffer[4] = {0};
170 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
mon);
171 result += std::string(buffer);
173 if (repeat_count == 2) {
174 char buffer[4] = {0};
175 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
min);
176 result += std::string(buffer);
180 if (repeat_count == 1) {
181 char buffer[4] = {0};
182 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
min);
183 result += std::string(buffer);
185 if (repeat_count == 2) {
186 char buffer[4] = {0};
187 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
mon);
188 result += std::string(buffer);
190 if (repeat_count == 3) {
191 result +=
to_str(
static_cast<Month>(dt.
mon), FormatType::UPPERCASE_NAME);
201 if (dt.
hour < 12) result +=
"AM";
205 if (dt.
hour < 12) result +=
"am";
209 if (repeat_count == 1) {
210 char buffer[16] = {0};
213 result += std::string(buffer);
219 if (repeat_count == 1) {
220 char buffer[8] = {0};
221 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d", dt.
hour, dt.
min);
222 result += std::string(buffer);
226 if (repeat_count == 1) {
227 result += std::to_string(
ts);
230 if (repeat_count == 3) {
231 result += std::to_string(dt.
ms);
236 if (repeat_count <= 2) {
237 char buffer[4] = {0};
238 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
sec);
239 result += std::string(buffer);
241 if (repeat_count == 3) {
242 result += std::to_string(dt.
ms);
247 if (repeat_count > 1)
break;
252 if (repeat_count == 1) {
253 char buffer[16] = {0};
254 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d", dt.
hour, dt.
min, dt.
sec);
255 result += std::string(buffer);
259 if (repeat_count == 1) {
263 result += std::to_string(dw);
274 if (repeat_count == 1) {
277 if (repeat_count == 3) {
283 if (repeat_count == 3) {
294 if (repeat_count == 1) {
295 result += std::to_string(dt.
year % 100);
299 if (repeat_count == 1) {
300 result += std::to_string(dt.
year);
302 if (repeat_count == 6) {
303 char buffer[32] = {0};
304 const int64_t mega_years = dt.
year / 1000000;
305 const int64_t millennia = (dt.
year - mega_years * 1000000) / 1000;
306 const int64_t centuries = dt.
year - mega_years * 1000000 - millennia * 1000;
312 "%" PRId64
"M%" PRId64
"K%.3" PRId64,
314 static_cast<int64_t
>(std::abs(millennia)),
315 static_cast<int64_t
>(std::abs(centuries)));
320 "%" PRId64
"M%.3" PRId64,
322 static_cast<int64_t
>(std::abs(centuries)));
329 "%" PRId64
"K%.3" PRId64,
331 static_cast<int64_t
>(std::abs(centuries)));
333 snprintf(buffer,
sizeof(buffer),
"%.4" PRId64, dt.
year);
335 result += std::string(buffer);
337 if (repeat_count == 4) {
338 char buffer[8] = {0};
339 snprintf(buffer,
sizeof(buffer),
"%.4d", (
int)(dt.
year % 10000));
340 result += std::string(buffer);
342 if (repeat_count == 2) {
343 char buffer[8] = {0};
344 snprintf(buffer,
sizeof(buffer),
"%.2d", (
int)(dt.
year % 100));
345 result += std::string(buffer);
350 if (repeat_count == 1) {
352 char buffer[16] = {0};
354 else snprintf(buffer,
sizeof(buffer),
"-%.2d%.2d", tz.
hour, tz.
min);
355 result += std::string(buffer);
396 template<
class T = ts_t>
398 const std::string& format_str,
400 tz_t utc_offset = 0) {
402 if (format_str.empty())
return result;
405 bool is_command =
false;
406 size_t repeat_count = 0;
407 char last_char = format_str[0];
408 if (last_char !=
'%') result += last_char;
409 for (
size_t i = 0; i < format_str.size(); ++i) {
410 const char& current_char = format_str[i];
412 if (current_char ==
'%') {
414 if (repeat_count == 2) {
415 result += current_char;
421 result += current_char;
424 last_char = current_char;
428 if (last_char == current_char) {
445 template<
class T = ts_t>
447 const std::string& format_str,
449 tz_t utc_offset = 0) {
479 template<
class T = ts_ms_t>
481 const std::string& format_str,
483 tz_t utc_offset = 0) {
485 if (format_str.empty())
return result;
488 bool is_command =
false;
489 size_t repeat_count = 0;
490 char last_char = format_str[0];
491 if (last_char !=
'%') result += last_char;
492 for (
size_t i = 0; i < format_str.size(); ++i) {
493 const char& current_char = format_str[i];
495 if (current_char ==
'%') {
497 if (repeat_count == 2) {
498 result += current_char;
504 result += current_char;
507 last_char = current_char;
511 if (last_char == current_char) {
528 template<
class T = ts_t>
530 const std::string& format_str,
532 tz_t utc_offset = 0) {
543 template<
class T = ts_t>
546 char buffer[32] = {0};
547 if TIME_SHIELD_IF_CONSTEXPR (std::is_floating_point<T>::value) {
551 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d.%.3d",
563 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d",
571 return std::string(buffer);
581 template<
class T = ts_t>
584 char buffer[32] = {0};
588 "%" PRId64
"-%.2d-%.2d",
592 return std::string(buffer);
602 template<
class T = ts_t>
605 char buffer[32] = {0};
606 if TIME_SHIELD_IF_CONSTEXPR (std::is_floating_point<T>::value) {
607 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d.%.3d", dt.
hour, dt.
min, dt.
sec, dt.
ms);
609 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d", dt.
hour, dt.
min, dt.
sec);
611 return std::string(buffer);
621 template<
class T = ts_t>
624 char buffer[32] = {0};
625 if TIME_SHIELD_IF_CONSTEXPR (std::is_floating_point<T>::value) {
626 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d.%.3dZ", dt.
hour, dt.
min, dt.
sec, dt.
ms);
628 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2dZ", dt.
hour, dt.
min, dt.
sec);
630 return std::string(buffer);
640 template<
class T = ts_t>
643 char buffer[32] = {0};
644 if TIME_SHIELD_IF_CONSTEXPR (std::is_floating_point<T>::value) {
648 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d.%.3dZ",
660 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2dZ",
668 return std::string(buffer);
679 char buffer[32] = {0};
683 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d.%.3dZ",
691 return std::string(buffer);
702 char buffer[32] = {0};
706 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d.%.3d",
714 return std::string(buffer);
725 template<
class T = ts_t>
729 char buffer[32] = {0};
730 if TIME_SHIELD_IF_CONSTEXPR (std::is_floating_point<T>::value) {
735 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d.%.3d+%.2d:%.2d",
749 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d.%.3d-%.2d:%.2d",
765 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d+%.2d:%.2d",
778 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d-%.2d:%.2d",
789 return std::string(buffer);
802 char buffer[32] = {0};
807 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d.%.3d+%.2d:%.2d",
821 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d.%.3d-%.2d:%.2d",
832 return std::string(buffer);
843 char buffer[32] = {0};
847 "%" PRId64
".%.2d.%.2d %.2d:%.2d:%.2d",
854 return std::string(buffer);
871 char buffer[32] = {0};
875 "%" PRId64
".%.2d.%.2d",
879 return std::string(buffer);
890 char buffer[32] = {0};
891 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d", dt.
hour, dt.
min, dt.
sec);
892 return std::string(buffer);
900 char buffer[32] = {0};
904 "%" PRId64
"-%.2d-%.2d_%.2d-%.2d-%.2d",
911 return std::string(buffer);
919 char buffer[32] = {0};
923 "%" PRId64
"-%.2d-%.2d_%.2d-%.2d-%.2d-%.3d",
931 return std::string(buffer);
939 char buffer[32] = {0};
943 "%" PRId64
"-%.2d-%.2d %.2d:%.2d:%.2d",
950 return std::string(buffer);
958 char buffer[32] = {0};
962 "%" PRId64
"-%.2d-%.2d %.2d:%.2d:%.2d.%.3d",
970 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.