/blog/*

Manipulasi Datetime dengan Pendulum

Dalam membangun suatu system/aplikasi, manajemen "waktu" merupakan hal yang sangat penting dan fital. Bayangkan jika aplikasi anda digunakan user di berbagai lokasi yang memiliki zona waktu yang berbeda. User di Jakarta yang memiliki zona waktu UTC+7 akan berbeda dengan user di Paris yang memiliki zona waktu UTC+2. Belum lagi di beberapa negara terdapat system waktu Daylight Saving Time atau biasa disingkat DST.

Native Datetime

Untuk manajemen waktu di Python terdapat module bawaan (native) yaitu datetime. Berikut contoh basic penggunaan module datetime:

from datetime import datetime, date, time

now = datetime.now()
>>> 2019-05-20 14:43:09.016431

current_date = now.date()
>>> 2019-05-20

current_time = now.time()
>>> 14:43:09.016431

# Manual init
new_date = datetime(2019, 7, 10, 1, 20, 30)    # datetime(year, month, day, hour, minute, second)

Sebenarnya module datetime sudah sangat cukup untuk cover segala kebutuhan anda dalam manajemen waktu di Python. Bahkan pada module datetime sudah terdapat juga class-class untuk handle timezone. Namun ada alternatif module lain yang menurut saya pribadi jauh lebih handy digunakan yaitu module pendulum.

Pendulum

Module pendulum menyediakan berbagai macam class dan method untuk manajemen waktu yang sangat mudah digunakan dan lengkap. Terdapat berbagai macam fitur seperti manajemen timezone, formatting, kalkulasi waktu, dll. Berikut contoh penggunaan basic pendulum:

import pendulum

now = pendulum.now()
>>> 2019-05-20T15:32:03.122667+07:00

new_date = pendulum.datetime(2019, 7, 10, 1, 20, 30, tz='America/Chicago')
>>> 2019-07-10T01:20:30-05:00

# init datetime from string
new_date = pendulum.parse('1975-05-21T22:00:00', tz='Europe/Paris')
>>> 1975-05-21T22:00:00+01:00

Timezone

Kita sendiri mengetahui bahwa rotasi planet bumi menyebabkan terjadinya perubahan waktu dan berdampak pada pembagian waktu berdasarkan letak geografis. Di Indonesia saja terdapat 3 zona waktu yang berbeda yaitu Waktu Indonesia Barat(WIB) UTC+7, Waktu Indonesia Tengah(WITA) UTC+8, dan Waktu Indonesia Timur(WIT) UTC+9. Untuk penjelasan lebih mengenai teori zona waktu bisa baca pada artikel disini.

Coba bayangkan misalkan anda membuat suatu aplikasi chatting dan salah satu user anda yang di Jakarta berkomunikasi dengan user di Paris, bagaimana system anda mencatat perbedaan waktu itu? Bagaimana pula anda menyajikan data yang berasal dari user di Paris ke user yang ada di Jakarta? Bukan cuma itu saja, bagaimana jika server yang anda buat dideploy di layanan Cloud yang lokasi server fisiknya berada di luar negeri? Anda tidak perlu panik, issue diatas bisa anda tangani dengan memahami konsep dasar zona waktu dan tools manajemen timezone yang tersedia pada pendulum. Berikut cara pendulum menangani masalah timezone:

import pendulum

now = pendulum.now()
>>> 2019-05-21T16:51:09.900730+07:00

# get current datetime on Chicago
chicago_now = pendulum.now(tz='America/Chicago')
>>> 2019-05-21T04:51:09.900831-05:00

# get current timezone name
tz_name = now.timezone_name
>>> Asia/Jakarta

# set datetime with timezone
new_datetime = pendulum.datetime(1992, 7, 10, tz='America/Chicago')
>>> 1992-07-10T00:00:00-05:00

# convert datetime to another timezone
now.set(tz='America/Chicago')       # ONLY change timezone information
now.in_timezone('Ameriva/Chicago')
>>> 2019-05-21T16:51:09.900730-05:00
>>> 2019-05-21T04:51:09.900730-05:00

# get offset hours
new_datetime.offset_hours
>>> -5.0    # UTC-5

# check datetime's timezone already local or not
new_datetime.is_local()
>>> False

Timedelta

Anda mungkin akan menghadapi kondisi dimana anda membutuhkan suatu fungsi untuk menambahkan/mengurangi suatu waktu. Bayangkan jika ada suatu instance datetime dan ingin menambahkan beberapa jam ke instance datetime tersebut. Semua kebutuhan ini bisa dihandle dengan baik dengan pendulum. Perhatikan contoh di bawah:

Format Date

Dalam merepresentasikan suatu tanggal/waktu, terdapat berbagai macam format yang sering digunakan. Di Indonesia sendiri untuk tanggal banyak yang menggunakan format 19-05-2019. Sementara untuk jam, di Indonesia lebih menggunakan format system-24 jam seperti 18:30, dimana beberapa negara di Eropa dan Amerika lebih condong menggunakan system-12 jam seperti 6:30 PM. Berikut contoh penggunaan fungsi format() untuk memenuhi kebutuhan di atas:

import pendulum

dt = pendulum.datetime(1992, 7, 10, 1, 18, 30, 123456, tz='Asia/Jakarta')
>>> 2019-05-19T01:18:30.123456+07:00

dt.format('ddd, DD-MM-YYYY')
>>> Sun, 19-05-2019

dt.format('DD MMMM YYYY')
>>> 19 May 2019

dt.format('MMM Do, YYYY')
>>> May 19th, 2019

dt.format('HH:mm:ss.SSSSSSZ')
>>> 01:18:30.123456+07:00

dt.format('H.mm A')
>>> 1.18 AM

dt.isoformat()      # ISO 8601
>>> 2019-05-19T01:18:30.123456+07:00