逆引きFormula 2.0 に戻る

Notion しゅふ会にて以下の質問がありました。

週番号から、その週の月曜日の日付を取得するフォーミュラって、どう書いたらいいのでしょう?

週は月曜始まりで、年はその年のものでいいという話だったので、すでに存在する二つの逆引き記事を紹介しました。

  1. 週の初めの月曜日の日付を得るには?
  2. 日付・週(日曜始まり)・週(月曜始まり)・月・クオータを一意に示す文字列を作成するには?

後者のものを使って、今日の曜日番号を取得できるので、その数値と与えられた週番号との差分を使うと計算できそうです。面白そうなので、この記事も作ることにしました。一つだけ懸念があって、1/1 が月曜日でなければ、前の年の日付が月曜日になるので、週番号が 53 になります。1 だけは次の年の月曜日が出てしまう可能性もありそうです。

  1. 今週の月曜日を取得したのちに週番号との差分を加算する

    lets(
     /* 現在時刻から今日の日付を作成し、変数 td に代入 */
     td, now().formatDate("YYYY-MM-DD").parseDate(),
     /* td から曜日を減算し、今週の月曜日の日付を作成し、変数 md に代入 */
     md, td.dateSubtract(td.day() - 1, "days"),
     /* md からその週の週番号を計算し、変数 wn に代入 */
     wn, md.week(),
      /* 週番号プロパティとの週差分を調整 */
      md.dateAdd(prop("週番号") - wn, "weeks")
    )
    

    nowformatDateparseDatedateSubtractday-, subtractweekdateAdd

  2. parseDate を調べていたら週番号で日付が作れることがわかった。上の苦労はなんだったのか

    /* 週番号を二桁にした文字列を wnum にする */
    let(wnum,	
    	/* 週番号に100を足したものを3桁の文字列に変換 */	
    	(prop("週番号")+100).format()
    		/* 先頭の1を外して2桁の数字にする -> wnum に代入 */
    		.substring(1),
    	/* 現在の年と週番号を -W を使って連結 (例: 2023W01) */
    	[now().year(), wnum].join("W")
    	  /* ISO8601 の週番号文字列を日付に変換 */
    		.parseDate()
    )
    

週番号→月曜日の日付