Derive-C
Loading...
Searching...
No Matches
timestamp.h
Go to the documentation of this file.
1#pragma once
2
6#include <stdint.h>
7#include <stdio.h>
8#include <time.h>
9
10#define DC_NS_PER_SEC 1000000000ULL
11
12typedef struct {
13 uint64_t ns;
15
16typedef enum {
19
20typedef struct {
21 struct tm tm;
22 uint32_t nanos;
25
26DC_MOCKABLE(dc_timestamp, dc_timestamp_now, (void)) {
27 struct timespec ts;
28 clock_gettime(CLOCK_REALTIME, &ts);
29 return (dc_timestamp){.ns = ((uint64_t)ts.tv_sec * DC_NS_PER_SEC) + (uint64_t)ts.tv_nsec};
30}
31
33 time_t secs = (time_t)(ts.ns / DC_NS_PER_SEC);
34 uint32_t nanos = (uint32_t)(ts.ns % DC_NS_PER_SEC);
35
36 dc_datetime dt;
37 dt.nanos = nanos;
38 dt.tz = tz;
39
40 switch (tz) {
41 case DC_TZ_UTC:
42 gmtime_r(&secs, &dt.tm);
43 break;
44 }
45
46 return dt;
47}
48
50 return dc_datetime_from_timestamp(dc_timestamp_now(), DC_TZ_UTC);
51}
52
54 struct tm tm_copy = dt->tm;
55 time_t secs;
56
57 switch (dt->tz) {
58 case DC_TZ_UTC:
59 secs = timegm(&tm_copy);
60 break;
61 }
62
63 return (dc_timestamp){.ns = ((uint64_t)secs * DC_NS_PER_SEC) + (uint64_t)dt->nanos};
64}
65
66DC_PUBLIC static void dc_datetime_format(dc_datetime const* dt, FILE* stream) {
67 char buf[32];
68 strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%S", &dt->tm);
69
70 char const* tz_suffix;
71 switch (dt->tz) {
72 case DC_TZ_UTC:
73 tz_suffix = "Z";
74 break;
75 }
76
77 fprintf(stream, "%s.%09u%s", buf, dt->nanos, tz_suffix);
78}
79
80DC_PUBLIC static void dc_datetime_debug(dc_datetime const* self, dc_debug_fmt fmt, FILE* stream) {
81 fprintf(stream, "dc_datetime {\n");
82 fmt = dc_debug_fmt_scope_begin(fmt);
83
84 dc_debug_fmt_print(fmt, stream, "year: %d,\n", self->tm.tm_year + 1900);
85 dc_debug_fmt_print(fmt, stream, "month: %d,\n", self->tm.tm_mon + 1);
86 dc_debug_fmt_print(fmt, stream, "day: %d,\n", self->tm.tm_mday);
87 dc_debug_fmt_print(fmt, stream, "hour: %d,\n", self->tm.tm_hour);
88 dc_debug_fmt_print(fmt, stream, "min: %d,\n", self->tm.tm_min);
89 dc_debug_fmt_print(fmt, stream, "sec: %d,\n", self->tm.tm_sec);
90 dc_debug_fmt_print(fmt, stream, "nanos: %u,\n", self->nanos);
91 dc_debug_fmt_print(fmt, stream, "tz: UTC,\n");
92
93 fmt = dc_debug_fmt_scope_end(fmt);
94 dc_debug_fmt_print(fmt, stream, "}");
95}
static DC_PUBLIC void dc_debug_fmt_print(dc_debug_fmt fmt, FILE *stream, const char *format,...)
Definition fmt.h:32
static DC_PUBLIC dc_debug_fmt dc_debug_fmt_scope_end(dc_debug_fmt fmt)
Definition fmt.h:57
static DC_PUBLIC dc_debug_fmt dc_debug_fmt_scope_begin(dc_debug_fmt fmt)
Definition fmt.h:50
#define DC_MOCKABLE(ret, name, args)
Defines a function as mockable, combining declaration & definition.
Definition mock.h:44
#define DC_PUBLIC
Definition namespace.h:25
uint32_t nanos
Definition timestamp.h:22
dc_timezone tz
Definition timestamp.h:23
struct tm tm
Definition timestamp.h:21
Debug format helpers for debug printin data structures.
Definition fmt.h:11
uint64_t ns
Definition timestamp.h:13
static DC_PUBLIC void dc_datetime_debug(dc_datetime const *self, dc_debug_fmt fmt, FILE *stream)
Definition timestamp.h:80
#define DC_NS_PER_SEC
Definition timestamp.h:10
static DC_PUBLIC dc_datetime dc_datetime_from_timestamp(dc_timestamp ts, dc_timezone tz)
Definition timestamp.h:32
static DC_PUBLIC dc_timestamp dc_datetime_to_timestamp(dc_datetime const *dt)
Definition timestamp.h:53
dc_timezone
Definition timestamp.h:16
@ DC_TZ_UTC
Definition timestamp.h:17
static DC_PUBLIC dc_datetime dc_datetime_now_utc(void)
Definition timestamp.h:49
static DC_PUBLIC void dc_datetime_format(dc_datetime const *dt, FILE *stream)
Definition timestamp.h:66
static DC_PUBLIC FILE * stream(SELF *self)
Definition template.h:108