特定の週月曜日のISO日付を取得するには?たとえば、2021年の32週目の月曜日?
出馬すると、date -dmonday +%Y%m%d
今週の月曜日の日付がわかります。2021
andを32
変数として渡し、その週の月曜日の日付をどのように取得できますか?
答え1
これはうまくいくようです。
#! /bin/bash
year=$1
week=$2
read s w d < <(date -d $year-01-01T13:00 '+%s %V %u')
(( s += ((week - w) * 7 - d + 1) * 24 * 60 * 60 ))
date -d @$s '+%V:%w %Y-%m-%d %a'
試験用
for y in {1970..2022} ; do
maxw=$(date +%V -d $y-12-31)
if (( max == 1 )) ; then # The last day of the year belongs to week #1.
max=52
fi
for ((w=1; w<=maxw; ++w)) ; do
date.sh $y $w | tail -n1 | grep -q "0\?$w:1 " || echo $y $w
done
done
date.sh
上記のスクリプトはどこにありますか?
答え2
WikipediaにはISO週間日付に関する記事があります。
「最初の週」は、最初の木曜日がある週として定義されます。記事では、これは1月4日が常に1週目に該当するのと同じであると指摘します。 GNU Dateでは、次の日付を指定できますdate -d "Jan 4 2021 +3 weeks"
。ㅏ日付は通常月曜日ではなく4週目です。
日付を使用して曜日を検索し、要求する日付を調整するために使用できます。
#!/bin/bash
# pass in $1 as the week number and $2 as the year
# Make sure we are no going to be bothered by daylight saving time
# Use explicit time idea from https://unix.stackexchange.com/a/688968/194382
export TZ=UTC
# Jan 4th is always in week 1. ask for the day of the week that is
# $1-1 weeks ahead. %u gives 1 for Monday, 2 for tuesday, ...
weekday=$(date -d"13:00 Jan 4 $2 +$(($1 -1)) weeks" "+%u")
# So now just go back 0 days for a monday, 1 day for tuesday ...
# Could use Jan 5 and go back 1 day for monday instead.
date -d"13:00 Jan 4 $2 +$(($1 -1)) weeks -$((weekday -1)) days" "+%a %F (%G %V)"
したがって、2021年の最初の週の月曜日は2021-01-04であり、2020年の場合は2019-12-30(例:前年末)であることを示しています。
答え3
これは少なくとも2000年から2025年まで有効です。
Y=2021
W=32
LC_ALL=C date -d"${Y}0101 ${W} week -$(date -d"${Y}0104" +%u) day -3day"
Mon Aug 9 00:00:00 CEST 2021
プレフィックスは効果をLC_ALL=C
削除します。locale
答え4
これはonelinerを使用してPythonを介して実行できます。
echo "2021 32"| python3 -c 'import datetime as dt; print(dt.datetime.strptime(input()+" 1", "%G %V %u").strftime("%Y-%m-%d"));'
2021-08-09
これをBASH関数でラップし、水曜日(曜日= 3)など、1〜7週間の異なる曜日に明示的に使用できます。
> iso_year_week_day() { echo "$1 $2 $3" | python3 -c 'import datetime as dt; print(dt.datetime.strptime(input(), "%G %V %u").strftime("%Y-%m-%d"));'; }
>
> iso_year_week_day 2021 32 3
2021-08-11
> iso_year_week_day 2022 52 7
2023-01-01
> q=$(iso_year_week_day 2021 32 3)
> echo $q
2021-08-11
PS もちろん、出力形式は編集で簡単に調整できます。strftime("%Y-%m-%d")