2

日付を次の形式で出力するbashスクリプトを作成したいと思います。

20120205_16
(year)(month)(day)_(24 hour)

したがって、現在の日付に対してこれを行うコマンドは次のとおりです。

date +'20%y%m%d_%H'

私がやりたいのは、指定された日付から別の日付まで、このようなすべての日付を(forループなどを使用して)印刷することです。例えば:

20120205_16 -> 20120305_18 would be:

20120205_16
20120205_17
20120205_18
...
20120305_17
20120305_18

明らかに、ここでの2つのハードビットは、日付の指定と時間単位の増分です。

日付や他の方法でこれを簡単に行うことは可能ですか?

4

3 に答える 3

5

まず、次の形式time_tを使用して値を取得します。%s

start=$(date --date '5 feb 2012 16:00' +%s)
stop=$(date --date '5 mar 2012 18:00' +%s)

これらは秒単位で表されます。それらの値にforループを使用して、値を1時間(3600秒)増やすことができます。

for t in $(seq ${start} 3600 ${stop})
do
    date --date @${t} +'%Y%m%d_%H'
done

引数で取得された@時間を表すために使用されることに注意してください。%+s--date

于 2012-07-20T07:14:45.013 に答える
1

一般的に日付をいじるためのコマンドラインツールのセットを作成しました(dateutils)。それは確かに広く普及していませんが、ポータブルです。

この種のタスクの場合、dseqあなたの友人は、あなたの例は次のように要約されます。

dseq '2012-02-05 16:00:00' 1h '2012-03-05 18:00:00' -f '%Y%m%d_%H'
=>
20120205_16
20120205_17
20120205_18
  ...
20120305_16
20120305_17
20120305_18
于 2012-07-20T07:28:10.893 に答える
1

これはGawkでもうまく行うことができます:

gawk -v start="2011 10 10  10 00 00" \
     -v end="2011 11 10  10 00 00" '

BEGIN {
  time = mktime( start )
  end = mktime( end )
  while ( time <= end ) {
    print strftime( "%Y%m%d_%H", time )
    time +=3600
  }
}'
于 2012-07-20T08:33:12.123 に答える