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。我的理解正确吗?
在上面粘贴的代码块中是如何实现的?

最佳答案

输入将像-0400那样对偏移量进行编码。其中的0400部分将作为tUNUMBER标记返回(可能包含无符号值)。此标记由语法规则匹配,可以用作$3
要从值400中以分钟为单位获得实际偏移量,首先必须将其分成两半。小时部分可用$3 / 100(即4)获得,分钟部分用$3 % 100(即0)获得。因为一小时有60分钟,所以你把小时乘以60,再加上分钟($3 % 100 + ($3 / 100) * 60),就得到了值240。剩下的就是添加标志,并将其存储在yyTimezone中。
之后,yyTimezone将包含时区偏移量(分钟)。

08-18 09:31