Thành viên:Plantaest/SimpleUpdate/Bài theo tuần

Bách khoa toàn thư mở Wikipedia

Thuật toán tìm số thứ tự theo năm của ngày đầu tiên (thứ 2) trong tuần và năm được cho (đầu vào là năm và số thứ tự tuần trong năm).

Tham khảo: Stackoverflow

Bước 1: Lấy đối tượng ngày 1/1 của năm được cho, ví dụ là 1/1/2020:

{{#time: d-m-Y | 2020-01-01 }} → 01-01-2020

Bước 2: Tính độ lệch giữa thứ của ngày 1/1 của năm được cho so với thứ năm. Nếu thứ của ngày 1/1 là thứ 2, 3, 4, 5, CN (tương đương chỉ số 1, 2, 3, 4, 0) thì dùng công thức: 4 - thứ tự ngày 1/1 trong tuần. Nếu thứ của ngày 1/1 là thứ 6, 7 (tương đương chỉ số 5, 6) thì dùng công thức: 11 - thứ tự ngày 1/1 trong tuần:

{{#ifexpr: {{#time: w | 2020-01-01 }} = 5 or {{#time: w | 2020-01-01 }} = 6
  |{{#expr: 11 - {{#time: w | 2020-01-01 }} }}
  |{{#expr: 4 - {{#time: w | 2020-01-01 }} }}
}}

→ 1

Bước 3: Lấy đối tượng ngày tháng của thứ năm đầu tiên của năm được cho:

{{#time: d-m-Y | 2020-01-01 + {{#ifexpr: {{#time: w | 2020-01-01 }} = 5 or {{#time: w | 2020-01-01 }} = 6
  |{{#expr: 11 - {{#time: w | 2020-01-01 }} }}
  |{{#expr: 4 - {{#time: w | 2020-01-01 }} }}
}} days }}

→ 02-01-2020

Bước 4: Lấy ra tuần đầu tiên của năm được cho theo đối tượng thứ năm đầu tiên:

{{trim leading|{{#time: W | {{#time: d-m-Y | 2020-01-01 + {{#ifexpr: {{#time: w | 2020-01-01 }} = 5 or {{#time: w | 2020-01-01 }} = 6
  |{{#expr: 11 - {{#time: w | 2020-01-01 }} }}
  |{{#expr: 4 - {{#time: w | 2020-01-01 }} }}
}} days }} }}}}

→ 1

Bước 5: Kiểm tra: Nếu số thứ tự tuần đầu tiên = 1, thì số thứ tự tuần được cho - 1, trường hợp còn lại giữ nguyên. Giả sử tuần được cho là 51, nghĩa là {{{2}}} = 51.

{{#ifexpr: {{trim leading|{{#time: W | {{#time: d-m-Y | 2020-01-01 + {{#ifexpr: {{#time: w | 2020-01-01 }} = 5 or {{#time: w | 2020-01-01 }} = 6
    |{{#expr: 11 - {{#time: w | 2020-01-01 }} }}
    |{{#expr: 4 - {{#time: w | 2020-01-01 }} }}
  }} days }} }}}} = 1
  |{{#expr: 51 - 1}}
  |51
}}

→ 50

Bước 6: Như vậy, kết quả là số thứ tự của ngày đầu tiên của tuần và năm được cho bằng ngày thứ năm đầu tiên của năm * số thứ tự tuần được cho - 3 (để lấy được thứ hai, thứ đầu tiên trong tuần). Ghi chú: Cộng thêm 1 cho {{#time: z }} để ra được số thứ tự ngày theo năm trong thực tế. Kết quả: Ngày đầu tiên của tuần 51 năm 2020 có số thứ tự là 349. Ngoại lệ: Đối với trường hợp tuần 1, thì luôn luôn trả về số thứ tự của ngày trong năm là 4, vì ngày 4/1 luôn luôn nằm trong tuần đầu tiên của năm.

{{#ifexpr: 51 = 1
  |4
  |{{#expr: {{#time: z | {{#time: d-m-Y | 2020-01-01 + {{#ifexpr: {{#time: w | 2020-01-01 }} = 5 or {{#time: w | 2020-01-01 }} = 6
       |{{#expr: 11 - {{#time: w | 2020-01-01 }} }}
       |{{#expr: 4 - {{#time: w | 2020-01-01 }} }}
     }} days }} + {{#expr: {{#ifexpr: {{trim leading|{{#time: W | {{#time: d-m-Y | 2020-01-01 + {{#ifexpr: {{#time: w | 2020-01-01 }} = 5 or {{#time: w | 2020-01-01 }} = 6
       |{{#expr: 11 - {{#time: w | 2020-01-01 }} }}
       |{{#expr: 4 - {{#time: w | 2020-01-01 }} }}
     }} days }} }}}} = 1
     |{{#expr: 51 - 1}}
     |51
   }} * 7 - 3 }} days }} + 1 }}
}}

→ 349

Tham số hóa {{{1}}} là năm, {{{2}}} là số thứ tự tuần:

{{#ifexpr: {{{2}}} = 1
  |4
  |{{#expr: {{#time: z | {{#time: d-m-Y | {{{1}}}-01-01 + {{#ifexpr: {{#time: w | {{{1}}}-01-01 }} = 5 or {{#time: w | {{{1}}}-01-01 }} = 6
       |{{#expr: 11 - {{#time: w | {{{1}}}-01-01 }} }}
       |{{#expr: 4 - {{#time: w | {{{1}}}-01-01 }} }}
     }} days }} + {{#expr: {{#ifexpr: {{trim leading|{{#time: W | {{#time: d-m-Y | {{{1}}}-01-01 + {{#ifexpr: {{#time: w | {{{1}}}-01-01 }} = 5 or {{#time: w | {{{1}}}-01-01 }} = 6
       |{{#expr: 11 - {{#time: w | {{{1}}}-01-01 }} }}
       |{{#expr: 4 - {{#time: w | {{{1}}}-01-01 }} }}
     }} days }} }}}} = 1
     |{{#expr: {{{2}}} - 1}}
     |{{{2}}}
   }} * 7 - 3 }} days }} + 1 }}
}}

Kiểm tra với cặp năm thường, năm nhuận bắt đầu vào các thứ (số trong ngoặc là số tuần của năm):

  • 2: 2018 (52) / 2024 (52)
  • 3: 2019 (52) / 2036 (52)
  • 4: 2014 (52) / 2020 (53)
  • 5: 2015 (53) / 2032 (53)
  • 6: 2021 (52) / 2044 (52)
  • 7: 2022 (52) / 2028 (52)
  • CN: 2023 (52) / 2040 (52)