diff --git a/gst/gstdatetime.c b/gst/gstdatetime.c
index ec98293..17e98c0 100644
--- a/gst/gstdatetime.c
+++ b/gst/gstdatetime.c
@@ -49,10 +49,22 @@
 #define GST_DATE_TIME_USEC_PER_SECOND      (G_GINT64_CONSTANT (1000000))
 #define GST_DATE_TIME_USEC_PER_MILLISECOND (G_GINT64_CONSTANT (1000))
 
+typedef enum
+{
+  BAD_DATE,
+  HAS_Y,           /* has year */
+  HAS_YM,          /* has year and month */
+  HAS_YMD,         /* has year mont and day */
+  HAS_YMD_H,
+  HAS_YMD_HM,
+  HAS_YMD_HMS
+} datetime_fields;
+
 struct _GstDateTime
 {
   GDateTime *datetime;
 
+  datetime_fields fields;
   volatile gint ref_count;
 };
 
@@ -82,7 +94,10 @@ gst_date_time_new_from_gdatetime (GDateTime * dt)
 gint
 gst_date_time_get_year (const GstDateTime * datetime)
 {
-  return g_date_time_get_year (datetime->datetime);
+  if (datetime->fields >= HAS_Y)
+    return g_date_time_get_year (datetime->datetime);
+  else
+    return 0;
 }
 
 /**
@@ -97,7 +112,10 @@ gst_date_time_get_year (const GstDateTime * datetime)
 gint
 gst_date_time_get_month (const GstDateTime * datetime)
 {
-  return g_date_time_get_month (datetime->datetime);
+  if (datetime->fields >= HAS_YM)
+    return g_date_time_get_month (datetime->datetime);
+  else
+    return 0;
 }
 
 /**
@@ -112,7 +130,10 @@ gst_date_time_get_month (const GstDateTime * datetime)
 gint
 gst_date_time_get_day (const GstDateTime * datetime)
 {
-  return g_date_time_get_day_of_month (datetime->datetime);
+  if (datetime->fields >= HAS_YMD)
+    return g_date_time_get_day_of_month (datetime->datetime);
+  else
+    return 0;
 }
 
 /**
@@ -267,10 +288,45 @@ GstDateTime *
 gst_date_time_new_local_time (gint year, gint month, gint day, gint hour,
     gint minute, gdouble seconds)
 {
+  g_return_val_if_fail (year > 0 && year <= 9999, NULL);
+  g_return_val_if_fail ((month > 0 && month <= 12), NULL);
+  g_return_val_if_fail ((day > 0 && day <= 31), NULL);
+  g_return_val_if_fail (hour >= 0 && hour < 24, NULL);
+  g_return_val_if_fail (minute >= 0 && minute < 60, NULL);
+  g_return_val_if_fail (seconds >= 0 && seconds < 60, NULL);
+
   return gst_date_time_new_from_gdatetime (g_date_time_new_local (year, month,
           day, hour, minute, seconds));
 }
 
+GstDateTime *
+gst_date_time_new_y (gint year)
+{
+  GstDateTime *datetime;
+  datetime = gst_date_time_new_local_time(year, 1, 1, 1, 1, 1);
+  datetime->fields = HAS_Y;
+  return datetime;
+}
+
+GstDateTime *
+gst_date_time_new_ym (gint year, gint month)
+{
+  GstDateTime *datetime;
+  datetime = gst_date_time_new_local_time(year, month, 1, 1, 1, 1);
+  datetime->fields = HAS_YM;
+  return datetime;
+}
+
+GstDateTime *
+gst_date_time_new_ymd (gint year, gint month, gint day)
+{
+  GstDateTime *datetime;
+  datetime = gst_date_time_new_local_time(year, month, day, 1, 1, 1);
+  datetime->fields = HAS_YMD;
+  return datetime;
+}
+
+
 /**
  * gst_date_time_new_now_local_time:
  *
@@ -351,6 +407,14 @@ gst_date_time_new (gfloat tzoffset, gint year, gint month, gint day, gint hour,
   GDateTime *dt;
   gint tzhour, tzminute;
 
+  g_return_val_if_fail (year > 0 && year <= 9999, NULL);
+  g_return_val_if_fail ((month > 0 && month <= 12), NULL);
+  g_return_val_if_fail ((day > 0 && day <= 31), NULL);
+  g_return_val_if_fail (hour >= 0 && hour < 24, NULL);
+  g_return_val_if_fail (minute >= 0 && minute < 60, NULL);
+  g_return_val_if_fail (seconds >= 0 && seconds < 60, NULL);
+  g_return_val_if_fail (tzoffset >= -12.0 && tzoffset <= 12.0, NULL);
+
   tzhour = (gint) ABS (tzoffset);
   tzminute = (gint) ((ABS (tzoffset) - tzhour) * 60);
 
diff --git a/gst/gstdatetime.h b/gst/gstdatetime.h
index 96d8bbd..b7d5892 100644
--- a/gst/gstdatetime.h
+++ b/gst/gstdatetime.h
@@ -51,6 +51,10 @@ GstDateTime *   gst_date_time_new_local_time            (gint year, gint month,
                                                          gint day, gint hour,
                                                          gint minute,
                                                          gdouble seconds) G_GNUC_MALLOC;
+GstDateTime *   gst_date_time_new_y                     (gint year) G_GNUC_MALLOC;
+GstDateTime *   gst_date_time_new_ym                    (gint year, gint month) G_GNUC_MALLOC;
+GstDateTime *   gst_date_time_new_ymd                   (gint year, gint month,
+                                                         gint day) G_GNUC_MALLOC;
 GstDateTime *   gst_date_time_new                       (gfloat tzoffset,
                                                          gint year, gint month,
                                                          gint day, gint hour,
