如何使用當前時間以分鐘生成當前時間的文件。如何使用當前時間以分鐘生成當前時間的文件
例如,如果時間是date '+%H:%M'
(02:28)我希望小時和分鐘如下。
Output:
00:00
00:01
00:02
00:03
.
.
.
.
02:28
如何使用當前時間以分鐘生成當前時間的文件。如何使用當前時間以分鐘生成當前時間的文件
例如,如果時間是date '+%H:%M'
(02:28)我希望小時和分鐘如下。
Output:
00:00
00:01
00:02
00:03
.
.
.
.
02:28
足夠言自明:
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
我們在工作中遇到了一個棘手的情況:巴西每年有一天沒有午夜。 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
哇!確實棘手! – anishsane 2014-10-31 14:01:42
等一分鐘。不能保證由夏令時引起的時間跳變總是會在T = 00:00發生,並且在其他時間也可能發生。例如檢查'zdump -v歐洲/基希訥烏| grep 2014' ... – anishsane 2014-10-31 14:15:29
是的,沒錯。這就是爲什麼所有日期算法都是以UTC完成的,並且我將其轉換爲本地時區以顯示時間。我在工作時遇到的錯誤是我有一些代碼,比如「在這樣的一天給我一個午夜的時間對象」,並且在2014-10-19爲巴西時區拋出了一個錯誤。與日期時間一起工作同時令人着迷和激怒。 – 2014-10-31 14:24:16
或者,使用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)
}
}
另一個AWK方式
awk 'BEGIN{i=((x=systime())-x%86400)}{while(x>i){print strftime("%H:%M",i);i+=60}}' <<< ""
注意:eval是必需的,僅僅是因爲'{a..b}'結構裏面的變量.. – anishsane 2014-10-31 13:42:39