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
将包含时区偏移量(分钟)。