2014-10-31 61 views

回答

0

足夠言自明:

h=`date +%H` 
m=`date +%M` 
eval printf '%s\\n' "{00..$((h-1))}:{00..59} $h:{00..$m}" 

正如格倫指出的那樣,是被記錄的無效時間的問題,在日光節約時。 要處理這種情況,您可以再次通過date命令傳遞上述輸出。 (慢)

eval printf '%s\\n' "{00..$((h-1))}:{00..59} $h:{00..$m}" | xargs -n1 date "+%H:%M" -d 2>/dev/null 
+0

注意:eval是必需的,僅僅是因爲'{a..b}'結構裏面的變量.. – anishsane 2014-10-31 13:42:39

1

我們在工作中遇到了一個棘手的情況:巴西每年有一天沒有午夜。 00:00是無效時間。那是因爲時鐘在午夜前跳了一個小時。

一種安全的方式來處理夏令時是這樣的:

perl -MDateTime -E ' 
    $tz = DateTime::TimeZone->new(name => "local"); 
    $local = DateTime->now(time_zone => $tz); 
    $utc = $local->clone->set_time_zone("UTC"); 
    $today = $local->strftime("%F"); 
    while ($local->strftime("%F") eq $today) { 
     say $local->strftime("%H:%M"); 
     $utc->subtract(minutes => 1); 
     $local = $utc->clone->set_time_zone($tz); 
    } 
' | tac > file 

爲了證明巴西的「問題」,試試這個,注意這一天的第一分鐘是01:00

perl -MDateTime -E ' 
    $tz = DateTime::TimeZone->new(name => "America/Sao_Paulo"); 
    $local = DateTime->now(time_zone=>$tz)->set(year=>2014, month=>10, day=>19); 
    $utc = $local->clone->set_time_zone("UTC"); 
    $today = $local->strftime("%F"); 
    while ($local->strftime("%F") eq $today) { 
     say $local->strftime("%H:%M"); 
     $utc->subtract(minutes => 1); 
     $local = $utc->clone->set_time_zone($tz); 
    } 
' | tac > file 
+0

哇!確實棘手! – anishsane 2014-10-31 14:01:42

+0

等一分鐘。不能保證由夏令時引起的時間跳變總是會在T = 00:00發生,並且在其他時間也可能發生。例如檢查'zdump -v歐洲/基希訥烏| grep 2014' ... – anishsane 2014-10-31 14:15:29

+0

是的,沒錯。這就是爲什麼所有日期算法都是以UTC完成的,並且我將其轉換爲本地時區以顯示時間。我在工作時遇到的錯誤是我有一些代碼,比如「在這樣的一天給我一個午夜的時間對象」,並且在2014-10-19爲巴西時區拋出了一個錯誤。與日期時間一起工作同時令人着迷和激怒。 – 2014-10-31 14:24:16

0

或者,使用AWK:

BEGIN { 
    split(strftime("%H %M"),A,/ /) 
    for (H = 0; H < A[1]; H++) { 
     for (M = 0; M < 60; M++) { 
      printf("%02d:%02d\n", H, M) 
     } 
    } 
    for (M=0; M<A[2]; M++) { 
     printf("%02d:%02d\n", H, M) 
    } 
} 
0

另一個AWK方式

awk 'BEGIN{i=((x=systime())-x%86400)}{while(x>i){print strftime("%H:%M",i);i+=60}}' <<< ""