🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

จัดการวันและเวลาอย่างอิสระด้วยโมดูล 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

นี่คือโค้ดรูปแบบที่ใช้บ่อย:


ใช้ 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` ได้อย่างคล่องแคล่วแล้ว ขอบเขตของสิ่งที่คุณสามารถสร้างได้จะกว้างขึ้นอย่างมาก ไม่ว่าจะเป็นการประทับเวลาในไฟล์ล็อก, การบันทึกวันที่สมัครสมาชิกของผู้ใช้, หรือการนับถอยหลังสู่งานอีเวนต์ ลองนำโค้ดในบทความนี้ไปปรับใช้และสร้างโปรแกรมของตัวเองดูนะครับ!

ก้าวต่อไป

หลังจากคุ้นเคยกับการจัดการวันและเวลาแล้ว ลองท้าทายตัวเองด้วยการจัดการไฟล์และไดเรกทอรีดูไหม? บทความต่อไปนี้จะอธิบายวิธีการอ่านและเขียนไฟล์ รวมถึงการสร้างและลบโฟลเดอร์ด้วย Python

จัดการไฟล์และไดเรกทอรีด้วยโมดูล os »