26#define DT_DATETIME_ORIGIN "0001-01-01 00:00:00.000"
27#define DT_DATETIME_EPOCH "1970-01-01 00:00:00.000"
28#define DT_DATETIME_EXIF_FORMAT "%Y:%m:%d %H:%M:%S"
40 dt->
year = g_date_time_get_year(gdt);
41 dt->
month = g_date_time_get_month(gdt);
42 dt->
day = g_date_time_get_day_of_month(gdt);
43 dt->
hour = g_date_time_get_hour(gdt);
44 dt->
minute = g_date_time_get_minute(gdt);
45 dt->
second = g_date_time_get_second(gdt);
46 dt->
msec = g_date_time_get_microsecond(gdt) * 0.001;
54 return g_strdup_printf(
"%s%s%03d", exif,
".", (
int)(g_date_time_get_microsecond(gdt) * 0.001));
62 g_date_time_unref(gdt);
77 g_date_time_unref(gdt);
89 size_t len = strlen(exif);
90 if(len >
sizeof(sdt) - 1) len =
sizeof(sdt) - 1;
91 memcpy(sdt, exif, len);
92 sdt[4] = sdt[7] =
'-';
97 g_date_time_unref(gdt);
106 if(exif && *exif && dt)
108 GMatchInfo *match_info;
110 GRegex *regex = g_regex_new(
111 "^\\s*(\\d{4})?(?::(\\d{2}))?(?::(\\d{2}))?(?: (\\d{2}))?(?::(\\d{2}))?(?::(\\d{2}))?\\s*$", 0, 0, NULL);
112 g_regex_match_full(regex, exif, -1, 0, 0, &match_info, NULL);
113 int match_count = g_match_info_get_match_count(match_info);
116 dt->
year = atoi(g_match_info_fetch(match_info, 1));
117 dt->
month = atoi(g_match_info_fetch(match_info, 2));
118 dt->
day = atoi(g_match_info_fetch(match_info, 3));
119 dt->
hour = atoi(g_match_info_fetch(match_info, 4));
120 dt->
minute = atoi(g_match_info_fetch(match_info, 5));
121 dt->
second = atoi(g_match_info_fetch(match_info, 6));
122 g_match_info_free(match_info);
123 g_regex_unref(regex);
126 g_match_info_free(match_info);
127 g_regex_unref(regex);
133 GDateTime *gdt,
const gboolean msec,
const gboolean tz)
142 GDateTime *lgdt = g_date_time_to_local(gdt);
143 sdt = g_date_time_format(lgdt,
"%a %x %X");
144 g_date_time_unref(lgdt);
147 sdt = g_date_time_format(gdt,
"%a %x %X");
156 g_strlcpy(local, sdt, local_size);
165 const GTimeSpan gts,
const gboolean msec,
const gboolean tz)
167 gboolean res =
FALSE;
174 g_date_time_unref(gdt);
187 GDateTime *gdt = g_date_time_new_from_unix_local(*unix);
191 g_date_time_unref(gdt);
200 GDateTime *gdt = g_date_time_new_from_unix_local(*unix);
204 g_date_time_unref(gdt);
215 GDateTime *gdt = g_date_time_new_now_local();
219 g_date_time_unref(gdt);
225 GDateTime *gdt = g_date_time_new_now_local();
236 g_date_time_unref(gdt);
251 GDateTime *gdt = g_date_time_new((GTimeZone *)tz, dt.
year, dt.
month, dt.
day,
257 GDateTime *gdt2 = g_date_time_add(gdt, dt.
msec * 1000);
258 g_date_time_unref(gdt);
281 g_strlcpy(exif, sdt, exif_size);
298 g_date_time_unref(gdt);
299 gdt = g_date_time_new((GTimeZone *)tz, dt.
year, dt.
month, dt.
day,
314 memcpy(idt,
string, g_utf8_strlen(
string, -1));
315 idt[4] = idt[7] =
'-';
328 g_date_time_unref(gdt);
339 const int len = strlen(entry);
344 memcpy(idt, entry, strlen(entry));
345 idt[4] = idt[7] =
'-';
349 GDateTime *gdt2 = NULL;
351 gdt2 = g_date_time_add_years(gdt, 1);
353 gdt2 = g_date_time_add_months(gdt, 1);
355 gdt2 = g_date_time_add_days(gdt, 1);
357 gdt2 = g_date_time_add_hours(gdt, 1);
359 gdt2 = g_date_time_add_minutes(gdt, 1);
361 gdt2 = g_date_time_add_seconds(gdt, 1);
363 gdt2 = g_date_time_add(gdt, 2);
364 g_date_time_unref(gdt);
367 GDateTime *gdt3 = g_date_time_add(gdt2, -1);
368 g_date_time_unref(gdt2);
373 g_date_time_unref(gdt);
388 exif[exif_size - 1] =
'\0';
395 if(!gts)
return FALSE;
400 g_date_time_unref(gdt);
414 g_date_time_unref(gdt);
425 g_date_time_unref(gdt);
455 const int s = add ? 1 : -1;
457 GDateTime *dt2 = g_date_time_add_years(dte, s * numbers.
year);
458 GDateTime *dt = g_date_time_add_months(dt2, s * numbers.
month);
459 g_date_time_unref(dt2);
460 dt2 = g_date_time_add_days(dt, s * numbers.
day);
461 g_date_time_unref(dt);
462 dt = g_date_time_add_hours(dt2, s * numbers.
hour);
463 g_date_time_unref(dt2);
464 dt2 = g_date_time_add_minutes(dt, s * numbers.
minute);
465 g_date_time_unref(dt);
466 dt = g_date_time_add_seconds(dt2, s * numbers.
second);
467 g_date_time_unref(dt2);
476 g_date_time_unref(dte);
477 g_date_time_unref(dt2);
489 g_date_time_unref(dte);
490 g_date_time_unref(dt2);
491 *result = g_strdup(txt);
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
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)
static char * _datetime_append_msec(char *exif, GDateTime *gdt)
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)
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)
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
GTimeSpan exif_datetime_taken