Derive-C
Loading...
Searching...
No Matches
timestamp.h File Reference
#include <derive-c/core/prelude.h>
#include <derive-c/core/debug/fmt.h>
#include <derive-c/test/mock.h>
#include <stdint.h>
#include <stdio.h>
#include <time.h>

Go to the source code of this file.

Data Structures

struct  dc_timestamp
struct  dc_datetime

Macros

#define DC_NS_PER_SEC   1000000000ULL

Enumerations

enum  dc_timezone { DC_TZ_UTC }

Functions

 DC_MOCKABLE (dc_timestamp, dc_timestamp_now,(void))
static DC_PUBLIC dc_datetime dc_datetime_from_timestamp (dc_timestamp ts, dc_timezone tz)
static DC_PUBLIC dc_datetime dc_datetime_now_utc (void)
static DC_PUBLIC dc_timestamp dc_datetime_to_timestamp (dc_datetime const *dt)
static DC_PUBLIC void dc_datetime_format (dc_datetime const *dt, FILE *stream)
static DC_PUBLIC void dc_datetime_debug (dc_datetime const *self, dc_debug_fmt fmt, FILE *stream)

Macro Definition Documentation

◆ DC_NS_PER_SEC

#define DC_NS_PER_SEC   1000000000ULL

Definition at line 10 of file timestamp.h.

Enumeration Type Documentation

◆ dc_timezone

Enumerator
DC_TZ_UTC 

Definition at line 16 of file timestamp.h.

16 {
dc_timezone
Definition timestamp.h:16
@ DC_TZ_UTC
Definition timestamp.h:17

Function Documentation

◆ dc_datetime_debug()

DC_PUBLIC void dc_datetime_debug ( dc_datetime const * self,
dc_debug_fmt fmt,
FILE * stream )
static

Definition at line 80 of file timestamp.h.

80 {
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
static DC_PUBLIC FILE * stream(SELF *self)
Definition template.h:108

◆ dc_datetime_format()

DC_PUBLIC void dc_datetime_format ( dc_datetime const * dt,
FILE * stream )
static

Definition at line 66 of file timestamp.h.

66 {
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}

◆ dc_datetime_from_timestamp()

DC_PUBLIC dc_datetime dc_datetime_from_timestamp ( dc_timestamp ts,
dc_timezone tz )
static

Definition at line 32 of file timestamp.h.

32 {
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}
uint32_t nanos
Definition timestamp.h:22
dc_timezone tz
Definition timestamp.h:23
struct tm tm
Definition timestamp.h:21
uint64_t ns
Definition timestamp.h:13
#define DC_NS_PER_SEC
Definition timestamp.h:10

◆ dc_datetime_now_utc()

DC_PUBLIC dc_datetime dc_datetime_now_utc ( void )
static

Definition at line 49 of file timestamp.h.

49 {
50 return dc_datetime_from_timestamp(dc_timestamp_now(), DC_TZ_UTC);
51}
static DC_PUBLIC dc_datetime dc_datetime_from_timestamp(dc_timestamp ts, dc_timezone tz)
Definition timestamp.h:32

◆ dc_datetime_to_timestamp()

DC_PUBLIC dc_timestamp dc_datetime_to_timestamp ( dc_datetime const * dt)
static

Definition at line 53 of file timestamp.h.

53 {
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}

◆ DC_MOCKABLE()

DC_MOCKABLE ( dc_timestamp ,
dc_timestamp_now ,
(void)  )

Definition at line 26 of file timestamp.h.

26 {
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}