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);
84 g_strlcpy(sdt, exif,
sizeof(sdt));
85 sdt[4] = sdt[7] =
'-';
90 g_date_time_unref(gdt);
99 if(exif && *exif && dt)
101 GMatchInfo *match_info;
103 GRegex *regex = g_regex_new(
104 "^\\s*(\\d{4})?(?::(\\d{2}))?(?::(\\d{2}))?(?: (\\d{2}))?(?::(\\d{2}))?(?::(\\d{2}))?\\s*$", 0, 0, NULL);
105 g_regex_match_full(regex, exif, -1, 0, 0, &match_info, NULL);
106 int match_count = g_match_info_get_match_count(match_info);
109 dt->
year = atoi(g_match_info_fetch(match_info, 1));
110 dt->
month = atoi(g_match_info_fetch(match_info, 2));
111 dt->
day = atoi(g_match_info_fetch(match_info, 3));
112 dt->
hour = atoi(g_match_info_fetch(match_info, 4));
113 dt->
minute = atoi(g_match_info_fetch(match_info, 5));
114 dt->
second = atoi(g_match_info_fetch(match_info, 6));
115 g_match_info_free(match_info);
116 g_regex_unref(regex);
119 g_match_info_free(match_info);
120 g_regex_unref(regex);
126 GDateTime *gdt,
const gboolean msec,
const gboolean tz)
135 GDateTime *lgdt = g_date_time_to_local(gdt);
136 sdt = g_date_time_format(lgdt,
"%a %x %X");
137 g_date_time_unref(lgdt);
140 sdt = g_date_time_format(gdt,
"%a %x %X");
149 g_strlcpy(local, sdt, local_size);
158 const GTimeSpan gts,
const gboolean msec,
const gboolean tz)
160 gboolean res =
FALSE;
167 g_date_time_unref(gdt);
180 GDateTime *gdt = g_date_time_new_from_unix_local(*unix);
184 g_date_time_unref(gdt);
193 GDateTime *gdt = g_date_time_new_from_unix_local(*unix);
197 g_date_time_unref(gdt);
208 GDateTime *gdt = g_date_time_new_now_local();
212 g_date_time_unref(gdt);
218 GDateTime *gdt = g_date_time_new_now_local();
229 g_date_time_unref(gdt);
244 GDateTime *gdt = g_date_time_new((GTimeZone *)tz, dt.
year, dt.
month, dt.
day,
250 GDateTime *gdt2 = g_date_time_add(gdt, dt.
msec * 1000);
251 g_date_time_unref(gdt);
274 g_strlcpy(exif, sdt, exif_size);
291 g_date_time_unref(gdt);
292 gdt = g_date_time_new((GTimeZone *)tz, dt.
year, dt.
month, dt.
day,
307 memcpy(idt,
string, g_utf8_strlen(
string, -1));
308 idt[4] = idt[7] =
'-';
321 g_date_time_unref(gdt);
332 const int len = strlen(entry);
337 memcpy(idt, entry, strlen(entry));
338 idt[4] = idt[7] =
'-';
342 GDateTime *gdt2 = NULL;
344 gdt2 = g_date_time_add_years(gdt, 1);
346 gdt2 = g_date_time_add_months(gdt, 1);
348 gdt2 = g_date_time_add_days(gdt, 1);
350 gdt2 = g_date_time_add_hours(gdt, 1);
352 gdt2 = g_date_time_add_minutes(gdt, 1);
354 gdt2 = g_date_time_add_seconds(gdt, 1);
356 gdt2 = g_date_time_add(gdt, 2);
357 g_date_time_unref(gdt);
360 GDateTime *gdt3 = g_date_time_add(gdt2, -1);
361 g_date_time_unref(gdt2);
366 g_date_time_unref(gdt);
381 exif[exif_size - 1] =
'\0';
388 if(!gts)
return FALSE;
393 g_date_time_unref(gdt);
407 g_date_time_unref(gdt);
418 g_date_time_unref(gdt);
448 const int s = add ? 1 : -1;
450 GDateTime *dt2 = g_date_time_add_years(dte, s * numbers.
year);
451 GDateTime *dt = g_date_time_add_months(dt2, s * numbers.
month);
452 g_date_time_unref(dt2);
453 dt2 = g_date_time_add_days(dt, s * numbers.
day);
454 g_date_time_unref(dt);
455 dt = g_date_time_add_hours(dt2, s * numbers.
hour);
456 g_date_time_unref(dt2);
457 dt2 = g_date_time_add_minutes(dt, s * numbers.
minute);
458 g_date_time_unref(dt);
459 dt = g_date_time_add_seconds(dt2, s * numbers.
second);
460 g_date_time_unref(dt2);
469 g_date_time_unref(dte);
470 g_date_time_unref(dt2);
482 g_date_time_unref(dte);
483 g_date_time_unref(dt2);
484 *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