Hướng dẫn python datetime no timezone - python datetime không có múi giờ

Tổng quan

Gần đây mình có làm việc nhiều với kiểu dữ liệu Datetime trong Python. Vấn đề mình gặp phải là xử lý nhiều loại time format khác nhau, chuyển hóa thành dạng Datetime, chuẩn hóa thời gian lưu trữ và lưu vào database. Và sau đây, mình sẽ viết bài chia sẻ về cách mình xử lý kiểu dữ liệu Datetime trong Python. Trong bài mình sẽ sử dụng Python 3 để xử lý kiểu dữ liệu Datetime.

Tips 1: Chuẩn hóa múi giờ sử dụng

Đầu tiên, cũng là quan trọng nhất, chuẩn hóa múi giờ sử dụng để convert các kiểu thời gian. Mình lựa chọn sử dụng chuẩn múi giờ UTC để chuẩn hóa thời gian cho cả hệ thống cũng như làm múi giờ chuẩn để xử lý các loại format thời gian khác nhau.

Tham khảo thêm về thời gian UTC tại

Tips 2: Convert String thành Datetime

Xử lý bằng hàm parse

import datetime
import pytz
from dateutil.parser import parse

# Dạng string time
date_string = '2019-03-20T03:41:16Z'

# Dạng datetime format
date_time_python = parse(date_string)

Xử lý bằng strptime

import datetime
import pytz
from dateutil.parser import parse

# Dạng string time
date_string = '2019-03-21 03:41:16'

# Strptime
format = '%Y-%m-%d %H:%M:%S'
date_time_python = datetime.datetime.strptime(date_string, format)

Lưu ý:

  • Các rất nhiều format time khác nhau nên để có thể chuyển từ string thành Datetime parse chỉ có thể xử lý một số dạng tiêu chuẩn, nếu khác dạng tiêu chuẩn phải hiểu ra cấu trúc time string để sử dụng hàm
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-21 03:41:16'
    
    # Strptime
    format = '%Y-%m-%d %H:%M:%S'
    date_time_python = datetime.datetime.strptime(date_string, format)
    
    1 để cắt chuỗi tạo Datetime
  • Nếu kiểu dữ liệu Datetime không rõ múi giờ thì được gọi là
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-21 03:41:16'
    
    # Strptime
    format = '%Y-%m-%d %H:%M:%S'
    date_time_python = datetime.datetime.strptime(date_string, format)
    
    2

Tips 3: Chuyển hóa kiểu Datetime sang Timestamp Python

Timestamp là kiểu thời gian thông dụng của hệ thông Unix, tìm hiểu thêm tại

import datetime

# Dạng datetime
date_time_now = datetime.datetime.now()

# Dạng timestamp
timestamp_now = date_time_now.timestamp()

Tips 4: Chuyển hóa kiểu native date sang UTC timezone

Kiểm tra kiểu timezone

import datetime
import pytz

# Dạng native date
date_time_now = datetime.datetime.now()
print(date_time_now.tzname())

# Dạng utc
UTC = pytz.utc
date_time_utc_now = UTC.localize(date_time_now)
print(date_time_utc_now.tzname())

Lưu ý: không sử dụng hàm replace, hàm replace sẽ chỉ thay đổi tzinfo không qui đổi thời gian từ múi giờ này sang múi giờ khác

Tips 5: Convert UTC sang timezone khác

Nếu bạn ở múi giờ Việt Nam (GMT + 7), tức nếu hiện tại là 8 giờ sáng (giờ Việt Nam) thì quy ra giờ UTC tức 1 giờ sáng (giờ UTC). Vậy nếu Datetime đang ở múi giờ UTC, ta phải convert nó sáng giờ Việt Nam

import datetime
import pytz

# Dạng native date
date_time_now = datetime.datetime.now()
print(date_time_now.tzname())

# Dạng utc
UTC = pytz.utc
date_time_utc_now = UTC.localize(date_time_now)
print(date_time_utc_now.tzname())

# Dạng 'Asia/Ho_Chi_Minh'

VN_TZ = pytz.timezone('Asia/Ho_Chi_Minh')
date_time_vntz_now = date_time_utc_now.astimezone(VN_TZ)
print(date_time_vntz_now.tzname())

Tips 6: Chuyên từ Timestamp sang Datetime

import datetime

date_time_now = datetime.datetime.now()
timestamp_now = date_time_now.timestamp()

# Convert timestamp thành dạng Datetime
timestamp_to_datetime = datetime.datetime.fromtimestamp(timestamp_now)

Tips 7: Convert Datetime sang ISO 8601

ISO 8601 là một tiêu chuẩn quốc tế, được đưa ra bởi Tổ chức tiêu chuẩn hóa quốc tế (ISO) lần đầu tiên năm 1988, mô tả quy cách viết ngày tháng và thời gian theo cách đơn giản nhất mà máy tính có thể hiểu được. Còn đối với Python ISO 8601 Datetime là string format time thông dụng.

import datetime

date_time_now = datetime.datetime.now()

# Convert Datetime thành dạng ISO 8601
iso_format = date_time_now.isoformat()

Nguồn

https://vi.wikipedia.org/wiki/Th%E1%BA%A3o_lu%E1%BA%ADn:M%C3%BAi_gi%E1%BB%9D

https://vi.wikipedia.org/wiki/Th%E1%BA%A3o_lu%E1%BA%ADn:M%C3%BAi_gi%E1%BB%9D


Thực hiện bởi cloud365.vn

Tuy nhiên, đối tượng DateTime với dấu thời gian có thể được tạo bằng cách cung cấp tham số TZ.

import datetime
import pytz
from dateutil.parser import parse

# Dạng string time
date_string = '2019-03-21 03:41:16'

# Strptime
format = '%Y-%m-%d %H:%M:%S'
date_time_python = datetime.datetime.strptime(date_string, format)
7
import datetime
import pytz
from dateutil.parser import parse

# Dạng string time
date_string = '2019-03-21 03:41:16'

# Strptime
format = '%Y-%m-%d %H:%M:%S'
date_time_python = datetime.datetime.strptime(date_string, format)
8
import datetime
import pytz

# Dạng native date
date_time_now = datetime.datetime.now()
print(date_time_now.tzname())

# Dạng utc
UTC = pytz.utc
date_time_utc_now = UTC.localize(date_time_now)
print(date_time_utc_now.tzname())

# Dạng 'Asia/Ho_Chi_Minh'

VN_TZ = pytz.timezone('Asia/Ho_Chi_Minh')
date_time_vntz_now = date_time_utc_now.astimezone(VN_TZ)
print(date_time_vntz_now.tzname())
3
import datetime
import pytz
from dateutil.parser import parse

# Dạng string time
date_string = '2019-03-21 03:41:16'

# Strptime
format = '%Y-%m-%d %H:%M:%S'
date_time_python = datetime.datetime.strptime(date_string, format)
8
import datetime

# Dạng datetime
date_time_now = datetime.datetime.now()

# Dạng timestamp
timestamp_now = date_time_now.timestamp()
6

  • Cải thiện bài viết
  • Lưu bài viết
  • Tuy nhiên, đối tượng DateTime với dấu thời gian có thể được tạo bằng cách cung cấp tham số TZ.

    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-21 03:41:16'
    
    # Strptime
    format = '%Y-%m-%d %H:%M:%S'
    date_time_python = datetime.datetime.strptime(date_string, format)
    
    7
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-21 03:41:16'
    
    # Strptime
    format = '%Y-%m-%d %H:%M:%S'
    date_time_python = datetime.datetime.strptime(date_string, format)
    
    8
    import datetime
    import pytz
    
    # Dạng native date
    date_time_now = datetime.datetime.now()
    print(date_time_now.tzname())
    
    # Dạng utc
    UTC = pytz.utc
    date_time_utc_now = UTC.localize(date_time_now)
    print(date_time_utc_now.tzname())
    
    # Dạng 'Asia/Ho_Chi_Minh'
    
    VN_TZ = pytz.timezone('Asia/Ho_Chi_Minh')
    date_time_vntz_now = date_time_utc_now.astimezone(VN_TZ)
    print(date_time_vntz_now.tzname())
    
    3
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-21 03:41:16'
    
    # Strptime
    format = '%Y-%m-%d %H:%M:%S'
    date_time_python = datetime.datetime.strptime(date_string, format)
    
    8
    import datetime
    
    # Dạng datetime
    date_time_now = datetime.datetime.now()
    
    # Dạng timestamp
    timestamp_now = date_time_now.timestamp()
    
    6

    Cải thiện bài viết

    Lưu bài viết

    Đọc

    • Bàn luậnReturns the current local date and time.
    • Timezone được định nghĩa là một khu vực hoặc khu vực địa lý trong suốt thời gian tiêu chuẩn được quan sát. Về cơ bản nó đề cập đến thời gian địa phương của một khu vực hoặc quốc gia. Hầu hết các múi giờ được bù đắp từ thời gian phối hợp (UTC), tiêu chuẩn thế giới cho múi giờ.Returns a datetime with the same attributes, except for those attributes given new values by whichever keyword arguments are specified.

    Để loại bỏ dấu thời gian, tzinfo phải được đặt không khi gọi chức năng thay thế ().

    Đầu tiên, hãy tạo một đối tượng DateTime với thời gian hiện tại bằng DateTime.now (). Đối tượng DateTime sau đó đã được sửa đổi để chứa thông tin múi giờ cũng bằng cách sử dụng timezone.utc. Đối tượng DateTime với thông tin Timezone sau đó được thao tác bằng phương thức .Replace () để xóa thông tin múi giờ bằng tham số TZINFO.datetime.now(). The DateTime object was then modified to contain the timezone information as well using the timezone.utc. The DateTime object with timezone information is then manipulated using the .replace() method to remove the timezone information using the tzinfo parameter.

    Syntax:

    replace(tzinfo=None)

    Example:

    Python

    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-21 03:41:16'
    
    # Strptime
    format = '%Y-%m-%d %H:%M:%S'
    date_time_python = datetime.datetime.strptime(date_string, format)
    
    3
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-21 03:41:16'
    
    # Strptime
    format = '%Y-%m-%d %H:%M:%S'
    date_time_python = datetime.datetime.strptime(date_string, format)
    
    4
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-21 03:41:16'
    
    # Strptime
    format = '%Y-%m-%d %H:%M:%S'
    date_time_python = datetime.datetime.strptime(date_string, format)
    
    5
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-21 03:41:16'
    
    # Strptime
    format = '%Y-%m-%d %H:%M:%S'
    date_time_python = datetime.datetime.strptime(date_string, format)
    
    6

    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-21 03:41:16'
    
    # Strptime
    format = '%Y-%m-%d %H:%M:%S'
    date_time_python = datetime.datetime.strptime(date_string, format)
    
    7
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-21 03:41:16'
    
    # Strptime
    format = '%Y-%m-%d %H:%M:%S'
    date_time_python = datetime.datetime.strptime(date_string, format)
    
    8
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-21 03:41:16'
    
    # Strptime
    format = '%Y-%m-%d %H:%M:%S'
    date_time_python = datetime.datetime.strptime(date_string, format)
    
    9

    import datetime
    
    # Dạng datetime
    date_time_now = datetime.datetime.now()
    
    # Dạng timestamp
    timestamp_now = date_time_now.timestamp()
    
    0
    import datetime
    
    # Dạng datetime
    date_time_now = datetime.datetime.now()
    
    # Dạng timestamp
    timestamp_now = date_time_now.timestamp()
    
    1

    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-21 03:41:16'
    
    # Strptime
    format = '%Y-%m-%d %H:%M:%S'
    date_time_python = datetime.datetime.strptime(date_string, format)
    
    7
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-21 03:41:16'
    
    # Strptime
    format = '%Y-%m-%d %H:%M:%S'
    date_time_python = datetime.datetime.strptime(date_string, format)
    
    8
    import datetime
    
    # Dạng datetime
    date_time_now = datetime.datetime.now()
    
    # Dạng timestamp
    timestamp_now = date_time_now.timestamp()
    
    4
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-21 03:41:16'
    
    # Strptime
    format = '%Y-%m-%d %H:%M:%S'
    date_time_python = datetime.datetime.strptime(date_string, format)
    
    8
    import datetime
    
    # Dạng datetime
    date_time_now = datetime.datetime.now()
    
    # Dạng timestamp
    timestamp_now = date_time_now.timestamp()
    
    6

    import datetime
    
    # Dạng datetime
    date_time_now = datetime.datetime.now()
    
    # Dạng timestamp
    timestamp_now = date_time_now.timestamp()
    
    0
    import datetime
    
    # Dạng datetime
    date_time_now = datetime.datetime.now()
    
    # Dạng timestamp
    timestamp_now = date_time_now.timestamp()
    
    1

    import datetime
    
    # Dạng datetime
    date_time_now = datetime.datetime.now()
    
    # Dạng timestamp
    timestamp_now = date_time_now.timestamp()
    
    9
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-21 03:41:16'
    
    # Strptime
    format = '%Y-%m-%d %H:%M:%S'
    date_time_python = datetime.datetime.strptime(date_string, format)
    
    8
    import datetime
    
    # Dạng datetime
    date_time_now = datetime.datetime.now()
    
    # Dạng timestamp
    timestamp_now = date_time_now.timestamp()
    
    4
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-21 03:41:16'
    
    # Strptime
    format = '%Y-%m-%d %H:%M:%S'
    date_time_python = datetime.datetime.strptime(date_string, format)
    
    8
    import datetime
    import pytz
    
    # Dạng native date
    date_time_now = datetime.datetime.now()
    print(date_time_now.tzname())
    
    # Dạng utc
    UTC = pytz.utc
    date_time_utc_now = UTC.localize(date_time_now)
    print(date_time_utc_now.tzname())
    
    3
    import datetime
    import pytz
    
    # Dạng native date
    date_time_now = datetime.datetime.now()
    print(date_time_now.tzname())
    
    # Dạng utc
    UTC = pytz.utc
    date_time_utc_now = UTC.localize(date_time_now)
    print(date_time_utc_now.tzname())
    
    4

    import datetime
    
    # Dạng datetime
    date_time_now = datetime.datetime.now()
    
    # Dạng timestamp
    timestamp_now = date_time_now.timestamp()
    
    0
    import datetime
    import pytz
    
    # Dạng native date
    date_time_now = datetime.datetime.now()
    print(date_time_now.tzname())
    
    # Dạng utc
    UTC = pytz.utc
    date_time_utc_now = UTC.localize(date_time_now)
    print(date_time_utc_now.tzname())
    
    6

    Output:  

    2021-08-10 12:51:42.093388
    2021-08-10 12:51:42.093388+00:00
    2021-08-10 12:51:42.09338

    Tuy nhiên, đối tượng DateTime với dấu thời gian có thể được tạo bằng cách cung cấp tham số TZ.tz parameter.

    Example:

    Python

    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-21 03:41:16'
    
    # Strptime
    format = '%Y-%m-%d %H:%M:%S'
    date_time_python = datetime.datetime.strptime(date_string, format)
    
    3
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-21 03:41:16'
    
    # Strptime
    format = '%Y-%m-%d %H:%M:%S'
    date_time_python = datetime.datetime.strptime(date_string, format)
    
    4
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-21 03:41:16'
    
    # Strptime
    format = '%Y-%m-%d %H:%M:%S'
    date_time_python = datetime.datetime.strptime(date_string, format)
    
    5
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-21 03:41:16'
    
    # Strptime
    format = '%Y-%m-%d %H:%M:%S'
    date_time_python = datetime.datetime.strptime(date_string, format)
    
    6

    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-21 03:41:16'
    
    # Strptime
    format = '%Y-%m-%d %H:%M:%S'
    date_time_python = datetime.datetime.strptime(date_string, format)
    
    7
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-21 03:41:16'
    
    # Strptime
    format = '%Y-%m-%d %H:%M:%S'
    date_time_python = datetime.datetime.strptime(date_string, format)
    
    8
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-21 03:41:16'
    
    # Strptime
    format = '%Y-%m-%d %H:%M:%S'
    date_time_python = datetime.datetime.strptime(date_string, format)
    
    9

    import datetime
    
    # Dạng datetime
    date_time_now = datetime.datetime.now()
    
    # Dạng timestamp
    timestamp_now = date_time_now.timestamp()
    
    0
    import datetime
    
    # Dạng datetime
    date_time_now = datetime.datetime.now()
    
    # Dạng timestamp
    timestamp_now = date_time_now.timestamp()
    
    1

    import datetime
    
    # Dạng datetime
    date_time_now = datetime.datetime.now()
    
    # Dạng timestamp
    timestamp_now = date_time_now.timestamp()
    
    9
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-21 03:41:16'
    
    # Strptime
    format = '%Y-%m-%d %H:%M:%S'
    date_time_python = datetime.datetime.strptime(date_string, format)
    
    8
    import datetime
    
    # Dạng datetime
    date_time_now = datetime.datetime.now()
    
    # Dạng timestamp
    timestamp_now = date_time_now.timestamp()
    
    4
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-21 03:41:16'
    
    # Strptime
    format = '%Y-%m-%d %H:%M:%S'
    date_time_python = datetime.datetime.strptime(date_string, format)
    
    8
    import datetime
    import pytz
    
    # Dạng native date
    date_time_now = datetime.datetime.now()
    print(date_time_now.tzname())
    
    # Dạng utc
    UTC = pytz.utc
    date_time_utc_now = UTC.localize(date_time_now)
    print(date_time_utc_now.tzname())
    
    3
    import datetime
    import pytz
    
    # Dạng native date
    date_time_now = datetime.datetime.now()
    print(date_time_now.tzname())
    
    # Dạng utc
    UTC = pytz.utc
    date_time_utc_now = UTC.localize(date_time_now)
    print(date_time_utc_now.tzname())
    
    4

    import datetime
    
    # Dạng datetime
    date_time_now = datetime.datetime.now()
    
    # Dạng timestamp
    timestamp_now = date_time_now.timestamp()
    
    0
    import datetime
    import pytz
    
    # Dạng native date
    date_time_now = datetime.datetime.now()
    print(date_time_now.tzname())
    
    # Dạng utc
    UTC = pytz.utc
    date_time_utc_now = UTC.localize(date_time_now)
    print(date_time_utc_now.tzname())
    
    6

    Output:

    2021-08-10 07:21:57.838856+00:00
    2021-08-10 07:21:57.838856