ถกเถียงกับ Gemini มาพักนึงเรื่องจะหา Workweek number อย่างไรดี
จริงๆ Workweek number เป็นอะไรที่ค่อนข้างจัดการยาก บางบริษัทก็ใช้วิธีสากล บางบริษัทก็ใช้วิธีบ้านๆ ซึ่งเขียน function จัดการในคราวเดียวยาก
แต่ถ้าจะเอามาตราฐานเลยก็น่าจะเป็น ISO 8601 ซึ่งน่าจะใช้บ่อยที่สุดในบริษัทใหญ่ๆ
หลักการของมันเลยก็คือ Week แรกของปีนั้น จะต้องมีวันที่ 4 มกราคม อยู่ใน Week นั้น
ถ้าไม่มี แสดงว่าเศษของสัปดาห์ที่ 0 (จะ 1 หรือ 2 หรือ 3 วันก็ตามแต่ จะให้เป็น week ของปีก่อนหน้าไปเลย) – ถ้าเศษของสัปดาห์นั้นเกิน 3 วัน (4 วันขึ้นไป – เกินกึ่งหนึ่งของ 7 วัน) ก็เป็น Workweek 1
ทีนี้ ถ้าเราต้องการใช้ PERL เพื่อหา Week number, จะได้เป็น
my $formatted_string = strftime "%W", localtime;
%W คือ Workweek
แต่ถ้าเราต้องการ Workweek ที่เป็นไปตาม ISO-8601 จะต้องใช้ %V แทน %W
แต่ … ไม่ใช่ ทุก version ของ perl จะรู้จัก %V
ทำให้วิธีนี้มันไม่เหมาะสมในการใช้งานเท่าไหร่
วิธีที่แนะนำ คือ ใช้ Date::Calc
#!/usr/bin/perl use strict; use warnings; use utf8; # นำฟังก์ชันทั้งหมดของ Date::Calc เข้ามาใช้งาน use Date::Calc qw(:all); # 1. ดึงข้อมูลเวลาปัจจุบันด้วย localtime # เราสนใจแค่ 3 ค่าคือ วัน(mday), เดือน(mon), ปี(year) my ($sec, $min, $hour, $mday, $mon, $year) = localtime; # 2. ปรับค่าเดือนและปีให้ตรงตามที่ Date::Calc ต้องการ my $current_day = $mday; my $current_month = $mon + 1; # เดือนนับจาก 0 -> 1 my $current_year = $year + 1900; # ปีนับจาก 1900 print "วันที่ปัจจุบัน (หลังปรับค่า): $current_day/$current_month/$current_year\n"; print "----------------------------------------\n"; # 3. ส่งค่าที่ปรับแล้วไปให้ฟังก์ชันต่างๆ ของ Date::Calc # ตัวอย่างที่ 1: หาเลขสัปดาห์ของวันนี้ (ตามมาตรฐาน ISO 8601) my ($week_year, $week_number) = Week_of_Year($current_year, $current_month, $current_day); print "Work Week (ISO 8601): สัปดาห์ที่ $week_number ของปี $week_year\n"; # ตัวอย่างที่ 2: หาวันของสัปดาห์ (1=จันทร์, 7=อาทิตย์) my $day_of_week = Day_of_Week($current_year, $current_month, $current_day); my @day_names = qw(จันทร์ อังคาร พุธ พฤหัสบดี ศุกร์ เสาร์ อาทิตย์); print "วันนี้คือวัน: " . $day_names[$day_of_week - 1] . "\n"; # ตัวอย่างที่ 3: คำนวณหาวันที่ในอีก 10 วันข้างหน้า my ($future_year, $future_month, $future_day) = Add_Delta_Days($current_year, $current_month, $current_day, 10); print "อีก 10 วันจะเป็นวันที่: $future_day/$future_month/$future_year\n";
