PERL – หา Workweek number ด้วย function ไหนดี

PERL – หา Workweek number ด้วย function ไหนดี

ถกเถียงกับ 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";