2011-08-25 155 views
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=0getdate.y語法懷疑

我想了解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。我的理解是否正確?

這是如何在上面粘貼的代碼塊中實現的?

回答

3

輸入將編碼像-0400這樣的偏移量。 0400的部分將作爲tUNUMBER令牌返回(大概持有無符號值)。該標記符合語法規則,可用作$3

要從值400中獲得以分鐘爲單位的實際偏移量,首先必須將其分成兩部分。小時部分可以用$3/100(即4)獲得,分鐘部分用$3 % 100(即0)獲得。由於每小時有60分鐘,因此您將小時數乘以60,並將分鐘數加上($3 % 100 + ($3/100) * 60),這會得出值240。然後剩下的就是添加符號,並將其存儲在yyTimezone中。

畢竟,yyTimezone將包含以分鐘爲單位的時區偏移量。

+0

x%100和x/100 - 這個圖案應該有lite燈泡:D;無論如何,謝謝你的迴應。 – hari