Python xử lý múi giờ như thế nào?

Đối với người dùng Windows như tôi, lớp ZoneInfo có thể không hoạt động. Nhập nội dung nào đó như tz7 sẽ trả về “ZoneInfoNotFoundError”

Theo Python,

Một số hệ thống, đặc biệt là các hệ thống Windows, không có sẵn cơ sở dữ liệu IANA, do đó, đối với các dự án hướng đến khả năng tương thích đa nền tảng yêu cầu dữ liệu múi giờ, bạn nên khai báo một phụ thuộc vào tzdata

Giải pháp là sử dụng pip để cài đặt 'tzdata' trước khi làm việc với lớp ZoneInfo

jamesbrown68 trên

Đăng, xin lỗi. Tôi đã đưa ra nhận xét của mình trước khi thấy bạn xử lý cơ sở dữ liệu IANA bị thiếu trong video của mình. Lấy làm tiếc

raulfz trên

Tôi đã thử xem có gì trong zoneinfo. available_timezones() và tôi gặp lỗi khi thông báo 'zoneinfo' không được xác định. Tuy nhiên, tôi đã nhập nó. Ai đó có thể chỉ cho tôi vấn đề là gì không?

Python xử lý múi giờ như thế nào?

Bartosz Zaczyński Nhóm RP trên

@raulfz Bạn có chắc là mình đang chạy Python 3 không. 9? . Bạn có phiền khi chia sẻ nó không?

raulfz trên

Xin chào, cảm ơn rất nhiều vì phản hồi của bạn. Tôi không nhận ra rằng mình vừa nhập chức năng TimeZone chứ không phải toàn bộ mô-đun múi giờ, đó là vấn đề

Tôi đã làm theo mã video chính xác như được hiển thị

from zoneinfo import TimeZone

thay vì viết

import zoneinfo

Tôi có thể đã nhận ra điều gì khi gọi điện cho tz8 Cảm ơn bạn đã dành thời gian trả lời câu hỏi của tôi

Tốt nhất, R

Christopher Trudeau Nhóm RP trên

Xin chào @raulfz,

Bạn đúng. Có vẻ như tôi đã bỏ lỡ một dòng khi tôi sao chép nó vào bản trình bày. Tôi sẽ vá nó để tránh nhầm lẫn trong tương lai. Xin lỗi vì điều đó

raulfz trên

Không có vấn đề gì cả, thực ra tôi nên suy luận nó bằng cách lưu ý rằng bạn đang gọi phương thức trên đối tượng zoneinfo chứ không phải trên ZoneInfo. Dù sao, cảm ơn bạn đã dành thời gian

Làm việc với ngày và giờ có thể phức tạp, đặc biệt là khi xử lý chuyển đổi múi giờ. Hướng dẫn này sẽ cung cấp tổng quan về mô-đun ngày giờ của Python, nhấn mạnh vào các chức năng liên quan đến múi giờ

sở thích

Được đăng trong những sở thích này

Python xử lý múi giờ như thế nào?

Đặt mua

con trăn

h/python • 67 hướng dẫn

1

Đầu tiên, nếu bạn đã thấy datetime được sử dụng trong Python, bạn sẽ nhận thấy rằng nó vừa là tên của mô-đun vừa là một trong nhiều lớp bên trong mô-đun. Vì vậy, mô-đun datetime có thể được nhập như thế này

import datetime

# datetime.datetime
# datetime.timedelta
# datetime.timezone  (python 3.2+)

Hoặc bạn có thể chỉ cần nhập các lớp ngày giờ mà bạn quan tâm

from datetime import datetime, timedelta

Một đối tượng datetime là một thể hiện của datetime. lớp datetime đại diện cho một thời điểm duy nhất. Nếu bạn đã quen thuộc với lập trình hướng đối tượng, một đối tượng datetime được tạo bằng cách khởi tạo lớp datetime với một ngày tháng

Một cách dễ dàng để lấy đối tượng datetime là sử dụng datetime. Hiện nay

import datetime

datetime.datetime.now()
> datetime.datetime(2016, 11, 15, 9, 59, 25, 608206)

Như bạn có thể thấy, phương thức now trả về một đối tượng datetime đại diện cho thời điểm mà now được gọi

Bạn cũng có thể tạo một đối tượng ngày giờ bằng cách chỉ định ngày bạn muốn biểu thị. Tối thiểu, việc khởi tạo ngày giờ yêu cầu ít nhất 3 đối số - năm, tháng và ngày

Hãy khởi tạo ngày sinh nhật của tôi

import datetime

datetime.datetime(1985,  10, 20)
> datetime.datetime(1985, 10, 20, 0, 0)

Từ đây, chúng ta sẽ nói về thao tác, định dạng và thực hiện chuyển đổi múi giờ trên các đối tượng ngày giờ

2

Theo tài liệu, "trọng tâm của việc triển khai [của thư viện datetime] là trích xuất thuộc tính hiệu quả để định dạng và thao tác đầu ra". Vì vậy, chúng tôi sẽ thảo luận về việc trích xuất các thuộc tính và định dạng ngày tháng

Đối với ví dụ này, chúng tôi sẽ chọn một ngày ngẫu nhiên

import datetime

d = datetime.datetime(1984, 1, 10, 23, 30)

Có nhiều trường hợp chúng ta muốn định dạng một đối tượng ngày giờ theo một cách cụ thể. Đối với điều này, phương pháp strftime rất tiện dụng. Phương pháp này cho phép bạn in một chuỗi được định dạng bằng một loạt các lệnh định dạng. Điều này được hiểu rõ nhất với các ví dụ

d.strftime("%B %d, %Y")
> 'January 10, 1984'

d.strftime("%Y/%m/%d")
> '1984/01/10'

d.strftime("%d %b %y")
> '10 Jan 84'

d.strftime("%Y-%m-%d %H:%M:%S")
> '1984-01-10 23:30:00'

Như bạn hy vọng có thể nói, cùng một đối tượng ngày giờ được sử dụng để tạo từng định dạng ngày. Định dạng được chỉ định bằng cách sử dụng các chỉ thị định dạng khác nhau. Ví dụ: %Y tương ứng với năm có đủ bốn chữ số, trong khi %m tương ứng với số thập phân có hai chữ số biểu thị tháng. Xem danh sách đầy đủ các chỉ thị định dạng

Cũng có thể truy cập trực tiếp các thuộc tính khác nhau của đối tượng datetime

________số 8_______

Khi thảo luận về định dạng, bạn nên làm quen với ISO 8601, đây là một tiêu chuẩn quốc tế để trình bày ngày và giờ. Python có một phương pháp để nhanh chóng tạo ngày/giờ được định dạng theo tiêu chuẩn ISO 8601

d.isoformat()
> '1984-01-10T23:30:00'

Bây giờ chúng ta sẽ thảo luận về mặt trái của strftime, đó là strptime. Đây là nơi bạn tạo một đối tượng ngày giờ từ một chuỗi. Nhưng vì chuỗi có thể được định dạng theo bất kỳ cách nào, nên cần phải cho datetime biết định dạng mong đợi. Sử dụng cùng một bộ chỉ thị định dạng, chúng ta có thể chuyển vào một chuỗi và định dạng dự kiến ​​để tạo một đối tượng ngày giờ

import datetime

datetime.datetime.strptime("December 25, 2010", "%B %d, %Y")
> datetime.datetime(2010, 12, 25, 0, 0)

Lưu ý cách mẫu khớp chính xác với chuỗi. Nếu bạn sử dụng một chỉ thị định dạng hoặc ngày không hợp lý, nó sẽ đưa ra một ngoại lệ

3

Cho đến nay, việc khởi tạo và định dạng các đối tượng ngày giờ khá dễ dàng. Tuy nhiên, múi giờ thêm một chút phức tạp vào phương trình

ngây thơ vs nhận thức

Cho đến nay chúng ta chỉ xử lý các đối tượng datetime ngây thơ. Điều đó có nghĩa là đối tượng ngây thơ với bất kỳ loại múi giờ nào. Vì vậy, một đối tượng datetime có thể được bù ngây thơ hoặc nhận biết bù

Độ lệch của múi giờ đề cập đến số giờ múi giờ tính từ Giờ phối hợp quốc tế (UTC)

Một đối tượng datetime ngây thơ không chứa thông tin múi giờ. Cách dễ nhất để biết một đối tượng datetime có ngây thơ hay không là kiểm tra tzinfo. tzinfo sẽ được đặt thành Không có đối tượng nào ngây thơ

import datetime

naive = datetime.datetime.now()
naive.tzinfo
> None

Để nhận biết đối tượng datetime, bạn có thể sử dụng thư viện pytz. Trước tiên, bạn phải khởi tạo một đối tượng múi giờ, sau đó sử dụng đối tượng múi giờ đó để "bản địa hóa" một đối tượng ngày giờ. Bản địa hóa chỉ đơn giản là cung cấp thông tin múi giờ của đối tượng

from datetime import datetime, timedelta
0

Một đối tượng datetime ngây thơ bị giới hạn ở chỗ nó không thể định vị chính nó trong mối quan hệ với các đối tượng datetime đã biết. Ví dụ

from datetime import datetime, timedelta
1

Khi xử lý các đối tượng datetime, tôi đã bắt gặp hai lời khuyên mà tôi thường đồng ý. Đầu tiên, luôn luôn sử dụng các đối tượng datetime "nhận biết". Và thứ hai, luôn làm việc ở UTC và thực hiện chuyển đổi múi giờ là bước cuối cùng

Cụ thể hơn, như được chỉ ra bởi người dùng jarhwah trên reddit, bạn nên lưu trữ thời gian ở dạng UTC và chuyển đổi trên màn hình

Khi bạn đã quen thuộc với các đối tượng ngày giờ nhận biết, việc chuyển đổi múi giờ tương đối dễ dàng. Hãy tạo một đối tượng ngày giờ với múi giờ UTC và chuyển đổi nó thành Tiêu chuẩn Thái Bình Dương

from datetime import datetime, timedelta
2

Vì vậy, pst_now và utc_now là các đối tượng ngày giờ khác nhau với các múi giờ khác nhau, nhưng chúng bằng nhau. Để chắc chắn, chúng ta có thể in thời gian của mỗi

from datetime import datetime, timedelta
3

4

Thường thì chúng ta sẽ làm việc với nhiều đối tượng ngày giờ và chúng ta sẽ muốn so sánh chúng. Lớp timedelta rất hữu ích để tìm sự khác biệt giữa hai ngày hoặc thời gian. Trong khi các đối tượng datetime biểu thị một thời điểm, thì các đối tượng timedelta biểu thị một khoảng thời gian, như 5 ngày hoặc 10 giây

Giả sử tôi muốn biết chính xác tôi hơn anh trai bao nhiêu tuổi. Tôi sẽ tạo đối tượng datetime cho mỗi chúng ta đại diện cho ngày và giờ sinh của chúng ta

from datetime import datetime, timedelta
4

Vì chúng tôi muốn làm việc với các đối tượng nhận biết bù trừ, chúng tôi sẽ thêm thông tin múi giờ

from datetime import datetime, timedelta
5

Để xem tôi lớn hơn anh trai tôi bao nhiêu tuổi, chúng ta chỉ cần trừ hai đối tượng ngày giờ. Và để xem câu trả lời theo cách mà con người có thể đọc được, chúng ta có thể in ra sự khác biệt một cách đơn giản

from datetime import datetime, timedelta
6

Biến diff thực sự là một đối tượng timedelta trông giống như datetime này. múi giờ(2440, 2100)

Trừ một đối tượng datetime khỏi một đối tượng khác sẽ tạo ra một đối tượng timedelta, vì vậy, như bạn có thể nghi ngờ, trừ một đối tượng timedelta khỏi một đối tượng datetime sẽ tạo ra một đối tượng datetime

from datetime import datetime, timedelta
7

Tất nhiên điều này cũng đúng với phép cộng

Điều này hữu ích để trả lời các câu hỏi như "3 tuần trước kể từ ngày hôm qua là ngày nào?"

Để trả lời câu hỏi thứ hai, chúng ta cần có hai thứ - thứ nhất, đối tượng datetime đại diện cho ngày hôm nay và thứ hai, đối tượng timedelta đại diện cho 90 ngày

from datetime import datetime, timedelta
8

Sau đó, chúng ta có thể chỉ cần làm phép tính

from datetime import datetime, timedelta
9

Và vì chúng tôi muốn biết ngày trong tuần, chúng tôi có thể sử dụng strftime

import datetime

datetime.datetime.now()
> datetime.datetime(2016, 11, 15, 9, 59, 25, 608206)
0

5

Ngày và giờ có thể phức tạp, nhưng lớp datetime của Python sẽ giúp mọi thứ dễ dàng hơn một chút. Hy vọng rằng bạn tìm thấy hướng dẫn này là hữu ích. Nếu bạn nghĩ rằng có bất kỳ ví dụ hoặc chủ đề cơ bản nào khác liên quan đến các đối tượng ngày giờ và múi giờ, vui lòng bình luận bên dưới và tôi sẽ cố gắng thêm chúng vào hướng dẫn

Chia sẻ

FacebookRedditTwitterPinterestEmailText message

Yêu thích

TIẾP THEO

Cách sử dụng Blender để tạo mô hình 3D

Python xử lý múi giờ như thế nào?

Tìm hiểu các ABC của XYZ

Python xử lý múi giờ như thế nào?
Tro tàn (362)

Ngày 24 tháng 6 năm 2022

0

Blender là một công cụ nguồn mở tuyệt vời dành cho các nhà sản xuất, họa sĩ hoạt hình, nghệ sĩ và những người khác muốn mở rộng khả năng sáng tạo của họ với thế giới mô hình 3d

Dữ liệu múi giờ nên được xử lý như thế nào trong Python?

Tham số pytz. múi giờ cho phép chúng tôi chỉ định thông tin múi giờ dưới dạng chuỗi . Chúng tôi có thể chuyển vào bất kỳ múi giờ có sẵn nào và sẽ nhận được thời gian ngày hiện tại của múi giờ đó và nó cũng sẽ in phần bù đối với UTC. Tôi. e. , chênh lệch giữa múi giờ UTC(+00. 00) và múi giờ đã chỉ định.

Múi giờ datetime của Python có nhận biết không?

Các đối tượng nhận biết múi giờ là các đối tượng Ngày giờ hoặc thời gian của Python bao gồm thông tin múi giờ . Một đối tượng nhận thức đại diện cho một thời điểm cụ thể không thể giải thích được.

Python sử dụng thư viện nào cho các múi giờ?

pytz đưa cơ sở dữ liệu Olson tz vào Python . Thư viện này cho phép tính toán múi giờ chính xác và đa nền tảng bằng Python 2. 4 hoặc cao hơn. Nó cũng giải quyết vấn đề về thời gian mơ hồ vào cuối giờ tiết kiệm ánh sáng ban ngày, bạn có thể đọc thêm về vấn đề này trong Tham khảo thư viện Python ( datetime. tzinfo ).