Linux "date" 명령을 사용하여 6시간짜리 일일 날짜 시리즈(하루 4시간 단계)를 구축하세요.

Linux "date" 명령을 사용하여 6시간짜리 일일 날짜 시리즈(하루 4시간 단계)를 구축하세요.

'N'년 동안 매일 6시간 분량의 데이트 시리즈를 구성하려고 합니다. 나는 이것을하려고 노력한다

for i in {1..1825}; do 
date -d "00:00 01-01-1998 +6 hours" +"%d-%m-%Y %H:%M"
done

그러나 그것은 내가 원하는 것이 아닙니다.

내 목표는 이것을 순서대로 만드는 것입니다.

01-01-1998 00:00 
01-01-1998 06:00 
01-01-1998 12:00 
01-01-1998 18:00 
02-01-1998 00:00 
02-01-1998 06:00
02-01-1998 12:00 
02-01-1998 18:00 
.
.
.etc

명령을 사용하여 이 작업을 어떻게 date수행할 수 있나요?

어떤 도움이라도 대단히 감사하겠습니다. 미리 감사드립니다.

답변1

일광 절약 시간제에 대해 걱정해야 합니다. 예를 들어 내 시간대는 캐나다/동부이고 다음과 같습니다.

$ d=$(date -d "2020-03-08 00:00:00")
$ echo $d
Sun Mar 8 00:00:00 EST 2020
$ d=$(date -d "$d + 6 hours")
$ echo $d
Sun Mar 8 07:00:00 EDT 2020
# ........^^

그리고

$ d=$(date -d "2020-11-01 00:00:00")
$ echo $d
Sun Nov 1 00:00:00 EDT 2020
$ d=$(date -d "$d + 6 hours")
$ echo $d
Sun Nov 1 05:00:00 EST 2020
# ........^^

시간대에 UTC를 지정해야 합니다.

$ d=$(date -u -d "2020-11-01 00:00:00")
$ echo $d
Sun Nov 1 00:00:00 UTC 2020
$ d=$(date -u -d "$d + 6 hours")
$ echo $d
Sun Nov 1 06:00:00 UTC 2020
# ........^^

그래서:

fmt='%d-%m-%Y %H:%M'
d=$(date -u -d "1998-01-01 00:00:00")
for i in {1..1825}; do 
    # print the current date
    date -u -d "$d" "+$fmt"
    # add 6 hours
    d=$(date -u -d "$d + 6 hours")
done

ISO 날짜 형식인 YYYY-mm-dd를 사용하는 것이 좋습니다. 이는 명확한 날짜 형식이며 어휘 및 시간순으로 정렬됩니다.

답변2

계산된 각 날짜를 변수에 저장하고 이를 사용하여 다음 날짜를 계산할 수 있습니다. date지정한 형식을 구문 분석할 수 없기 때문에 표준 로케일의 기본 형식을 사용하여 날짜를 저장하고 있습니다 .

# start date
d=$(LC_ALL=C date -d "1998-01-01 00:00")
echo "# d=$d"
# convert format
date -d "$d" +"%d-%m-%Y %H:%M"

for i in {1..1825}; do 
    # add 6 hours
    d=$(LC_ALL=C date -d "$d +6 hours")
    # convert format
    date -d "$d" +"%d-%m-%Y %H:%M"
done

이 인쇄

# d=Thu Jan  1 00:00:00 CET 1998
01-01-1998 00:00
01-01-1998 06:00
01-01-1998 12:00
01-01-1998 18:00
02-01-1998 00:00
02-01-1998 06:00
02-01-1998 12:00
02-01-1998 18:00
03-01-1998 00:00
03-01-1998 06:00
03-01-1998 12:00
03-01-1998 18:00
04-01-1998 00:00
04-01-1998 06:00
...

결과는 시간대 및 일광 절약 시간제 규칙에 따라 달라집니다.

시작 시간 지정은 시간대를 지정하지 않기 때문에 모호할 수 있습니다.

편집하다기반으로폴 페던트다음 의견:

+ $i 일 동안의 외부 루프와 하드코딩된 00, 06, 12, 18의 내부 루프를 만듭니다. 분기 날짜 프로세스를 실행하며 DST 변경에 관심이 없습니다.

# start date
d=$(LC_ALL=C date -d "1998-01-01 00:00")
echo "# d=$d"

for i in {1..456}; do 
    # convert (partial) format
    out=$(date -d "$d" +"%d-%m-%Y")
    for h in 00 06 12 18; do
        echo "$out $h:00"
    done
    # add 1 day
    d=$(LC_ALL=C date -d "$d +1 day")
done

일반 시간과 일광 절약 시간 사이를 전환할 때 예상되는 사항에 대해 질문에 구체적으로 기재해 주세요. (DST로 전환할 경우 엄격하게 00:00, 06:00, 12:00, 18:00 또는 정확히 6시간을 인쇄합니다.)

편집하다기반으로글렌 잭맨~의답변

-u모든 호출에 옵션을 추가하면 date스크립트가 Glenn Jackman이 작성한 스크립트와 거의 동일해지며 일광 절약 시간에 관계없이 엄격하게 00:00, 06:00, 12:00, 18:00으로 인쇄됩니다.

답변3

GNU를 사용하면 date시작점에 시간을 늘릴 수 있습니다

start="$(date +'%Y-%m-%d')"
for i in {0..1825}
do
    date --date "$start +$((i*6)) hours" +'%d-%m-%Y %H:%M'
done

6시간 간격은 동일하게 유지되지만 현재 위치(영국 시간대)로 인해 여름 시간과 겨울 시간 사이의 전환으로 인해 실제 시간이 변경됩니다.

24-10-2020 00:00
24-10-2020 06:00
24-10-2020 12:00
24-10-2020 18:00
25-10-2020 00:00
25-10-2020 05:00    ← Six hours on from midnight because the clock goes back one hour at 03:00
25-10-2020 11:00
25-10-2020 17:00
25-10-2020 23:00

간격을 자정, 오전 6시, 정오, 오후 6시(여름/겨울 시간 간 가능한 전환에 관계없이)로 설정할지 또는 간격을 정확히 6시간 간격으로 고정할지 여부는 질문에 지정되어 있지 않습니다.

date --utc단지 대신을 사용하면 date시간대에 관계없이 일련의 날짜 시간이 6시간 간격으로 표시되도록 할 수 있습니다.

관련 정보