Làm cách nào tôi có thể xóa múi giờ pytz khỏi đối tượng datetime?


120

Có cách nào đơn giản để loại bỏ múi giờ khỏi đối tượng datetime pytz không?
ví dụ: xây dựng lại dttừ dt_tztrong ví dụ này:

>>> import datetime
>>> import pytz
>>> dt = datetime.datetime.now()
>>> dt
datetime.datetime(2012, 6, 8, 9, 27, 32, 601000)
>>> dt_tz = pytz.utc.localize(dt)
>>> dt_tz
datetime.datetime(2012, 6, 8, 9, 27, 32, 601000, tzinfo=<UTC>)

Câu trả lời:


207

Để xóa múi giờ (tzinfo) khỏi đối tượng datetime:

# dt_tz is a datetime.datetime object
dt = dt_tz.replace(tzinfo=None)

Nếu bạn đang sử dụng một thư viện như mũi tên , thì bạn có thể loại bỏ múi giờ bằng cách chuyển đổi một đối tượng mũi tên thành đối tượng datetime, sau đó thực hiện tương tự như ví dụ trên.

# <Arrow [2014-10-09T10:56:09.347444-07:00]>
arrowObj = arrow.get('2014-10-09T10:56:09.347444-07:00')

# datetime.datetime(2014, 10, 9, 10, 56, 9, 347444, tzinfo=tzoffset(None, -25200))
tmpDatetime = arrowObj.datetime

# datetime.datetime(2014, 10, 9, 10, 56, 9, 347444)
tmpDatetime = tmpDatetime.replace(tzinfo=None)

Tại sao bạn sẽ làm điều này? Một ví dụ là mysql không hỗ trợ múi giờ với loại DATETIME. Vì vậy, sử dụng ORM như sqlalchemy sẽ đơn giản loại bỏ múi giờ khi bạn cung cấp cho nó một datetime.datetimeđối tượng để chèn vào cơ sở dữ liệu. Giải pháp là chuyển đổi datetime.datetimeđối tượng của bạn thành UTC (vì vậy mọi thứ trong cơ sở dữ liệu của bạn là UTC vì nó không thể chỉ định múi giờ), sau đó chèn nó vào cơ sở dữ liệu (dù sao múi giờ cũng bị xóa) hoặc tự xóa nó. Cũng lưu ý rằng bạn không thể so sánh datetime.datetimecác đối tượng trong đó một đối tượng nhận biết múi giờ và đối tượng khác là múi giờ ngây thơ.

##############################################################################
# MySQL example! where MySQL doesn't support timezones with its DATETIME type!
##############################################################################

arrowObj = arrow.get('2014-10-09T10:56:09.347444-07:00')

arrowDt = arrowObj.to("utc").datetime

# inserts datetime.datetime(2014, 10, 9, 17, 56, 9, 347444, tzinfo=tzutc())
insertIntoMysqlDatabase(arrowDt)

# returns datetime.datetime(2014, 10, 9, 17, 56, 9, 347444)
dbDatetimeNoTz = getFromMysqlDatabase()

# cannot compare timzeone aware and timezone naive
dbDatetimeNoTz == arrowDt # False, or TypeError on python versions before 3.3

# compare datetimes that are both aware or both naive work however
dbDatetimeNoTz == arrowDt.replace(tzinfo=None) # True
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.