static GDateTime* gnc_g_date_time_adjust_for_dst (GDateTime *gdt, GTimeZone *tz) { GDateTime *ngdt; g_return_val_if_fail (gdt != NULL, NULL); ngdt = g_date_time_to_timezone (gdt, tz); g_date_time_unref (gdt); tz = gnc_g_time_zone_adjust_for_dst (tz, ngdt); gdt = g_date_time_to_timezone (ngdt, tz); g_date_time_unref (ngdt); g_time_zone_unref (tz); return gdt; }
DateTime::DateTime(GTimeZone* gtz, time_t t) { auto utc = g_date_time_new_from_unix_utc(t); auto gdt = g_date_time_to_timezone (utc, gtz); reset(gtz, gdt); g_date_time_unref(gdt); g_date_time_unref(utc); }
DateTime DateTime::to_timezone(const std::string& zone) const { auto gtz = g_time_zone_new(zone.c_str()); auto gdt = g_date_time_to_timezone(get(), gtz); DateTime dt(gtz, gdt); g_time_zone_unref(gtz); g_date_time_unref(gdt); return dt; }
static gchar* time_string_tz ( time_t *time, const gchar *format, GTimeZone *tz ) { GDateTime *utc = g_date_time_new_from_unix_utc (*time); GDateTime *local = g_date_time_to_timezone ( utc, tz ); if ( !local ) { g_date_time_unref ( utc ); return NULL; } gchar *str = g_date_time_format ( local, format ); g_date_time_unref ( local ); g_date_time_unref ( utc ); return str; }
static void location_changed_cb (CcTimezoneMap *map, TzLocation *location, CcDateTimePanel *self) { CcDateTimePanelPrivate *priv = self->priv; GDateTime *old_date; GTimeZone *timezone; g_debug ("location changed to %s/%s", location->country, location->zone); priv->current_location = location; old_date = priv->date; timezone = g_time_zone_new (location->zone); priv->date = g_date_time_to_timezone (old_date, timezone); g_time_zone_unref (timezone); g_date_time_unref (old_date); update_timezone (self); queue_set_timezone (self); }
int32_t dt_control_gpx_apply_job_run(dt_job_t *job) { dt_control_image_enumerator_t *t1 = (dt_control_image_enumerator_t *)job->param; GList *t = t1->index; struct dt_gpx_t *gpx = NULL; uint32_t cntr = 0; const dt_control_gpx_apply_t *d = t1->data; const gchar *filename = d->filename; const gchar *tz = d->tz; /* do we have any selected images */ if (!t) goto bail_out; /* try parse the gpx data */ gpx = dt_gpx_new(filename); if (!gpx) { dt_control_log(_("failed to parse gpx file")); goto bail_out; } GTimeZone *tz_camera = (tz == NULL)?g_time_zone_new_utc():g_time_zone_new(tz); if(!tz_camera) goto bail_out; GTimeZone *tz_utc = g_time_zone_new_utc(); /* go thru each selected image and lookup location in gpx */ do { GTimeVal timestamp; GDateTime *exif_time, *utc_time; gdouble lon,lat; uint32_t imgid = (long int)t->data; /* get image */ const dt_image_t *cimg = dt_image_cache_read_get(darktable.image_cache, imgid); if (!cimg) continue; /* convert exif datetime TODO: exiv2 dates should be iso8601 and we are probably doing some ugly convertion before inserting into database. */ gint year; gint month; gint day; gint hour; gint minute; gint seconds; if (sscanf(cimg->exif_datetime_taken, "%d:%d:%d %d:%d:%d", (int*)&year, (int*)&month, (int*)&day, (int*)&hour,(int*)&minute,(int*)&seconds) != 6) { fprintf(stderr,"broken exif time in db, '%s'\n", cimg->exif_datetime_taken); dt_image_cache_read_release(darktable.image_cache, cimg); continue; } /* release the lock */ dt_image_cache_read_release(darktable.image_cache, cimg); exif_time = g_date_time_new(tz_camera, year, month, day, hour, minute, seconds); if(!exif_time) continue; utc_time = g_date_time_to_timezone(exif_time, tz_utc); g_date_time_unref(exif_time); if(!utc_time) continue; gboolean res = g_date_time_to_timeval(utc_time, ×tamp); g_date_time_unref(utc_time); if(!res) continue; /* only update image location if time is within gpx tack range */ if(dt_gpx_get_location(gpx, ×tamp, &lon, &lat)) { dt_image_set_location(imgid, lon, lat); cntr++; } } while((t = g_list_next(t)) != NULL); dt_control_log(_("applied matched gpx location onto %d image(s)"), cntr); g_time_zone_unref(tz_camera); g_time_zone_unref(tz_utc); dt_gpx_destroy(gpx); g_free(d->filename); g_free(d->tz); g_free(t1->data); return 0; bail_out: if (gpx) dt_gpx_destroy(gpx); g_free(d->filename); g_free(d->tz); g_free(t1->data); return 1; }
/** * vik_datetime_edit_dialog: * @parent: The parent window * @title: The title to use for the dialog * @initial_time: The inital date/time to be shown * @tz: The #GTimeZone this dialog will operate in * * Returns: A time selected by the user via this dialog * Even though a time of zero is notionally valid - consider it unlikely to be actually wanted! * Thus if the time is zero then the dialog was cancelled or somehow an invalid date was encountered. */ time_t vik_datetime_edit_dialog ( GtkWindow *parent, const gchar *title, time_t initial_time, GTimeZone *tz ) { g_return_val_if_fail ( tz, 0 ); GtkWidget *dialog = gtk_dialog_new_with_buttons ( title, parent, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL ); gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); GtkWidget *response_w = NULL; #if GTK_CHECK_VERSION (2, 20, 0) response_w = gtk_dialog_get_widget_for_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); #endif GtkWidget *label; GtkWidget *cal = gtk_calendar_new (); // Set according to the given date/time + timezone for display GDateTime *gdt_in = g_date_time_new_from_unix_utc ( (gint64)initial_time ); GDateTime *gdt_tz = g_date_time_to_timezone ( gdt_in, tz ); g_date_time_unref ( gdt_in ); gtk_calendar_select_month ( GTK_CALENDAR(cal), g_date_time_get_month(gdt_tz)-1, g_date_time_get_year (gdt_tz) ); gtk_calendar_select_day ( GTK_CALENDAR(cal), g_date_time_get_day_of_month(gdt_tz) ); GtkWidget *hbox_time = gtk_hbox_new ( FALSE, 1 ); label = gtk_label_new ( g_date_time_get_timezone_abbreviation(gdt_tz) ); gtk_box_pack_start ( GTK_BOX(hbox_time), label, FALSE, FALSE, 5 ); GtkWidget *sb_hours = gtk_spin_button_new_with_range ( 0.0, 23.0, 1.0 ); gtk_box_pack_start ( GTK_BOX(hbox_time), sb_hours, FALSE, FALSE, 0 ); gtk_spin_button_set_value ( GTK_SPIN_BUTTON(sb_hours), g_date_time_get_hour(gdt_tz) ); g_signal_connect ( sb_hours, "output", G_CALLBACK(on_output), NULL ); label = gtk_label_new ( ":" ); gtk_box_pack_start ( GTK_BOX(hbox_time), label, FALSE, FALSE, 0 ); GtkWidget *sb_minutes = gtk_spin_button_new_with_range ( 0.0, 59.0, 1.0 ); gtk_box_pack_start ( GTK_BOX(hbox_time), sb_minutes, FALSE, FALSE, 0); gtk_spin_button_set_value ( GTK_SPIN_BUTTON(sb_minutes), g_date_time_get_minute(gdt_tz) ); g_signal_connect ( sb_minutes, "output", G_CALLBACK(on_output), NULL ); label = gtk_label_new ( ":" ); gtk_box_pack_start(GTK_BOX(hbox_time), label, FALSE, FALSE, 0); GtkWidget *sb_seconds = gtk_spin_button_new_with_range ( 0.0, 59.0, 1.0 ); gtk_box_pack_start ( GTK_BOX(hbox_time), sb_seconds, FALSE, FALSE, 0 ); gtk_spin_button_set_value ( GTK_SPIN_BUTTON(sb_seconds), g_date_time_get_second(gdt_tz) ); g_signal_connect ( sb_seconds, "output", G_CALLBACK(on_output), NULL ); gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), cal, FALSE, FALSE, 0 ); gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), hbox_time, FALSE, FALSE, 5 ); if ( response_w ) gtk_widget_grab_focus ( response_w ); g_date_time_unref ( gdt_tz ); gtk_widget_show_all ( dialog ); if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) != GTK_RESPONSE_ACCEPT ) { gtk_widget_destroy ( dialog ); return 0; } // Read values guint year = 0; guint month = 0; guint day = 0; guint hours = 0; guint minutes = 0; guint seconds = 0; gtk_calendar_get_date ( GTK_CALENDAR(cal), &year, &month, &day ); hours = gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(sb_hours) ); minutes = gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(sb_minutes) ); seconds = gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(sb_seconds) ); gtk_widget_destroy(dialog); time_t ans = initial_time; GDateTime *gdt_ans = g_date_time_new ( tz, year, month+1, day, hours, minutes, (gdouble)seconds ); if ( gdt_ans ) { ans = g_date_time_to_unix ( gdt_ans ); g_date_time_unref ( gdt_ans ); } return ans; }