日付:年と週番号で始まり、月曜日の日付を取得する方法

日付:年と週番号で始まり、月曜日の日付を取得する方法

特定の週月曜日のI​​SO日付を取得するには?たとえば、2021年の32週目の月曜日?

出馬すると、date -dmonday +%Y%m%d今週の月曜日の日付がわかります。2021andを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")

関連情報