3#ifndef TIME_SHIELD_HEADER_TEXT_TIME_FORMATTING_HPP_INCLUDED
4#define TIME_SHIELD_HEADER_TEXT_TIME_FORMATTING_HPP_INCLUDED
29 std::string& result) {
32 if (repeat_count > 1)
break;
36 if (repeat_count > 1)
break;
40 if (repeat_count == 1) {
43 result += std::string(buffer);
47 if (repeat_count <= 2) {
49 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
hour);
50 result += std::string(buffer);
54 if (repeat_count == 2) {
56 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
hour);
57 result += std::string(buffer);
64 if (repeat_count > 1)
break;
65 result +=
to_str(
static_cast<Month>(dt.
mon), FormatType::SHORT_NAME);
68 if (repeat_count > 1)
break;
69 result +=
to_str(
static_cast<Month>(dt.
mon), FormatType::FULL_NAME);
74 if (repeat_count <= 1){
78 result +=
to_str(
static_cast<Month>(dt.
mon), FormatType::SHORT_NAME);
81 std::fill(buffer, buffer +
sizeof(buffer),
'\0');
82 snprintf(buffer,
sizeof(buffer),
"%2d ", dt.
day);
83 result += std::string(buffer);
85 std::fill(buffer, buffer +
sizeof(buffer),
'\0');
86 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d ", dt.
hour, dt.
min, dt.
sec);
87 result += std::string(buffer);
89 result += std::to_string(dt.
year);
93 if (repeat_count > 1)
break;
94 result += std::to_string(dt.
year/100);
97 if (repeat_count < 2) {
99 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
day);
100 result += std::string(buffer);
104 if (repeat_count == 1) {
106 char buffer[16] = {0};
107 snprintf(buffer,
sizeof(buffer),
"%.2d/%.2d/%.2d", dt.
mon, dt.
day, (
int)(dt.
year % 100LL));
108 result += std::string(buffer);
110 if (repeat_count == 2) {
111 char buffer[4] = {0};
112 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
day);
113 result += std::string(buffer);
117 if (repeat_count == 1) {
118 char buffer[4] = {0};
119 snprintf(buffer,
sizeof(buffer),
"%2d", dt.
day);
120 result += std::string(buffer);
128 if (repeat_count == 1) {
130 char buffer[32] = {0};
131 if (dt.
year <= 9999 && dt.
year >= 0) {
132 snprintf(buffer,
sizeof(buffer),
"%.4d-%.2d-%.2d", (
int)dt.
year, dt.
mon, dt.
day);
135 snprintf(buffer,
sizeof(buffer),
"-%" PRId64
"-%.2d-%.2d", dt.
year, dt.
mon, dt.
day);
137 snprintf(buffer,
sizeof(buffer),
"+%" PRId64
"-%.2d-%.2d", dt.
year, dt.
mon, dt.
day);
139 result += std::string(buffer);
144 if (repeat_count == 1) {
146 const int two_digit_year =
static_cast<int>(iso_week.
year % 100);
147 char buffer[4] = {0};
148 snprintf(buffer,
sizeof(buffer),
"%.2d", two_digit_year < 0 ? -two_digit_year : two_digit_year);
149 result += std::string(buffer);
154 if (repeat_count == 1) {
156 result += std::to_string(iso_week.
year);
160 if (repeat_count == 1) {
161 char buffer[4] = {0};
163 result += std::string(buffer);
167 if (repeat_count == 1) {
168 char buffer[4] = {0};
169 snprintf(buffer,
sizeof(buffer),
"%2d", dt.
hour);
170 result += std::string(buffer);
174 if (repeat_count == 1) {
175 char buffer[4] = {0};
177 result += std::string(buffer);
181 if (repeat_count == 1) {
182 char buffer[4] = {0};
183 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
mon);
184 result += std::string(buffer);
186 if (repeat_count == 2) {
187 char buffer[4] = {0};
188 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
min);
189 result += std::string(buffer);
193 if (repeat_count == 1) {
194 char buffer[4] = {0};
195 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
min);
196 result += std::string(buffer);
198 if (repeat_count == 2) {
199 char buffer[4] = {0};
200 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
mon);
201 result += std::string(buffer);
203 if (repeat_count == 3) {
204 result +=
to_str(
static_cast<Month>(dt.
mon), FormatType::UPPERCASE_NAME);
214 if (dt.
hour < 12) result +=
"AM";
218 if (dt.
hour < 12) result +=
"am";
222 if (repeat_count == 1) {
223 char buffer[16] = {0};
226 result += std::string(buffer);
232 if (repeat_count == 1) {
233 char buffer[8] = {0};
234 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d", dt.
hour, dt.
min);
235 result += std::string(buffer);
239 if (repeat_count == 1) {
240 result += std::to_string(
ts);
243 if (repeat_count == 3) {
244 result += std::to_string(dt.
ms);
251 if (repeat_count <= 2) {
252 char buffer[4] = {0};
253 snprintf(buffer,
sizeof(buffer),
"%.2d", dt.
sec);
254 result += std::string(buffer);
256 if (repeat_count == 3) {
257 result += std::to_string(dt.
ms);
262 if (repeat_count > 1)
break;
267 if (repeat_count == 1) {
268 char buffer[16] = {0};
269 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d", dt.
hour, dt.
min, dt.
sec);
270 result += std::string(buffer);
274 if (repeat_count == 1) {
278 result += std::to_string(dw);
286 if (repeat_count == 1) {
288 char buffer[4] = {0};
289 snprintf(buffer,
sizeof(buffer),
"%.2d", iso_week.
week);
290 result += std::string(buffer);
295 if (repeat_count == 1) {
298 if (repeat_count == 3) {
304 if (repeat_count == 3) {
315 if (repeat_count == 1) {
316 result += std::to_string(dt.
year % 100);
320 if (repeat_count == 1) {
321 result += std::to_string(dt.
year);
323 if (repeat_count == 6) {
324 char buffer[32] = {0};
325 const int64_t mega_years = dt.
year / 1000000;
326 const int64_t millennia = (dt.
year - mega_years * 1000000) / 1000;
327 const int64_t centuries = dt.
year - mega_years * 1000000 - millennia * 1000;
333 "%" PRId64
"M%" PRId64
"K%.3" PRId64,
335 static_cast<int64_t
>(std::abs(millennia)),
336 static_cast<int64_t
>(std::abs(centuries)));
341 "%" PRId64
"M%.3" PRId64,
343 static_cast<int64_t
>(std::abs(centuries)));
350 "%" PRId64
"K%.3" PRId64,
352 static_cast<int64_t
>(std::abs(centuries)));
354 snprintf(buffer,
sizeof(buffer),
"%.4" PRId64, dt.
year);
356 result += std::string(buffer);
358 if (repeat_count == 4) {
359 char buffer[8] = {0};
360 snprintf(buffer,
sizeof(buffer),
"%.4d", (
int)(dt.
year % 10000));
361 result += std::string(buffer);
363 if (repeat_count == 2) {
364 char buffer[8] = {0};
365 snprintf(buffer,
sizeof(buffer),
"%.2d", (
int)(dt.
year % 100));
366 result += std::string(buffer);
371 if (repeat_count == 1) {
373 char buffer[16] = {0};
375 else snprintf(buffer,
sizeof(buffer),
"-%.2d%.2d", tz.
hour, tz.
min);
376 result += std::string(buffer);
421 template<
class T = ts_t>
423 const std::string& format_str,
425 tz_t utc_offset = 0) {
427 if (format_str.empty())
return result;
428 const T local_timestamp =
static_cast<T
>(
timestamp +
static_cast<T
>(utc_offset));
431 bool is_command =
false;
432 size_t repeat_count = 0;
433 char last_char = format_str[0];
434 if (last_char !=
'%') result += last_char;
435 for (
size_t i = 0; i < format_str.size(); ++i) {
436 const char& current_char = format_str[i];
438 if (current_char ==
'%') {
440 if (repeat_count == 2) {
441 result += current_char;
447 result += current_char;
450 last_char = current_char;
454 if (last_char == current_char) {
473 template<
class T = ts_t>
475 const std::string& format_str,
477 tz_t utc_offset = 0) {
507 template<
class T = ts_ms_t>
509 const std::string& format_str,
511 tz_t utc_offset = 0) {
513 if (format_str.empty())
return result;
517 bool is_command =
false;
518 size_t repeat_count = 0;
519 char last_char = format_str[0];
520 if (last_char !=
'%') result += last_char;
521 for (
size_t i = 0; i < format_str.size(); ++i) {
522 const char& current_char = format_str[i];
524 if (current_char ==
'%') {
526 if (repeat_count == 2) {
527 result += current_char;
533 result += current_char;
536 last_char = current_char;
540 if (last_char == current_char) {
559 template<
class T = ts_t>
561 const std::string& format_str,
563 tz_t utc_offset = 0) {
574 template<
class T = ts_t>
577 char buffer[32] = {0};
578 if TIME_SHIELD_IF_CONSTEXPR (std::is_floating_point<T>::value) {
582 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d.%.3d",
594 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d",
602 return std::string(buffer);
612 template<
class T = ts_t>
615 char buffer[32] = {0};
619 "%" PRId64
"-%.2d-%.2d",
623 return std::string(buffer);
633 template<
class T = ts_t>
636 char buffer[32] = {0};
637 if TIME_SHIELD_IF_CONSTEXPR (std::is_floating_point<T>::value) {
638 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d.%.3d", dt.
hour, dt.
min, dt.
sec, dt.
ms);
640 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d", dt.
hour, dt.
min, dt.
sec);
642 return std::string(buffer);
652 template<
class T = ts_t>
655 char buffer[32] = {0};
656 if TIME_SHIELD_IF_CONSTEXPR (std::is_floating_point<T>::value) {
657 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d.%.3dZ", dt.
hour, dt.
min, dt.
sec, dt.
ms);
659 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2dZ", dt.
hour, dt.
min, dt.
sec);
661 return std::string(buffer);
671 template<
class T = ts_t>
674 char buffer[32] = {0};
675 if TIME_SHIELD_IF_CONSTEXPR (std::is_floating_point<T>::value) {
679 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d.%.3dZ",
691 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2dZ",
699 return std::string(buffer);
710 char buffer[32] = {0};
714 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d.%.3dZ",
722 return std::string(buffer);
733 char buffer[32] = {0};
737 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d.%.3d",
745 return std::string(buffer);
756 template<
class T = ts_t>
759 const T local_ts =
static_cast<T
>(
ts +
static_cast<T
>(utc_offset));
761 char buffer[32] = {0};
762 if TIME_SHIELD_IF_CONSTEXPR (std::is_floating_point<T>::value) {
767 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d.%.3d+%.2d:%.2d",
781 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d.%.3d-%.2d:%.2d",
797 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d+%.2d:%.2d",
810 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d-%.2d:%.2d",
821 return std::string(buffer);
835 char buffer[32] = {0};
840 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d.%.3d+%.2d:%.2d",
854 "%" PRId64
"-%.2d-%.2dT%.2d:%.2d:%.2d.%.3d-%.2d:%.2d",
865 return std::string(buffer);
876 char buffer[32] = {0};
880 "%" PRId64
".%.2d.%.2d %.2d:%.2d:%.2d",
887 return std::string(buffer);
904 char buffer[32] = {0};
908 "%" PRId64
".%.2d.%.2d",
912 return std::string(buffer);
923 char buffer[32] = {0};
924 snprintf(buffer,
sizeof(buffer),
"%.2d:%.2d:%.2d", dt.
hour, dt.
min, dt.
sec);
925 return std::string(buffer);
933 char buffer[32] = {0};
937 "%" PRId64
"-%.2d-%.2d_%.2d-%.2d-%.2d",
944 return std::string(buffer);
952 char buffer[32] = {0};
956 "%" PRId64
"-%.2d-%.2d_%.2d-%.2d-%.2d-%.3d",
964 return std::string(buffer);
972 char buffer[32] = {0};
976 "%" PRId64
"-%.2d-%.2d %.2d:%.2d:%.2d",
983 return std::string(buffer);
991 char buffer[32] = {0};
995 "%" PRId64
"-%.2d-%.2d %.2d:%.2d:%.2d.%.3d",
1003 return std::string(buffer);
IsoWeekDateStruct to_iso_week_date(Y year, M month, D day)
Convert calendar date to ISO week date.
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 T1 day_of_week(year_t year, int month, int day)
Alias for day_of_week_date.
TIME_SHIELD_CONSTEXPR T1 sec_to_ms(T2 ts) noexcept
Converts a timestamp from seconds to milliseconds.
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.
ts_t ts() noexcept
Get the current UTC timestamp in seconds.
ts_t timestamp() noexcept
Get the current UTC timestamp in seconds.
ts_ms_t ts_ms() noexcept
Get the current UTC timestamp in milliseconds.
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 an ISO week date.
int64_t year
ISO week-numbering year component.
int32_t week
ISO week number component (1-52/53).
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.