dateコマンドを使用して、「monday week 40」の日付を確認するにはどうすればよいですか。


11

dateコマンドを使用して、 "monday week 40"などをISO日付に変換するにはどうすればよいですか?

私はこのようなもので遊んでいます:

date --date='monday week 40' +'%Y-%m-%d'

そして、私が探している日付は2011-10-03です。

しかし、私の問題は、この日付文字列が無効であることです。この問題を解決するには、別のアプローチが必要です。

/ありがとう


次のリンクは、番号が付けられた週が始まる年の何日に決定するかについてです。週番号(ウィキペディア) ..今年の1月1日がISO週52にある理由を効果的に説明しています.. 「ユーザー不明」が%V使用するフォーマットシーケンスは、ISO週番号を報告します。
Peter.O、2011

回答:


4

本当に醜く、おそらく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日の例についてのみテストされていますが、他のいくつかのケースでは失敗する可能性があります。


更新:eng以外のロケールを使用している場合は、機能するように内部日付からの出力を指定する必要があります。(そして%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"

1
外側の日付が正しく使用できるように、内側の日付から出力をフォーマットするのに失敗しました。
ヨハン

@Johan、私はデフォルトのフォーマットを使用することに問題はありませんでした。多分それはロケール固有ですか?私はen_USを使用しています。とにかく良い点。
manatwork

日付はスウェーデンのロケールを使用しているため、違いがあります。
ヨハン

ロケールの調整に感謝します。私はカスタム日付形式を使用していて、同じ問題がありました。ほぼ整理しましたが、投稿したので、微調整を使用します。それは良いです。
Peter.O

これがワンライナーである必要はありませんでした。これを複数の行に分割し、説明的な名前の一時変数を使用して、動作を明確にすることをお勧めします。また、Jan 1stは毎年同じ週番号であると想定しています。これは、@ Peter.Oですでに指摘されているとおりではありません
Adam Spiers 2013

5

別のアプローチ:

date --date "+$((40-$(date +%V)))weeks last monday"  +"%F"
  • 40は検索した週です
  • 日付+%Vは現在の週を返します(35)
  • 40-35 = 5、つまり追加する週数
  • そこから、最後の月曜日を探します

良いもの、それは私のカスタム日付設定で動作します。
Peter.O、2011

これは賢いアイデアですが、うまくいきません。たとえば、今日が第41週の月曜日である(つまりをdate +%V返す41)場合、--dateパラメーター値はになります+-1weeks last monday。これは、実際には7日前ではなく2週間前です。
Adam Spiers 2013

私はあなたの批判を理解しているかどうかわかりません。今年は2013年なので、質問の例は当てはまりません。質問の絶対的な日付は何ですか?代わりに私のアプローチは何を返しますか(多分:理由)?
ユーザーが不明である

@AdamSpiers:私のカレンダーは、月曜日、週40、9月30日と表示されます。
不明なユーザー

@userunknownこれは、コードを今日テストするためです。つまり、火曜日は月曜日の後に来ます。あなたが昨日あなたのコードをテストしたなら、それは壊れていただろう。より明確にするために、を実行してみてくださいdate -d 'last monday'。昨日戻ります。昨日実行したとしたら、それは何と言っていたと思いますか?
Adam Spiers 2013

1

はい、これが私の試みです。他の答えからアイデアを盗み出し、ロジックを理解しやすくします。これは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" )
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.