getdate.y грамматические сомнения - PullRequest
1 голос
/ 25 августа 2011

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 Ответ

3 голосов
/ 25 августа 2011

Вход будет кодировать смещение как -0400. Часть 0400 этого будет возвращена как токен tUNUMBER (предположительно, содержащий значение без знака). Этот токен соответствует правилам грамматики и может использоваться как $3.

Чтобы получить фактическое смещение в минутах от значения 400, сначала нужно разделить его на две половины. Часть часов может быть получена с помощью $3 / 100 (т. Е. 4), а часть минут - с $3 % 100 (т. Е. 0). Поскольку в часе 60 минут, вы умножаете количество часов на 60 и добавляете к этому количество минут ($3 % 100 + ($3 / 100) * 60), что дает значение 240. Тогда все, что осталось, это добавить знак и сохранить его в yyTimezone.

После всего этого yyTimezone будет содержать смещение часового пояса в минутах.

...