diff --git a/lib/modules/Calendar.pmod/Gregorian.pmod b/lib/modules/Calendar.pmod/Gregorian.pmod
index 2bb43ae2ea4cdb3daf262e61419c9d1ef5dec3e8..c4d170c5d23fd7cd6dbb59dca476abaa2b68b502 100644
--- a/lib/modules/Calendar.pmod/Gregorian.pmod
+++ b/lib/modules/Calendar.pmod/Gregorian.pmod
@@ -1448,8 +1448,8 @@ object parse(string fmt,string arg)
 
    mapping m=mkmapping(q,res);
 
-   if (m->Y) m->year=Year(m->Y);
-   else if (m->y) 
+   if (!zero_type(m->Y)) m->year=Year(m->Y);
+   else if (!zero_type(m->y))
    {
       if (m->y<70) m->y+=2000;
       else if (m->y<100) m->y+=1900;
@@ -1470,16 +1470,16 @@ object parse(string fmt,string arg)
 
    if (m->D)
       m->day=low=(m->month||Month())->day(m->D);
-   else if (m->a)
+   else if (!zero_type(m->a))
       m->day=low=m->year->day(m->a);
-   else if (m->e)
+   else if (!zero_type(m->e))
       m->day=low=(m->week||Week())->day(m->e);
    
-   if (m->h)
+   if (!zero_type(m->h))
       low=m->hour=(m->day||Day())->hour(m->h);
-   if (m->m)
+   if (!zero_type(m->m))
       low=m->minute=(m->hour||Hour())->minute(m->m);
-   if (m->s)
+   if (!zero_type(m->s))
       low=m->second=(m->minute||Minute())->second(m->s);
 
    return low;