25#define DT_DATETIME_ORIGIN "0001-01-01 00:00:00.000"
26#define DT_DATETIME_EPOCH "1970-01-01 00:00:00.000"
27#define DT_DATETIME_EXIF_FORMAT "%Y:%m:%d %H:%M:%S"
36 _utc_tz = g_time_zone_new_utc();
54 dt->
year = g_date_time_get_year(gdt);
55 dt->
month = g_date_time_get_month(gdt);
56 dt->
day = g_date_time_get_day_of_month(gdt);
57 dt->
hour = g_date_time_get_hour(gdt);
58 dt->
minute = g_date_time_get_minute(gdt);
59 dt->
second = g_date_time_get_second(gdt);
60 dt->
msec = g_date_time_get_microsecond(gdt) * 0.001;
68 return g_strdup_printf(
"%s%s%03d", exif,
".", (
int)(g_date_time_get_microsecond(gdt) * 0.001));
76 g_date_time_unref(gdt);
91 g_date_time_unref(gdt);
103 size_t len = strlen(exif);
104 if(len >
sizeof(sdt) - 1) len =
sizeof(sdt) - 1;
105 memcpy(sdt, exif, len);
106 sdt[4] = sdt[7] =
'-';
111 g_date_time_unref(gdt);
120 if(exif && *exif && dt)
122 GMatchInfo *match_info;
124 GRegex *regex = g_regex_new(
125 "^\\s*(\\d{4})?(?::(\\d{2}))?(?::(\\d{2}))?(?: (\\d{2}))?(?::(\\d{2}))?(?::(\\d{2}))?\\s*$", 0, 0, NULL);
126 g_regex_match_full(regex, exif, -1, 0, 0, &match_info, NULL);
127 int match_count = g_match_info_get_match_count(match_info);
130 dt->
year = atoi(g_match_info_fetch(match_info, 1));
131 dt->
month = atoi(g_match_info_fetch(match_info, 2));
132 dt->
day = atoi(g_match_info_fetch(match_info, 3));
133 dt->
hour = atoi(g_match_info_fetch(match_info, 4));
134 dt->
minute = atoi(g_match_info_fetch(match_info, 5));
135 dt->
second = atoi(g_match_info_fetch(match_info, 6));
136 g_match_info_free(match_info);
137 g_regex_unref(regex);
140 g_match_info_free(match_info);
141 g_regex_unref(regex);
147 GDateTime *gdt,
const gboolean msec,
const gboolean tz)
156 GDateTime *lgdt = g_date_time_to_local(gdt);
157 sdt = g_date_time_format(lgdt,
"%a %x %X");
158 g_date_time_unref(lgdt);
161 sdt = g_date_time_format(gdt,
"%a %x %X");
170 g_strlcpy(local, sdt, local_size);
179 const GTimeSpan gts,
const gboolean msec,
const gboolean tz)
188 g_date_time_unref(gdt);
201 GDateTime *gdt = g_date_time_new_from_unix_local(*unix);
205 g_date_time_unref(gdt);
214 GDateTime *gdt = g_date_time_new_from_unix_local(*unix);
218 g_date_time_unref(gdt);
229 GDateTime *gdt = g_date_time_new_now_local();
233 g_date_time_unref(gdt);
239 GDateTime *gdt = g_date_time_new_now_local();
250 g_date_time_unref(gdt);
265 GDateTime *gdt = g_date_time_new((GTimeZone *)tz, dt.
year, dt.
month, dt.
day,
271 GDateTime *gdt2 = g_date_time_add(gdt, dt.
msec * 1000);
272 g_date_time_unref(gdt);
295 g_strlcpy(exif, sdt, exif_size);
312 g_date_time_unref(gdt);
313 gdt = g_date_time_new((GTimeZone *)tz, dt.
year, dt.
month, dt.
day,
328 memcpy(idt,
string, g_utf8_strlen(
string, -1));
329 idt[4] = idt[7] =
'-';
342 g_date_time_unref(gdt);
353 const int len = strlen(entry);
358 memcpy(idt, entry, strlen(entry));
359 idt[4] = idt[7] =
'-';
363 GDateTime *gdt2 = NULL;
365 gdt2 = g_date_time_add_years(gdt, 1);
367 gdt2 = g_date_time_add_months(gdt, 1);
369 gdt2 = g_date_time_add_days(gdt, 1);
371 gdt2 = g_date_time_add_hours(gdt, 1);
373 gdt2 = g_date_time_add_minutes(gdt, 1);
375 gdt2 = g_date_time_add_seconds(gdt, 1);
377 gdt2 = g_date_time_add(gdt, 2);
378 g_date_time_unref(gdt);
381 GDateTime *gdt3 = g_date_time_add(gdt2, -1);
382 g_date_time_unref(gdt2);
387 g_date_time_unref(gdt);
402 exif[exif_size - 1] =
'\0';
409 if(!gts)
return FALSE;
414 g_date_time_unref(gdt);
428 g_date_time_unref(gdt);
439 g_date_time_unref(gdt);
469 const int s = add ? 1 : -1;
471 GDateTime *dt2 = g_date_time_add_years(dte, s * numbers.
year);
472 GDateTime *dt = g_date_time_add_months(dt2, s * numbers.
month);
473 g_date_time_unref(dt2);
474 dt2 = g_date_time_add_days(dt, s * numbers.
day);
475 g_date_time_unref(dt);
476 dt = g_date_time_add_hours(dt2, s * numbers.
hour);
477 g_date_time_unref(dt2);
478 dt2 = g_date_time_add_minutes(dt, s * numbers.
minute);
479 g_date_time_unref(dt);
480 dt = g_date_time_add_seconds(dt2, s * numbers.
second);
481 g_date_time_unref(dt2);
490 g_date_time_unref(dte);
491 g_date_time_unref(dt2);
503 g_date_time_unref(dte);
504 g_date_time_unref(dt2);
505 *result = g_strdup(txt);
GTimeSpan dt_datetime_exif_to_gtimespan(const char *sdt)
gboolean dt_datetime_img_to_exif(char *exif, const size_t exif_size, const dt_image_t *img)
gboolean dt_datetime_gdatetime_to_exif(char *exif, const size_t exif_size, GDateTime *gdt)
gboolean dt_datetime_gtimespan_to_local(char *local, const size_t local_size, const GTimeSpan gts, const gboolean msec, const gboolean tz)
void dt_datetime_now_to_exif(char *exif)
void dt_datetime_add_subsec_to_exif(char *exif, const size_t exif_size, const char *subsec)
GDateTime * dt_datetime_exif_to_gdatetime(const char *exif, const GTimeZone *tz)
GTimeZone * dt_datetime_utc_tz(void)
static char * _datetime_append_msec(char *exif, GDateTime *gdt)
GDateTime * dt_datetime_origin(void)
GTimeSpan dt_datetime_numbers_to_gtimespan(const dt_datetime_t *dt)
gboolean dt_datetime_unix_to_img(dt_image_t *img, const time_t *unix)
GDateTime * dt_datetime_gdatetime_add_numbers(GDateTime *dte, const dt_datetime_t numbers, const gboolean add)
static GTimeZone * _utc_tz
GDateTime * dt_string_to_datetime(const char *string)
gboolean dt_datetime_img_to_local(char *local, const size_t local_size, const dt_image_t *img, const gboolean msec)
gboolean dt_datetime_exif_add_numbers(const gchar *exif, const dt_datetime_t numbers, const gboolean add, gchar **result)
#define DT_DATETIME_ORIGIN
GDateTime * dt_datetime_gtimespan_to_gdatetime(const GTimeSpan gts)
gboolean dt_datetime_gtimespan_to_exif(char *sdt, const size_t sdt_size, const GTimeSpan gts)
GTimeSpan dt_datetime_now_to_gtimespan()
GTimeSpan dt_datetime_gdatetime_to_gtimespan(GDateTime *gdt)
gboolean dt_datetime_gtimespan_to_numbers(dt_datetime_t *dt, const GTimeSpan gts)
static GDateTime * _origin_gdt
gboolean dt_datetime_exif_to_numbers(dt_datetime_t *dt, const char *exif)
GTimeSpan dt_datetime_gtimespan_add_numbers(const GTimeSpan dt, const dt_datetime_t numbers, const gboolean add)
gboolean dt_datetime_gdatetime_to_local(char *local, const size_t local_size, GDateTime *gdt, const gboolean msec, const gboolean tz)
static GTimeSpan _gdatetime_to_gtimespan(GDateTime *gdt)
gboolean dt_datetime_exif_to_numbers_raw(dt_datetime_t *dt, const char *exif)
#define DT_DATETIME_EXIF_FORMAT
void dt_datetime_exif_to_img(dt_image_t *img, const char *exif)
gboolean dt_datetime_entry_to_exif_upper_bound(char *exif, const size_t exif_size, const char *entry)
gboolean dt_datetime_unix_to_exif(char *exif, const size_t exif_size, const time_t *unix)
gboolean dt_datetime_entry_to_exif(char *exif, const size_t exif_size, const char *entry)
gboolean _datetime_gdatetime_to_numbers(dt_datetime_t *dt, GDateTime *gdt)
GDateTime * dt_datetime_img_to_gdatetime(const dt_image_t *img, const GTimeZone *tz)
#define DT_DATETIME_LENGTH
#define DT_DATETIME_EXIF_LENGTH
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
#define dt_free(ptr)
g_free() ptr and set it to NULL, skipping both if it is already NULL.
GTimeSpan exif_datetime_taken