anchor.diff:        rel               { $$ = $0; } ;
   
   iso_8601_datetime:
  -    iso_8601_date 'T' iso_8601_time { $$.date = g_date_time_new_local(
  -                $0.year,$0.month,$0.day,$2.hour,$2.min,$2.sec); 
  -            if (!$$.date) { 
  +    iso_8601_date ('T'|) iso_8601_time timezone_suffix { $$.date = g_date_time_new($3.zone,
  +                $0.year,$0.month,$0.day,$2.hour,$2.min,$2.sec);
  +            if (!$$.date) {
                   _parser->syntax_errors++;
                   return 0;
               } } |
  -    timezone iso_8601_date 'T' iso_8601_time { $$.date = g_date_time_new($0.zone,
  -                $1.year,$1.month,$1.day,$3.hour,$3.min,$3.sec); 
  -            if (!$$.date) {
  -                _parser->syntax_errors++;
  -                return 0;
  -            } } ;
  +    timezone iso_8601_date ('T'|) iso_8601_time { $$.date = g_date_time_new($0.zone,
  +                $1.year,$1.month,$1.day,$3.hour,$3.min,$3.sec);
  +            if (!$$.date) {
  +                _parser->syntax_errors++;
  +                return 0;
  +            } } |
  +        iso_8601_date timezone_suffix { $$.date = g_date_time_new($1.zone,
  +                $0.year,$0.month,$0.day,0,0,0);
  +            if (!$$.date) {
  +                _parser->syntax_errors++;
  +                return 0;
  +            } } |
  +    timezone iso_8601_date { $$.date = g_date_time_new($0.zone,
  +                $1.year,$1.month,$1.day,0,0,0);
  +            if (!$$.date) {
  +                _parser->syntax_errors++;
  +                return 0;
  +            }
  +        } ;
   
   iso_8601_date:
  -    uint sint sint { $$ = _date_node($0.i,$1.i,$2.i,0,0,0); };
  +    uint '-' uint '-' uint { $$ = _date_node($0.i,$2.i,$4.i,0,0,0); };
   
   iso_8601_time:
          int                  { $$=_date_node(0,0,0,$0.i,0,0); }
  
positive.code: 
  timezone: 'TZ' '=' "[a-zA-Z0-9]*" {
              char* tmp_str=strndup($n2.start_loc.s,$n2.end-$n2.start_loc.s);
              //printf("Timezone %s\n",tmp_str);
              $$.zone=g_time_zone_new(tmp_str);
              //printf("Zone at %p\n",$$.zone);
              free(tmp_str);
            };
  
  // The easy case first :)
  spec: '@' int {
  
negative.code:             $$.sec  *= $0.i;
          };
  
  rel_spec:('year'|'years')                   { $$ = _date_node(1,0,0,0,0,0); } |
          ('month'|'months')                  { $$ = _date_node(0,1,0,0,0,0); } |
          ('week'|'weeks')                    { $$ = _date_node(0,0,7,0,0,0); } |
          ('day'|'days')                      { $$ = _date_node(0,0,1,0,0,0); } |
          ('hour'|'hours')                    { $$ = _date_node(0,0,0,1,0,0); } |
          ('min'|'minute'|'minutes')          { $$ = _date_node(0,0,0,0,1,0); } |
          ('sec'|'secs'|'second'|'seconds')   { $$ = _date_node(0,0,0,0,0,1); } ;
  
  int_or_prefix: int { $$.i=$0.i; } | prefix { $$.i=$0.i; };
  
  