จัดการวันและเวลาอย่างอิสระด้วยโมดูล datetime ของ Python!
หากต้องการเรียกใช้ Python ผ่าน Command Prompt หรือ PowerShell บนคอมพิวเตอร์ของคุณ คุณจำเป็นต้องดาวน์โหลดและติดตั้ง Python ก่อน
หากคุณยังไม่ได้ติดตั้ง กรุณาดูบทความ การติดตั้ง Python และการตั้งค่าสภาพแวดล้อมการพัฒนา เพื่อทำการติดตั้ง Python
ในการพัฒนาเว็บไซต์หรือแอปพลิเคชัน บ่อยครั้งที่เราต้องเจอกับสถานการณ์ที่ต้องจัดการกับวันที่และเวลา เช่น "ต้องการแสดงเวลาปัจจุบัน" "ต้องการบันทึกวันและเวลาที่โพสต์บทความ" หรือ "ต้องการคำนวณเวลาที่เหลืออยู่จนกว่าจะสิ้นสุดโปรโมชั่น" ในสถานการณ์เช่นนี้ โมดูล datetime ที่มาพร้อมกับ Python เป็นเครื่องมือที่มีประโยชน์อย่างยิ่ง
ในบทความนี้ เราจะอธิบายตั้งแต่วิธีการใช้งานพื้นฐานของโมดูล datetime ไปจนถึงเทคนิคการประยุกต์ใช้เล็กๆ น้อยๆ พร้อมด้วยโค้ดตัวอย่างที่แม้แต่ผู้เริ่มต้นก็สามารถคัดลอกและนำไปวางเพื่อสัมผัสประสบการณ์ "โค้ดที่ใช้งานได้จริง" ได้ทันที เรามาดำดิ่งสู่โลกของวันและเวลากันเลย! 🚀
พื้นฐานของโมดูล datetime
ก่อนอื่น เรามาเริ่มจากการเตรียมความพร้อมในการใช้โมดูล datetime และฟังก์ชันพื้นฐานที่สุด นั่นคือ "การดึงข้อมูลวันและเวลาปัจจุบัน" กันก่อน
การนำเข้าโมดูล (Import)
ในการใช้โมดูล datetime เราจำเป็นต้องทำการ import (นำเข้า) ที่ส่วนบนสุดของโค้ดก่อนเสมอ หากไม่มีส่วนนี้ Python จะไม่เข้าใจว่า "datetime คืออะไร?"
import datetime
การดึงข้อมูลวันและเวลาปัจจุบัน
การดึงข้อมูลวันและเวลา ณ ขณะนี้ทำได้ง่ายมาก เพียงแค่เรียกใช้ `datetime.datetime.now()`
import datetime
# ดึงข้อมูลวันและเวลาปัจจุบัน
now = datetime.datetime.now()
print(now)
# ตัวอย่างผลลัพธ์: 2025-07-11 07:42:15.123456
หากไม่ต้องการเวลา และต้องการแค่วันที่ของวันนี้ ให้ใช้ `datetime.date.today()`
import datetime
# ดึงข้อมูลเฉพาะวันที่ของวันนี้
today = datetime.date.today()
print(today)
# ตัวอย่างผลลัพธ์: 2025-07-11
การเข้าถึงองค์ประกอบต่างๆ ของวันและเวลา
จากอ็อบเจกต์ `datetime` ที่เราได้รับมา เราสามารถดึงข้อมูลเฉพาะส่วนต่างๆ เช่น ปี, เดือน, วัน, ชั่วโมง, นาที, และวินาทีออกมาได้ ซึ่งมีประโยชน์เมื่อต้องการแสดงผล เช่น "ปีนี้คือปี 2025"
import datetime
now = datetime.datetime.now()
print(f"ปี: {now.year}")
print(f"เดือน: {now.month}")
print(f"วัน: {now.day}")
print(f"ชั่วโมง: {now.hour}")
print(f"นาที: {now.minute}")
print(f"วินาที: {now.second}")
print(f"ไมโครวินาที: {now.microsecond}")
การสร้างวันและเวลาที่ต้องการด้วยตนเอง
นอกจากการดึงเวลาปัจจุบันแล้ว เรายังสามารถสร้างอ็อบเจกต์ที่ระบุวันและเวลาที่ต้องการในอดีตหรืออนาคตได้ด้วย ใช้สำหรับระบุวันเกิด หรือวันเริ่มต้นให้บริการ เป็นต้น
import datetime
# ระบุวันที่ 1 มกราคม 2026 เวลา 9:30:00 น.
specific_datetime = datetime.datetime(2026, 1, 1, 9, 30, 0)
print(specific_datetime)
# ผลลัพธ์: 2026-01-01 09:30:00
การจัดรูปแบบวันและเวลาให้อ่านง่าย
รูปแบบเช่น `2025-07-11 07:42:15` ก็ไม่ได้แย่ แต่บนเว็บไซต์ เราอาจต้องการแสดงผลให้เข้าใจง่ายขึ้น เช่น "11 กรกฎาคม พ.ศ. 2568 เวลา 07:42 น." ในกรณีนี้ เมธอด `strftime()` คือคำตอบ
ใช้ strftime() เพื่อแปลงเป็นข้อความในรูปแบบที่ต้องการ
`strftime()` ย่อมาจาก "string format time" ซึ่งจะแปลงอ็อบเจกต์ `datetime` เป็นข้อความตามรูปแบบที่เรากำหนด โดยใช้ "โค้ดรูปแบบ" เช่น `%Y` หรือ `%m` ในการระบุ
import datetime
import locale
# ตั้งค่า locale เป็นภาษาไทยเพื่อให้ชื่อเดือนแสดงผลถูกต้อง
# อาจต้องมีการตั้งค่าในระบบ ('th_TH', 'th_TH.UTF-8')
try:
locale.setlocale(locale.LC_TIME, 'th_TH.UTF-8')
except locale.Error:
print("ไม่รองรับ locale 'th_TH.UTF-8', ใช้ค่าเริ่มต้นแทน")
now = datetime.datetime.now()
# แปลงเป็นข้อความตามรูปแบบที่ต้องการ
# หมายเหตุ: %Y จะให้ปีคริสต์ศักราช (ค.ศ.)
formatted_string = now.strftime("วันที่ %d %B พ.ศ. %Y เวลา %H:%M:%S")
# แปลงปี ค.ศ. เป็น พ.ศ. (ค.ศ. + 543)
buddhist_year_string = str(now.year + 543)
formatted_string_buddhist = formatted_string.replace(str(now.year), buddhist_year_string)
print(formatted_string_buddhist)
# ตัวอย่างผลลัพธ์: วันที่ 11 กรกฎาคม พ.ศ. 2568 เวลา 07:42:15
นี่คือโค้ดรูปแบบที่ใช้บ่อย:
- `%Y`: ปีคริสต์ศักราช 4 หลัก (เช่น 2025)
- `%y`: ปีคริสต์ศักราช 2 หลัก (เช่น 25)
- `%m`: เดือนเป็นตัวเลข (01-12)
- `%d`: วันที่เป็นตัวเลข (01-31)
- `%H`: ชั่วโมงในรูปแบบ 24 ชั่วโมง (00-23)
- `%I`: ชั่วโมงในรูปแบบ 12 ชั่วโมง (01-12)
- `%p`: AM/PM
- `%M`: นาทีเป็นตัวเลข (00-59)
- `%S`: วินาทีเป็นตัวเลข (00-59)
- `%A`: ชื่อวันเต็ม (เช่น Friday)
- `%a`: ชื่อวันย่อ (เช่น Fri)
- `%B`: ชื่อเดือนเต็ม (เช่น July)
ใช้ strptime() เพื่อแปลงข้อความกลับเป็นวันและเวลา
ในทางกลับกัน บางครั้งเราอาจต้องการแปลงข้อมูลข้อความ เช่น "11 กรกฎาคม 2568" ให้เป็นอ็อบเจกต์ `datetime` ที่โปรแกรมสามารถนำไปใช้งานต่อได้ ในกรณีนี้ เราจะใช้เมธอด `strptime()` ซึ่งย่อมาจาก "string parse time"
สำคัญ: เมื่อใช้ `strptime()` รูปแบบของข้อความต้นฉบับและโค้ดรูปแบบที่ระบุจะต้องตรงกันทุกประการ มิฉะนั้นจะเกิดข้อผิดพลาด
import datetime
import locale
# ตั้งค่า locale เป็นภาษาไทย
try:
locale.setlocale(locale.LC_TIME, 'th_TH.UTF-8')
except locale.Error:
pass
date_string_th = "11 กรกฎาคม 2568"
# เนื่องจาก strptime ไม่เข้าใจปีพุทธศักราชโดยตรง เราจึงต้องแปลงปีกลับเป็นคริสต์ศักราชก่อน
parts = date_string_th.split() # แยกข้อความเป็นส่วนๆ -> ['11', 'กรกฎาคม', '2568']
buddhist_year = int(parts[2])
gregorian_year = buddhist_year - 543
date_string_gregorian = f"{parts[0]} {parts[1]} {gregorian_year}"
# แปลงข้อความที่มีปีคริสต์ศักราชแล้วให้เป็นอ็อบเจกต์ date
date_obj = datetime.datetime.strptime(date_string_gregorian, "%d %B %Y").date()
print(date_obj)
print(type(date_obj))
# ผลลัพธ์:
# 2025-07-11
# <class 'datetime.date'>
ขั้นสูง: มาคำนวณวันและเวลากันเถอะ
จุดเด่นที่แท้จริงของโมดูล datetime คือความสามารถในการคำนวณวันและเวลาได้อย่างง่ายดาย เราสามารถคำนวณ เช่น "อีก 1 สัปดาห์จะเป็นวันที่เท่าไหร่?" หรือ "เหลืออีกกี่วันจะหมดโปรโมชั่น?" ได้อย่างเป็นธรรมชาติโดยใช้อ็อบเจกต์ `timedelta`
ใช้ timedelta เพื่อแสดงผลต่างของเวลา
`timedelta` คืออ็อบเจกต์ที่ใช้แสดงระยะเวลา (ผลต่าง) ระหว่างวันและเวลาสองช่วง เราสามารถสร้างมันขึ้นมาโดยการระบุจำนวนวัน, วินาที, ไมโครวินาที เป็นต้น
import datetime
now = datetime.datetime.now()
print(f"เวลาปัจจุบัน: {now.strftime('%Y-%m-%d %H:%M')}")
# คำนวณเวลาในอีก 1 สัปดาห์ข้างหน้า
one_week_later = now + datetime.timedelta(weeks=1)
print(f"อีก 1 สัปดาห์: {one_week_later.strftime('%Y-%m-%d %H:%M')}")
# คำนวณเวลาย้อนหลัง 3 วัน
three_days_ago = now - datetime.timedelta(days=3)
print(f"3 วันที่แล้ว: {three_days_ago.strftime('%Y-%m-%d %H:%M')}")
# คำนวณเวลาในอีก 10 ชั่วโมง 30 นาทีข้างหน้า
ten_hours_later = now + datetime.timedelta(hours=10, minutes=30)
print(f"อีก 10 ชม. 30 นาที: {ten_hours_later.strftime('%Y-%m-%d %H:%M')}")
การคำนวณผลต่างระหว่างสองวัน
เมื่อนำอ็อบเจกต์ `datetime` มาลบกัน ผลลัพธ์ที่ได้จะเป็นอ็อบเจกต์ `timedelta` เราสามารถใช้ประโยชน์จากสิ่งนี้เพื่อคำนวณจำนวนวันที่เหลือจนถึงวันที่กำหนดได้
import datetime
# วันที่ของวันนี้
today = datetime.date.today()
# วันที่เป้าหมาย (เช่น วันขึ้นปีใหม่ปี 2026)
new_year_2026 = datetime.date(2026, 1, 1)
# คำนวณผลต่างระหว่างสองวัน
delta = new_year_2026 - today
# ในบริบทไทย เราอาจแสดงปีเป็นพุทธศักราช (2026 -> 2569)
print(f"เหลืออีก {delta.days} วันจะถึงวันปีใหม่ พ.ศ. 2569")
ข้อควรระวัง: กับดักของโซนเวลา (Timezone)
วันและเวลาที่เราใช้งานในตัวอย่างที่ผ่านมาทั้งหมดนั้น เป็นอ็อบเจกต์แบบ "naive" ซึ่งไม่มีข้อมูลโซนเวลาอยู่ สำหรับสคริปต์ง่ายๆ ที่ใช้ส่วนตัวอาจไม่มีปัญหา แต่สำหรับการสร้างบริการบนเว็บที่มีผู้ใช้จากทั่วโลก โซนเวลาเป็นปัญหาที่หลีกเลี่ยงไม่ได้
ตัวอย่างเช่น "เวลา 9 โมงเช้าของวันที่ 11 กรกฎาคม" ในประเทศไทย กับ "เวลา 9 โมงเช้าของวันที่ 11 กรกฎาคม" ในสหรัฐอเมริกา เป็นคนละช่วงเวลากันอย่างสิ้นเชิง เพื่อจัดการกับความแตกต่างนี้อย่างถูกต้อง เราจำเป็นต้องใช้อ็อบเจกต์แบบ "aware" ซึ่งมีข้อมูลโซนเวลาอยู่
ตั้งแต่ Python 3.9 เป็นต้นไป เราสามารถจัดการโซนเวลาได้อย่างง่ายดายโดยใช้ไลบรารีมาตรฐาน `zoneinfo`
import datetime
from zoneinfo import ZoneInfo
# ดึงเวลาปัจจุบันโดยระบุโซนเวลา
tokyo_tz = ZoneInfo("Asia/Tokyo")
now_tokyo = datetime.datetime.now(tokyo_tz)
print(f"เวลาปัจจุบันที่โตเกียว: {now_tokyo}")
newyork_tz = ZoneInfo("America/New_York")
now_newyork = datetime.datetime.now(newyork_tz)
print(f"เวลาปัจจุบันที่นิวยอร์ก: {now_newyork}")
# จะเห็นว่ามีข้อมูลโซนเวลา (+09:00, -04:00) ต่อท้าย
# ตัวอย่างผลลัพธ์:
# เวลาปัจจุบันที่โตเกียว: 2025-07-11 07:42:15.123456+09:00
# เวลาปัจจุบันที่นิวยอร์ก: 2025-07-10 18:42:15.123456-04:00
ในการพัฒนาบริการสำหรับผู้ใช้ทั่วโลก ต้องแน่ใจเสมอว่าได้คำนึงถึงการจัดการโซนเวลาด้วย!
[ภาคปฏิบัติ] คัดลอก-วาง-ใช้งานได้เลย! แสดงเวลาปัจจุบันบนหน้าเว็บ
สุดท้ายนี้ จากความรู้ทั้งหมดที่ผ่านมา เราขอนำเสนอตัวอย่าง HTML ที่สามารถคัดลอกไปใช้ได้ทั้งชุด เพื่อแสดงเวลามาตรฐานของญี่ปุ่น (JST) แบบเรียลไทม์บนหน้าเว็บ เพียงบันทึกโค้ดนี้เป็นไฟล์ HTML แล้วเปิดด้วยเบราว์เซอร์ก็สามารถทำงานได้ทันที
※ในตัวอย่างนี้มีโค้ด JavaScript รวมอยู่ด้วยเพื่อการอัปเดตเวลาแบบเรียลไทม์
ลองบันทึกโค้ดด้านล่างเป็นไฟล์ชื่อ `clock.html` แล้วเปิดในเบราว์เซอร์ของคุณ
<!DOCTYPE html>
<html lang="th">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>การแสดงผลเวลาแบบเรียลไทม์</title>
<style>
body {
background-color: #202124;
color: #e8eaed;
font-family: sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
flex-direction: column;
}
h1 {
color: #669df6;
}
#clock {
font-size: 3rem;
font-weight: bold;
background-color: #3c4043;
padding: 20px 40px;
border-radius: 10px;
}
</style>
</head>
<body>
<h1>เวลาปัจจุบันของประเทศญี่ปุ่น</h1>
<div id="clock">--:--:--</div>
<script>
function updateClock() {
// สร้างเวลาตามเวลามาตรฐานญี่ปุ่น (JST, UTC+9)
const now = new Date();
const jstOffset = 9 * 60; // JST คือ UTC+9 ชั่วโมง
const localOffset = -now.getTimezoneOffset(); // ค่า offset ของโซนเวลาท้องถิ่น (นาที)
const jstNow = new Date(now.getTime() + (jstOffset - localOffset) * 60 * 1000);
const hours = String(jstNow.getHours()).padStart(2, '0');
const minutes = String(jstNow.getMinutes()).padStart(2, '0');
const seconds = String(jstNow.getSeconds()).padStart(2, '0');
document.getElementById('clock').textContent = `${hours}:${minutes}:${seconds}`;
}
// อัปเดตนาฬิกาทุก 1 วินาที
setInterval(updateClock, 1000);
// เรียกใช้งานครั้งแรกเมื่อโหลดหน้าเว็บ
updateClock();
</script>
</body>
</html>
สรุป
ในครั้งนี้ เราได้เรียนรู้วิธีการจัดการวันและเวลาโดยใช้โมดูล `datetime` ของ Python
- การดึงเวลาปัจจุบัน: `datetime.now()` และ `date.today()`
- การแปลงรูปแบบ: แปลงเป็นข้อความด้วย `strftime()` และแปลงจากข้อความด้วย `strptime()`
- การคำนวณวันและเวลา: บวกและลบได้อย่างอิสระด้วย `timedelta`
- โซนเวลา: สำหรับแอปพลิเคชันระดับสากล การใช้อ็อบเจกต์แบบ "aware" ด้วย `zoneinfo` เป็นสิ่งสำคัญ
หากคุณใช้งานโมดูล `datetime` ได้อย่างคล่องแคล่วแล้ว ขอบเขตของสิ่งที่คุณสามารถสร้างได้จะกว้างขึ้นอย่างมาก ไม่ว่าจะเป็นการประทับเวลาในไฟล์ล็อก, การบันทึกวันที่สมัครสมาชิกของผู้ใช้, หรือการนับถอยหลังสู่งานอีเวนต์ ลองนำโค้ดในบทความนี้ไปปรับใช้และสร้างโปรแกรมของตัวเองดูนะครับ!
ก้าวต่อไป
หลังจากคุ้นเคยกับการจัดการวันและเวลาแล้ว ลองท้าทายตัวเองด้วยการจัดการไฟล์และไดเรกทอรีดูไหม? บทความต่อไปนี้จะอธิบายวิธีการอ่านและเขียนไฟล์ รวมถึงการสร้างและลบโฟลเดอร์ด้วย Python
จัดการไฟล์และไดเรกทอรีด้วยโมดูล os »