dateコマンドを使用して、「40週目の月曜日」などの日付をISO日付に変換するにはどうすればよいですか?
私は次のように遊んでいます:
date --date='monday week 40' +'%Y-%m-%d'
検索する日付は2011-10-03です。
しかし、私の問題は、この日付文字列が無効であることです。したがって、この問題を解決するには別の方法が必要です。
/ありがとう
答え1
別の方法:
date --date "+$((40-$(date +%V)))weeks last monday" +"%F"
- 40はあなたが検索した週です。
- date +%V は今週を返します(35)。
- 40-35 = 5、追加する週数。
- そこで最後の月曜日を探す
答え2
本当に見苦しく、おそらくGNUでのみ動作しますdate
。
date -d "$( date -d "$( date +'%Y-01-01' ) +40 weeks") -$( date -d "$( date +'%Y-01-01' ) +40 weeks" +'%w' ) days+1 day" +'%Y-%m-%d'
10月3日にのみテストされ、他の場合は失敗する可能性があります。
修正する:英語以外のロケールがある場合は、この作業を開始するには内部日付の出力を指定する必要があります。 (%Fは単なるYYYY-MM-DDです)。
date -d "$(date -d "$(date +'%Y-01-01') +40 weeks" +"%F") -$(date -d "$(date +'%Y-01-01') +40 weeks" +%w) days +1 day" +"%F"
答え3
いいですね。私が試したことは次のとおりです。他の答えからアイデアを盗み、ロジックを理解しやすくします。これはISO 8601システムに基づいているため、米国やカナダなどの国に住んでいる場合は正確ではありませんが、その国では簡単に調整できます。
# sets $week_start to a representation of Monday of the given week
# number formatted via the given format, and similarly sets
# $week_end to Friday of the same week.
get_week_range () {
week_num="$1" date_format="$2"
# Most of the world adhere to ISO 8601 which states that weeks begin on Monday
# and Jan 4th is always in week #1:
#
# http://en.wikipedia.org/wiki/ISO_week_date
#
# For other week numbering systems (e.g. USA, Canada), see:
#
# http://en.wikipedia.org/wiki/Seven-day_week#Week_numbering
day_in_week_1=$( date +'%Y-01-04' )
day_num_in_week_1=$( date -d $day_in_week_1 +%u ) # 1 is Monday
days_from_week_1_start=$(( $day_num_in_week_1 - 1 ))
# This is a Monday:
start_of_week_1=$( date -d "$day_in_week_1 - $days_from_week_1_start days" +%F )
week_delta="$(( $week_num - 1 ))"
# Monday:
week_start=$( date -d "$start_of_week_1 + $week_delta weeks" +"$date_format" )
# Friday:
week_end=$( date -d "$start_of_week_1 + $week_delta weeks + 4 days" +"$date_format" )
}