getdate.y语法疑惑

时间:2011-08-25 05:57:10

标签: c timezone bison freebsd getdate

http://www.freebsd.org/cgi/cvsweb.cgi/~checkout~/src/usr.bin/tar/Attic/getdate.y?rev=1.9.12.1;content-type=text%2Fplain;hideattic=0

我想了解如何在下面的代码中计算yyTimezone

| bare_time  '+' tUNUMBER {
    /* "7:14+0700" */
    yyDSTmode = DSToff;
    yyTimezone = - ($3 % 100 + ($3 / 100) * 60);
}
| bare_time '-' tUNUMBER {
    /* "19:14:12-0530" */
    yyDSTmode = DSToff;
    yyTimezone = + ($3 % 100 + ($3 / 100) * 60);
}

我的理解是,假设时间戳为2011-01-02T10:15:20-04:00;这意味着0400小于UTC小时。因此,要将其转换为UTC,您需要将0400小时添加到其中,它将变为2011-01-02T14:15:20。我的理解是否正确?

我在上面粘贴的代码块中是如何实现的?

1 个答案:

答案 0 :(得分:3)

输入将像-0400一样编码偏移量。其中0400部分将作为tUNUMBER令牌返回(可能包含无符号值)。此标记与语法规则匹配,可用作$3

要从值400获得以分钟为单位的实际偏移量,首先必须将其分成两半。小时部分可以使用$3 / 100(即4)获得,而小时部分可以使用$3 % 100(即0)获得。由于一小时内有60分钟,因此您将小时数乘以60,并将分钟数添加到该值($3 % 100 + ($3 / 100) * 60),这将得到值240。然后剩下的就是添加符号,并将其存储在yyTimezone

毕竟,yyTimezone将包含以分钟为单位的时区偏移量。