1

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. 我的理解正确吗?

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

4

1 回答 1

3

输入将对偏移进行编码,如-0400. 其中的0400一部分将作为tUNUMBER令牌返回(大概是一个无符号值)。此记号由语法规则匹配,可用作$3.

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

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

于 2011-08-25T06:22:29.430 回答