25 size_t formatDate(
char* buf,
size_t const max, int64_t
const unixtime) {
28 unsigned const doe =
static_cast<unsigned>(div_era.
rem);
29 unsigned const yoe = (doe - doe / 1460 + doe / 36524 - (doe == 146096)) / 365;
30 unsigned const doy = doe - (365 * yoe + yoe / 4 - yoe / 100);
31 unsigned const moy = (5 * doy + 2) / 153;
32 static_assert(8 <=
sizeof(
long long));
33 long long const y = 2000 + div_era.
quot * 400 + yoe + (9 < moy);
34 unsigned const m = moy + (9 < moy ? -9 : 3);
35 unsigned const d = doy - (153 * moy + 2) / 5 + 1;
36 int const len = snprintf(buf, max,
"%04lld-%02u-%02u", y, m, d);
37 if (0 <= len && static_cast<size_t>(len) < max) {
38 return static_cast<size_t>(len);
45 int64_t
const timestamp,
46 int const dimension) {
47 constexpr
int pow10[10]{
48 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
52 unsigned const doe =
static_cast<unsigned>(div_era.
rem);
53 unsigned const yoe = (doe - doe / 1460 + doe / 36524 - (doe == 146096)) / 365;
54 unsigned const doy = doe - (365 * yoe + yoe / 4 - yoe / 100);
55 unsigned const moy = (5 * doy + 2) / 153;
56 static_assert(8 <=
sizeof(
long long));
57 long long const y = 2000 + div_era.
quot * 400 + yoe + (9 < moy);
58 unsigned const m = moy + (9 < moy ? -9 : 3);
59 unsigned const d = doy - (153 * moy + 2) / 5 + 1;
60 unsigned const minutes =
static_cast<unsigned>(div_day.
rem) / 60;
61 unsigned const ss = div_day.
rem % 60;
62 unsigned const hh = minutes / 60;
63 unsigned const mm = minutes % 60;
65 snprintf(buf, max,
"%04lld-%02u-%02u %02u:%02u:%02u", y, m, d, hh, mm, ss);
66 if (0 <= len && static_cast<size_t>(len) < max) {
68 int const len_frac = snprintf(
69 buf + len, max - len,
".%0*d", dimension, static_cast<int>(div_hip.
rem));
70 if (0 <= len_frac && static_cast<size_t>(len + len_frac) < max) {
71 return static_cast<size_t>(len + len_frac);
74 return static_cast<size_t>(len);
80 size_t formatHMS(
char* buf,
size_t const max, int64_t
const unixtime) {
81 unsigned const seconds =
static_cast<unsigned>(
unsignedMod(unixtime, 24 * 60 * 60));
82 unsigned const minutes = seconds / 60;
83 unsigned const ss = seconds % 60;
84 unsigned const hh = minutes / 60;
85 unsigned const mm = minutes % 60;
86 int const len = snprintf(buf, max,
"%02u:%02u:%02u", hh, mm, ss);
87 if (0 <= len && static_cast<size_t>(len) < max) {
88 return static_cast<size_t>(len);
size_t formatDateTime(char *buf, size_t const max, int64_t const timestamp, int const dimension)
size_t formatHMS(char *buf, size_t const max, int64_t const unixtime)
size_t formatDate(char *buf, size_t const max, int64_t const unixtime)
uint64_t unsignedMod(int64_t num, int64_t den)
DivUMod divUMod(int64_t num, int64_t den)