2

Unix で、特定の月と年の最後の土曜日の日付 (月の日) を見つけたいと考えています。cal特定の月/年のカレンダーが表示されることを知っています。最後の土曜日を取得する良い方法は何ですか?

更新: 任意の曜日に適用できるソリューションが欲しいです。たとえば、同じ方法を使用して、先週の日曜日または水曜日の日付も見つけることができます。

4

3 に答える 3

3

そのために awk を使用します。このことを考慮:

cal 5 2013 | awk 'NF>6{a=$7} END{print a}'

出力:

25
于 2012-05-03T17:14:35.080 に答える
0

cal出力を単にパイプ/解析したくない場合は、アルゴリズムを使用して date の曜日を決定し、 12 月 31 日の曜日を取得して、土曜日にするのに必要な日数を遡ることができます。

しかし、 cal の解析はおそらくもっと簡単です。

于 2012-05-03T17:23:04.740 に答える
0

この質問には別の答えがあります。これは少し長い Bash スクリプトであり、あまり効率的ではありませんが、理解しやすいものです。基本的な考え方は、指定された月と年の 22 日から 31 日までをループし、これらの各日の曜日を で確認することdate +'%u'です。これが希望する曜日を返す最後の日 (例: 土曜日) は変数RESULT_DAYに格納され、ループ後の結果が含まれます。

#!/bin/bash

DAY_OF_WEEK=6 # 1=Monday, ..., 7=Sunday
THE_YEAR=2016
THE_MONTH=10


RESULT_DAY=0

YEAR_MONTH_STR=${THE_YEAR}"-"${THE_MONTH}  # Example value: "2016-10"

for DAYNO in 22 23 24 25 26 27 28 29 30 31
do
  DATE_TO_CHECK=${YEAR_MONTH_STR}"-"${DAYNO}
  DATE_RESULT=$(date --date=$DATE_TO_CHECK '+%u')
  if [ $? -eq 0 ]
  then
    if [ $DATE_RESULT -eq $DAY_OF_WEEK ]
    then
      RESULT_DAY=$DAYNO
    fi
  fi

done

RESULT_DATE_COMPLETE=${YEAR_MONTH_STR}"-"${RESULT_DAY}

echo -e "\nResult date (YYYY-MM-DD): "$(date --date=$RESULT_DATE_COMPLETE +'%Y-%m-%d (%A)')

"0"をチェックすることでdateの結果コードをチェックするため、不正な日 (たとえば、存在しない 2 月 31 日) を無視できます。$?

月の 22 日は、考慮しなければならない最も早い日付です。これは、最も短い月 (うるう年以外の 2 月) では、土曜日などの最後の発生の最も早い日だからです。

于 2016-10-12T18:38:44.117 に答える