c - getdate.y语法疑惑

标签 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;这意味着它比 UTC 晚了 0400 小时。因此,要将其转换为 UTC,请向其添加 0400 小时,它会变为 2011-01-02T14:15:20。我的理解正确吗?

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

最佳答案

输入会将偏移量编码为 -04000400 部分将作为 tUNUMBER 标记返回(可能包含一个无符号值)。此标记符合语法规则,可用作$3

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

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

关于c - getdate.y语法疑惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7185737/

相关文章:

c++ - 如何将头文件放入 Bison 中的 .tab.h?

c - yacc/bison 操作的范围是什么?

c - '目标无法到达' ('Port unreachable' ) 将数据发送到 127.0.0.1 (localhost) 上的 UDP 套接字时

outlook - ICS 文件中缺少 Olsen TZ TZID 格式是否有解决方法

javascript - 如何从用户日期和时区输入正确地在数据库中存储UTC日期?

javascript - 获取月份的第一天将仅在 alert() 上返回正确的日期

c++ - 使用 Bison-generated-compiler 编译源代码

c - 发送到 : Operation not permitted: netsnmp

c - 一次从文件中读取 2 行,然后在 C 中交替将两行合并为一行

c - 打印无限值