+/* Convert a glkdate to a glktimeval, in the given time zone. */
+static void
+date_to_time(glkdate_t *date, glktimeval_t *tv, GTimeZone *tz)
+{
+ GDateTime *dt = date_to_gdatetime(date, tz);
+ if(dt == NULL) {
+ tv->high_sec = -1;
+ tv->low_sec = -1;
+ return;
+ }
+ gint64 timestamp = g_date_time_to_unix(dt);
+ int microsec = g_date_time_get_microsecond(dt);
+ g_date_time_unref(dt);
+ unix_time_to_time(timestamp, microsec, tv);
+}
+
+/* Convert a glkdate to a Unix timestamp divided by a value, in the given time
+zone. */
+static glsi32
+date_to_simple_time(glkdate_t *date, glui32 factor, GTimeZone *tz)
+{
+ GDateTime *dt = date_to_gdatetime(date, tz);
+ if(dt == NULL)
+ return -1;
+ gint64 timestamp = g_date_time_to_unix(dt);
+ g_date_time_unref(dt);
+
+ return simplify_time(timestamp, factor);
+}
+