'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시간 간격으로 표시되도록 할 수 있습니다.