3#ifndef _TIME_SHIELD_TIME_FORMATTING_HPP_INCLUDED
4#define _TIME_SHIELD_TIME_FORMATTING_HPP_INCLUDED
31 std::string& result) {
34 if (repeat_count > 1)
break;
38 if (repeat_count > 1)
break;
42 if (repeat_count == 1) {
45 result += std::string(buffer);
49 if (repeat_count <= 2) {
51 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
hour);
52 result += std::string(buffer);
56 if (repeat_count == 2) {
58 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
hour);
59 result += std::string(buffer);
66 if (repeat_count > 1)
break;
67 result +=
to_str(
static_cast<Month>(dt.
mon), FormatType::SHORT_NAME);
70 if (repeat_count > 1)
break;
71 result +=
to_str(
static_cast<Month>(dt.
mon), FormatType::FULL_NAME);
76 if (repeat_count <= 1){
80 result +=
to_str(
static_cast<Month>(dt.
mon), FormatType::SHORT_NAME);
83 std::fill(buffer, buffer +
sizeof(buffer),
'\0');
84 snprintf(buffer,
sizeof(buffer),
"%2d ", dt.
day);
85 result += std::string(buffer);
87 std::fill(buffer, buffer +
sizeof(buffer),
'\0');
88 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d ", dt.
hour, dt.
min, dt.
sec);
89 result += std::string(buffer);
91 result += std::to_string(dt.
year);
95 if (repeat_count > 1)
break;
96 result += std::to_string(dt.
year/100);
99 if (repeat_count < 2) {
100 char buffer[4] = {0};
101 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
day);
102 result += std::string(buffer);
106 if (repeat_count == 1) {
108 char buffer[16] = {0};
109 snprintf(buffer,
sizeof(buffer),
"%.2d/%.2d/%.2d", dt.
mon, dt.
day, (
int)(dt.
year % 100LL));
110 result += std::string(buffer);
112 if (repeat_count == 2) {
113 char buffer[4] = {0};
114 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
day);
115 result += std::string(buffer);
119 if (repeat_count == 1) {
120 char buffer[4] = {0};
121 snprintf(buffer,
sizeof(buffer),
"%2d", dt.
day);
122 result += std::string(buffer);
130 if (repeat_count == 1) {
132 char buffer[32] = {0};
133 if (dt.
year <= 9999 && dt.
year >= 0) {
134 snprintf(buffer,
sizeof(buffer),
"%.4d-%.2d-%.2d", (
int)dt.
year, dt.
mon, dt.
day);
137 snprintf(buffer,
sizeof(buffer),
"-%" PRId64
"-%.2d-%.2d", dt.
year, dt.
mon, dt.
day);
139 snprintf(buffer,
sizeof(buffer),
"+%" PRId64
"-%.2d-%.2d", dt.
year, dt.
mon, dt.
day);
141 result += std::string(buffer);
150 if (repeat_count == 1) {
151 char buffer[4] = {0};
153 result += std::string(buffer);
157 if (repeat_count == 1) {
158 char buffer[4] = {0};
159 snprintf(buffer,
sizeof(buffer),
"%2d", dt.
hour);
160 result += std::string(buffer);
164 if (repeat_count == 1) {
165 char buffer[4] = {0};
167 result += std::string(buffer);
171 if (repeat_count == 1) {
172 char buffer[4] = {0};
173 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
mon);
174 result += std::string(buffer);
176 if (repeat_count == 2) {
177 char buffer[4] = {0};
178 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
min);
179 result += std::string(buffer);
183 if (repeat_count == 1) {
184 char buffer[4] = {0};
185 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
min);
186 result += std::string(buffer);
188 if (repeat_count == 2) {
189 char buffer[4] = {0};
190 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
mon);
191 result += std::string(buffer);
193 if (repeat_count == 3) {
194 result +=
to_str(
static_cast<Month>(dt.
mon), FormatType::UPPERCASE_NAME);
204 if (dt.
hour < 12) result +=
"AM";
208 if (dt.
hour < 12) result +=
"am";
212 if (repeat_count == 1) {
213 char buffer[16] = {0};
216 result += std::string(buffer);
222 if (repeat_count == 1) {
223 char buffer[8] = {0};
224 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d", dt.
hour, dt.
min);
225 result += std::string(buffer);
229 if (repeat_count == 1) {
230 result += std::to_string(
ts);
233 if (repeat_count == 3) {
234 result += std::to_string(dt.
ms);
241 if (repeat_count <= 2) {
242 char buffer[4] = {0};
243 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
sec);
244 result += std::string(buffer);
246 if (repeat_count == 3) {
247 result += std::to_string(dt.
ms);
252 if (repeat_count > 1)
break;
257 if (repeat_count == 1) {
258 char buffer[16] = {0};
259 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d", dt.
hour, dt.
min, dt.
sec);
260 result += std::string(buffer);
264 if (repeat_count == 1) {
268 result += std::to_string(dw);
279 if (repeat_count == 1) {
282 if (repeat_count == 3) {
288 if (repeat_count == 3) {
299 if (repeat_count == 1) {
300 result += std::to_string(dt.
year % 100);
304 if (repeat_count == 1) {
305 result += std::to_string(dt.
year);
307 if (repeat_count == 6) {
308 char buffer[32] = {0};
309 const int64_t mega_years = dt.
year / 1000000;
310 const int64_t millennia = (dt.
year - mega_years * 1000000) / 1000;
311 const int64_t centuries = dt.
year - mega_years * 1000000 - millennia * 1000;
317 "%" PRId64
"M%" PRId64
"K%.3" PRId64,
319 static_cast<int64_t
>(std::abs(millennia)),
320 static_cast<int64_t
>(std::abs(centuries)));
325 "%" PRId64
"M%.3" PRId64,
327 static_cast<int64_t
>(std::abs(centuries)));
334 "%" PRId64
"K%.3" PRId64,
336 static_cast<int64_t
>(std::abs(centuries)));
338 snprintf(buffer,
sizeof(buffer),
"%.4" PRId64, dt.
year);
340 result += std::string(buffer);
342 if (repeat_count == 4) {
343 char buffer[8] = {0};
344 snprintf(buffer,
sizeof(buffer),
"%.4d", (
int)(dt.
year % 10000));
345 result += std::string(buffer);
347 if (repeat_count == 2) {
348 char buffer[8] = {0};
349 snprintf(buffer,
sizeof(buffer),
"%.2d", (
int)(dt.
year % 100));
350 result += std::string(buffer);
355 if (repeat_count == 1) {
357 char buffer[16] = {0};
359 else snprintf(buffer,
sizeof(buffer),
"-%.2d%.2d", tz.
hour, tz.
min);
360 result += std::string(buffer);
401 template<
class T = ts_t>
403 const std::string& format_str,
405 tz_t utc_offset = 0) {
407 if (format_str.empty())
return result;
410 bool is_command =
false;
411 size_t repeat_count = 0;
412 char last_char = format_str[0];
413 if (last_char !=
'%') result += last_char;
414 for (
size_t i = 0; i < format_str.size(); ++i) {
415 const char& current_char = format_str[i];
417 if (current_char ==
'%') {
419 if (repeat_count == 2) {
420 result += current_char;
426 result += current_char;
429 last_char = current_char;
433 if (last_char == current_char) {
450 template<
class T = ts_t>
452 const std::string& format_str,
454 tz_t utc_offset = 0) {
484 template<
class T = ts_ms_t>
486 const std::string& format_str,
488 tz_t utc_offset = 0) {
490 if (format_str.empty())
return result;
493 bool is_command =
false;
494 size_t repeat_count = 0;
495 char last_char = format_str[0];
496 if (last_char !=
'%') result += last_char;
497 for (
size_t i = 0; i < format_str.size(); ++i) {
498 const char& current_char = format_str[i];
500 if (current_char ==
'%') {
502 if (repeat_count == 2) {
503 result += current_char;
509 result += current_char;
512 last_char = current_char;
516 if (last_char == current_char) {
533 template<
class T = ts_t>
535 const std::string& format_str,
537 tz_t utc_offset = 0) {
548 template<
class T = ts_t>
551 char buffer[32] = {0};
552 if TIME_SHIELD_IF_CONSTEXPR (std::is_floating_point<T>::value) {
556 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d.%.3d",
568 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d",
576 return std::string(buffer);
586 template<
class T = ts_t>
589 char buffer[32] = {0};
593 "%" PRId64
"-%.2d-%.2d",
597 return std::string(buffer);
607 template<
class T = ts_t>
610 char buffer[32] = {0};
611 if TIME_SHIELD_IF_CONSTEXPR (std::is_floating_point<T>::value) {
612 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d.%.3d", dt.
hour, dt.
min, dt.
sec, dt.
ms);
614 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d", dt.
hour, dt.
min, dt.
sec);
616 return std::string(buffer);
626 template<
class T = ts_t>
629 char buffer[32] = {0};
630 if TIME_SHIELD_IF_CONSTEXPR (std::is_floating_point<T>::value) {
631 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d.%.3dZ", dt.
hour, dt.
min, dt.
sec, dt.
ms);
633 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2dZ", dt.
hour, dt.
min, dt.
sec);
635 return std::string(buffer);
645 template<
class T = ts_t>
648 char buffer[32] = {0};
649 if TIME_SHIELD_IF_CONSTEXPR (std::is_floating_point<T>::value) {
653 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d.%.3dZ",
665 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2dZ",
673 return std::string(buffer);
684 char buffer[32] = {0};
688 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d.%.3dZ",
696 return std::string(buffer);
707 char buffer[32] = {0};
711 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d.%.3d",
719 return std::string(buffer);
730 template<
class T = ts_t>
734 char buffer[32] = {0};
735 if TIME_SHIELD_IF_CONSTEXPR (std::is_floating_point<T>::value) {
740 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d.%.3d+%.2d:%.2d",
754 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d.%.3d-%.2d:%.2d",
770 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d+%.2d:%.2d",
783 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d-%.2d:%.2d",
794 return std::string(buffer);
807 char buffer[32] = {0};
812 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d.%.3d+%.2d:%.2d",
826 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d.%.3d-%.2d:%.2d",
837 return std::string(buffer);
848 char buffer[32] = {0};
852 "%" PRId64
".%.2d.%.2d %.2d:%.2d:%.2d",
859 return std::string(buffer);
876 char buffer[32] = {0};
880 "%" PRId64
".%.2d.%.2d",
884 return std::string(buffer);
895 char buffer[32] = {0};
896 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d", dt.
hour, dt.
min, dt.
sec);
897 return std::string(buffer);
905 char buffer[32] = {0};
909 "%" PRId64
"-%.2d-%.2d_%.2d-%.2d-%.2d",
916 return std::string(buffer);
924 char buffer[32] = {0};
928 "%" PRId64
"-%.2d-%.2d_%.2d-%.2d-%.2d-%.3d",
936 return std::string(buffer);
944 char buffer[32] = {0};
948 "%" PRId64
"-%.2d-%.2d %.2d:%.2d:%.2d",
955 return std::string(buffer);
963 char buffer[32] = {0};
967 "%" PRId64
"-%.2d-%.2d %.2d:%.2d:%.2d.%.3d",
975 return std::string(buffer);
Configuration macros for the library.
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.
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.
TIME_SHIELD_CONSTEXPR ts_ms_t ts_ms(year_t year, int month, int day)
Alias for to_timestamp_ms.
constexpr T1 day_of_week(year_t year, int month, int day)
Alias for day_of_week_date.
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.
T to_date_time_ms(ts_ms_t ts)
Converts a timestamp in milliseconds to a date-time structure with milliseconds.
T day_of_year(ts_t ts=time_shield::ts())
Get the day of the year.
T1 to_date_time(T2 ts)
Converts a timestamp to a date-time structure.
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.
Umbrella header for time conversion functions.
Header for time zone structure and related functions.