Skip to Content
CoursesCSC102คำนวณวันในสัปดาห์จากวันที่

คำนวณวันในสัปดาห์จากวันที่

โจทย์

สูตร Zeller’s congruence เป็นอัลกอริทึมที่พัฒนาโดย Christian Zeller เพื่อคำนวณวันในสัปดาห์ โดยมีสูตรดังนี้:

h=(q+(26×(m+1)10)+k+(k4)+(j4)+(5×j))mod7h = \left(q + \left(\frac{26 \times (m + 1)}{10}\right) + k + \left(\frac{k}{4}\right) + \left(\frac{j}{4}\right) + (5 \times j)\right) \mod 7

สูตรนี้ใช้ในการคำนวณหาวันในสัปดาห์ โดยสูตรจะมีตัวแปรหลัก ๆ ดังนี้:

  • hh แทนวันในสัปดาห์ (0: วันเสาร์, 1: วันอาทิตย์, 2: วันจันทร์, 3: วันอังคาร, 4: วันพุธ, 5: วันพฤหัสบดี, 6: วันศุกร์)
  • qq แทนวันที่ของเดือน
  • mm แทนเดือน (3: มีนาคม, 4: เมษายน, … , 12: ธันวาคม) เดือนมกราคมและกุมภาพันธ์จะถูกนับเป็นเดือนที่ 13 และ 14 ของปีที่แล้ว
  • jj แทนศตวรรษ (เช่น ปีหารด้วย 100)
  • kk แทนปีในศตวรรษ (เช่น ปี mod 100)
InputOutput
2024
8
28
Wednesday

โค้ด

import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int y = scanner.nextInt(); int m = scanner.nextInt(); int q = scanner.nextInt(); y = (m == 1 || m == 2) ? y - 1 : y; m = (m == 1 || m == 2) ? m + 12 : m; int k = y % 100; int j = y / 100; int h = (q + ((26 * (m + 1)) / 10) + k + (k / 4) + (j / 4) + (5 * j)) % 7; String day = switch (h) { case 0 -> "Saturday"; case 1 -> "Sunday"; case 2 -> "Monday"; case 3 -> "Tuesday"; case 4 -> "Wednesday"; case 5 -> "Thursday"; case 6 -> "Friday"; default -> ""; }; System.out.println(day); } }

คำอธิบาย

ขั้นตอนที่ 1: การเริ่มต้นโปรแกรม

import java.util.Scanner; public class Day { public static void main(String[] args) { Scanner scanner = new Scanner(System.in);
  • โค้ดเริ่มต้นด้วยการ import คลาส Scanner ซึ่งเป็นเครื่องมือที่ช่วยให้เราสามารถรับข้อมูลจากผู้ใช้ได้
  • เราสร้างคลาสชื่อ Main และกำหนดเมธอด main ซึ่งเป็นจุดเริ่มต้นของโปรแกรม
  • เราสร้างตัวแปร scanner เพื่อใช้รับข้อมูลจากผู้ใช้

ขั้นตอนที่ 2: การรับข้อมูล

int y = scanner.nextInt(); int m = scanner.nextInt(); int q = scanner.nextInt();
  • เราใช้ scanner เพื่อรับข้อมูล 3 ตัวจากผู้ใช้:
  • y คือปี (year)
  • m คือเดือน (month)
  • q คือวันที่ (day of the month)

ขั้นตอนที่ 3: การปรับค่าปีและเดือน

y = (m == 1 || m == 2) ? y - 1 : y; m = (m == 1 || m == 2) ? m + 12 : m;
  • ในสูตร Zeller’s congruence เราต้องปรับค่าปีและเดือนถ้าเดือนเป็นมกราคม (1) หรือกุมภาพันธ์ (2)
  • ถ้าเป็นเดือนมกราคมหรือกุมภาพันธ์:
  • ลดค่าปีลง 1
  • เพิ่มค่าเดือนขึ้น 12 (ทำให้มกราคมกลายเป็นเดือนที่ 13 และกุมภาพันธ์กลายเป็นเดือนที่ 14 ของปีก่อนหน้า)

ขั้นตอนที่ 4: การคำนวณค่า k และ j

int k = y % 100; int j = y / 100;
  • k คือเลข 2 ตัวสุดท้ายของปี (year of the century)
  • j คือเลขศตวรรษ (zero-based century)

ขั้นตอนที่ 5: การคำนวณ Zeller’s Congruence

int h = (q + ((26 * (m + 1)) / 10) + k + (k / 4) + (j / 4) + (5 * j)) % 7;

นี่คือสูตร Zeller’s congruence ที่ใช้คำนวณวันในสัปดาห์:

  • q คือวันที่
  • ((26 * (m + 1)) / 10) เป็นส่วนของการปรับค่าเดือน
  • k และ (k / 4) เกี่ยวข้องกับปีในศตวรรษ
  • (j / 4) และ (5 * j) เกี่ยวข้องกับการปรับค่าศตวรรษ
  • สุดท้ายเราใช้ % 7 เพื่อให้ได้เลข 0-6 ซึ่งแทนวันในสัปดาห์

ขั้นตอนที่ 6: การแปลงตัวเลขเป็นชื่อวัน

String day = switch (h) { case 0 -> "Saturday"; case 1 -> "Sunday"; case 2 -> "Monday"; case 3 -> "Tuesday"; case 4 -> "Wednesday"; case 5 -> "Thursday"; case 6 -> "Friday"; default -> ""; };
  • เราใช้ switch เพื่อแปลงค่า h (0-6) เป็นชื่อวันในภาษาอังกฤษ
  • ค่า h แต่ละค่าจะตรงกับวันในสัปดาห์ เช่น 0 คือวันเสาร์, 1 คือวันอาทิตย์ เป็นต้น

ขั้นตอนที่ 7: การแสดงผลลัพธ์

System.out.println(day);

หลักการทำงาน

ปรับปรุงล่าสุด