Modified GsweTimestamp so the time zone must be specified as a double (in hours)

This commit is contained in:
Gergely Polonkai 2013-09-01 19:30:27 +02:00
parent 4f2c91d553
commit 7dc0a25d9d
2 changed files with 54 additions and 18 deletions

View File

@ -23,7 +23,7 @@ struct _GsweTimestampPrivate {
gint gregorian_minute;
gint gregorian_second;
gint gregorian_microsecond;
GTimeZone *gregorian_timezone;
gdouble gregorian_timezone_offset;
gdouble julian_day;
};
@ -44,6 +44,7 @@ enum {
PROP_GREGORIAN_MINUTE,
PROP_GREGORIAN_SECOND,
PROP_GREGORIAN_MICROSECOND,
PROP_GREGORIAN_TIMEZONE_OFFSET,
PROP_JULIAN_DAY_VALID
};
@ -149,6 +150,13 @@ gswe_timestamp_class_init(GsweTimestampClass *klass)
*/
g_object_class_install_property(gobject_class, PROP_GREGORIAN_MICROSECOND, g_param_spec_int("gregorian-microsecond", "Gregorian microsecond", "The microsecond according to the Gregorian calendar", 0, G_MAXINT, g_date_time_get_microsecond(local_time), G_PARAM_READWRITE));
/**
* GsweTimestamp:gregorian-timezone-offset:
*
* The time zone offset in hours, relative to UTC
*/
g_object_class_install_property(gobject_class, PROP_GREGORIAN_TIMEZONE_OFFSET, g_param_spec_double("gregorian-timezone-offset", "Gregorian timezone offset", "The offset relative to UTC in the Gregorian calendar", -24.0, 24.0, 0.0, G_PARAM_READWRITE));
/**
* GsweTimestamp:julian-day-valid
*
@ -171,8 +179,6 @@ void
gswe_timestamp_init(GsweTimestamp *self)
{
self->priv = GSWE_TIMESTAMP_GET_PRIVATE(self);
self->priv->gregorian_timezone = g_time_zone_new_local();
}
static void
@ -233,6 +239,11 @@ gswe_timestamp_set_property(GObject *object, guint prop_id, const GValue *value,
break;
case PROP_GREGORIAN_TIMEZONE_OFFSET:
gswe_timestamp_set_gregorian_timezone(timestamp, g_value_get_double(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
@ -298,6 +309,11 @@ gswe_timestamp_get_property(GObject *object, guint prop_id, GValue *value, GPara
break;
case PROP_GREGORIAN_TIMEZONE_OFFSET:
g_value_set_double(value, timestamp->priv->gregorian_timezone_offset);
break;
case PROP_JULIAN_DAY_VALID:
g_value_set_boolean(value, ((timestamp->priv->valid_dates & VALID_JULIAN_DAY) == VALID_JULIAN_DAY));
@ -499,6 +515,27 @@ gswe_timestamp_get_gregorian_microsecond(GsweTimestamp *timestamp)
return timestamp->priv->gregorian_microsecond;
}
void
gswe_timestamp_set_gregorian_timezone(GsweTimestamp *timestamp, gdouble gregorian_timezone_offset)
{
timestamp->priv->gregorian_timezone_offset = gregorian_timezone_offset;
timestamp->priv->valid_dates = VALID_GREGORIAN;
if (timestamp->priv->instant_recalc == TRUE) {
gswe_timestamp_calculate_all(timestamp);
}
gswe_timestamp_emit_changed(timestamp);
}
gdouble
gswe_timestamp_get_gregorian_timezone(GsweTimestamp *timestamp)
{
gswe_timestamp_calculate_gregorian(timestamp);
return timestamp->priv->gregorian_timezone_offset;
}
static void
gswe_timestamp_calculate_julian(GsweTimestamp *timestamp)
{
@ -520,7 +557,8 @@ gswe_timestamp_calculate_julian(GsweTimestamp *timestamp)
g_error("This timestamp object holds no valid values. This can't be good.");
}
swe_utc_time_zone(timestamp->priv->gregorian_year, timestamp->priv->gregorian_month, timestamp->priv->gregorian_day, timestamp->priv->gregorian_hour, timestamp->priv->gregorian_minute, timestamp->priv->gregorian_second + timestamp->priv->gregorian_microsecond / 1000.0, g_time_zone_get_offset(timestamp->priv->gregorian_timezone, 0) / 3600.0, &utc_year, &utc_month, &utc_day, &utc_hour, &utc_minute, &utc_second);
swe_utc_time_zone(timestamp->priv->gregorian_year, timestamp->priv->gregorian_month, timestamp->priv->gregorian_day, timestamp->priv->gregorian_hour, timestamp->priv->gregorian_minute, timestamp->priv->gregorian_second + timestamp->priv->gregorian_microsecond / 1000.0, timestamp->priv->gregorian_timezone_offset, &utc_year, &utc_month, &utc_day, &utc_hour, &utc_minute, &utc_second);
if ((retval = swe_utc_to_jd(utc_year, utc_month, utc_day, utc_hour, utc_minute, utc_second, SE_GREG_CAL, dret, serr)) == ERR) {
g_error("Swiss Ephemeris error: %s", serr);
} else {
@ -563,7 +601,7 @@ gswe_timestamp_new(void)
}
GsweTimestamp *
gswe_timestamp_new_from_gregorian_full(gint year, gint month, gint day, gint hour, gint minute, gint second, gint microsecond, GTimeZone *time_zone)
gswe_timestamp_new_from_gregorian_full(gint year, gint month, gint day, gint hour, gint minute, gint second, gint microsecond, gdouble time_zone_offset)
{
GsweTimestamp *timestamp = GSWE_TIMESTAMP(g_object_new(GSWE_TYPE_TIMESTAMP,
"gregorian-year", year,
@ -573,13 +611,9 @@ gswe_timestamp_new_from_gregorian_full(gint year, gint month, gint day, gint hou
"gregorian-minute", minute,
"gregorian-second", second,
"gregorian-microsecond", microsecond,
"gregorian-timezone-offset", time_zone_offset,
NULL));
if (timestamp->priv->gregorian_timezone != NULL) {
g_time_zone_unref(timestamp->priv->gregorian_timezone);
}
timestamp->priv->gregorian_timezone = g_time_zone_ref(time_zone);
timestamp->priv->valid_dates = VALID_GREGORIAN;
return timestamp;

View File

@ -45,7 +45,7 @@ GType gswe_timestamp_get_type(void);
/* Method definitions */
GsweTimestamp *gswe_timestamp_new(void);
GsweTimestamp *gswe_timestamp_new_from_julian_day(gdouble julian_day);
GsweTimestamp * gswe_timestamp_new_from_gregorian_full(gint year, gint month, gint day, gint hour, gint minute, gint second, gint microsecond, GTimeZone *time_zone);
GsweTimestamp * gswe_timestamp_new_from_gregorian_full(gint year, gint month, gint day, gint hour, gint minute, gint second, gint microsecond, gdouble time_zone_offset);
void gswe_timestamp_set_instant_recalc(GsweTimestamp *timestamp, gboolean instant_recalc);
gboolean gswe_timestamp_get_instant_recalc(GsweTimestamp *timestamp);
void gswe_timestamp_set_gregorian_year(GsweTimestamp *timestamp, gint gregorian_year);
@ -62,6 +62,8 @@ void gswe_timestamp_set_gregorian_second(GsweTimestamp *timestamp, gint gregoria
gint gswe_timestamp_get_gregorian_second(GsweTimestamp *timestamp);
void gswe_timestamp_set_gregorian_microsecond(GsweTimestamp *timestamp, gint gregorian_microsecond);
gint gswe_timestamp_get_gregorian_microsecond(GsweTimestamp *timestamp);
void gswe_timestamp_set_gregorian_timezone(GsweTimestamp *timestamp, gdouble gregorian_timezone_offset);
gdouble gswe_timestamp_get_gregorian_timezone(GsweTimestamp *timestamp);
void gswe_timestamp_set_julian_day(GsweTimestamp *timestamp, gdouble julian_day);
gdouble gswe_timestamp_get_julian_day(GsweTimestamp *timestamp);