Hướng dẫn python tzinfo - trăn tzinfo
Please note: The first part of this answer is or version 1.x of pendulum. See below for a version 2.x answer. Show
Nội dung chính ShowShow
I hope I'm not too late! The pendulum library excels at this and other date-time calculations.
Answer lists the names of the time zones that may be used with pendulum. (They're the same as for pytz.) For version 2:
...
Tổng quanGầ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. Nội dung chính
Tips 1: Chuẩn hóa múi giờ sử dụngI hope I'm not too late! The pendulum library excels at this and other date-time calculations. Tips 2: Convert String thành DatetimeAnswer lists the names of the time zones that may be used with pendulum. (They're the same as for pytz.)
For version 2:
3 is a list of the names of the time zones that might be used in a program
Tips 3: Chuyển hóa kiểu Datetime sang Timestamp Pythonnow I can show what this time is in each of the time zones in 5
Tips 4: Chuyển hóa kiểu native date sang UTC timezoneTips 5: Convert UTC sang timezone khác
Tips 6: Chuyên từ Timestamp sang Datetime Tips 5: Convert UTC sang timezone khácTips 6: Chuyên từ Timestamp sang Datetime
Tips 6: Chuyên từ Timestamp sang Datetime
Tips 7: Convert Datetime sang ISO 8601Múi giờ (timezone) là gì?
Vậy ta lấy gì làm mốc?Còn vấn đề nào khác? Còn vấn đề nào khác? Best practices Múi giờ (timezone) là gì?Vậy ta lấy gì làm mốc?
Còn vấn đề nào khác? Best practices Cũng chính vì thế mà DST gây ra những vấn đề lớn trong tính toán. Vậy ta lấy gì làm mốc?Múi giờ lấy làm mốc bây giờ là UTC. UTC là múi giờ không có DST hay những thay đổi trong quá khứ. Từ UTC bạn có thể chuyển đổi giờ sang giờ địa phương, nhưng ngược lại chưa chắc đã đúng vì lý do đã nêu ở trên.
Còn vấn đề nào khác?Tuy nhiên trong thư viện chuẩn của Python lại có sai sót trong thiết kế:
Tuy nhiên một số thứ không đúng. Vấn đề lớn nhất là chúng ta không thể tính toán với datetime object có timezone và datetime object không có chính timezone đó: 0Một vấn đề khác là có 2 cách để tạo datetime object vào thời điểm hiện tại trong Python: 1Một là giờ ở UTC, một là giờ địa phương. Tuy nhiên nó lại không cho bạn biết múi giờ địa phương là gì cũng như với 2 giá trị 7 và 8 bạn không thể biết được cái nào có múi giờ UTC.Thư viện còn cung cấp 3 object và 4 object. Và cả hai đều không có ý nghĩa gì nữa nếu dính líu đến timezone. Vì nếu chỉ 4 không thì không đủ hoặc nếu là 3 thì nó chỉ mang tính chất địa phương, nó có thể là hôm nay đối với tôi nhưng có thể là hôm qua, hoặc ngày mai đối với bạn.Best practicesConvert timezoneNếu bạn muốn tạo 0 object và lưu thông tin timezone, bạn không nên truyền 4 trong constructure mà nên dùng hàm 5 cung cấp bởi 6: 2Bạn có thể thấy với 8 nó sử dụng đúng offset ở thời điểm hiện lại là +8.Sử dụng UTC trong tính toán nội bộNếu bạn muốn lấy thời gian hiện tại, luôn luôn dùng 8. Khi người dùng nhập giờ địa phương, lập tức chuyển qua UTC rồi tiếp tục xử lý. Nếu bạn không biết múi giờ của người dùng, hãy hỏi họ, không thể tự ý đoán dựa trên IP hay số điện thoại (đây là ý tưởng thực khi mình làm dự án hiện tại).Không nên dùng offset-aware datetime 0 object là offset-aware khi nó lưu thông tin về timezone, nếu không thì gọi là offset-navie.Nó có thể là ý tưởng tốt nếu bạn lưu tzinfo trong 0 object. Nhưng sẽ tốt hơn nếu bạn không làm như vậy. Hãy tận dụng hạn chế trong thiết kế API:
Tại sao bạn nên làm như vậy? Đầu tiên là nhiều thư viện được viết với ngầm định 2. Thứ hai, sử dụng tzinfo trong khi thư viện chuẩn được thiết kế sai là một ý tưởng tệ hại. Đó cũng là lý do vì sao 6 cung cấp hàm 5 để chuyển đổi timezone vì API của thư viện chuẩn không đủ linh hoạt làm việc đó với hơn 500 timezone. Không sử dụng 4 là cơ hội để bạn trở nên tốt hơn.Lý do cuối cùng mà bạn không nên dùng offset-aware là bởi vì 4 object của các thư viện của các ngôn ngữ là khác nhau (implementation defined). Hiện nay chưa có chuẩn nào để truyền tzinfo từ ngôn ngữ này sang ngôn ngữ khác hay HTTP ngoài sử dụng UTC offset như hiện tại. |