pytz 时区 DST 问题
pytz timezone DST issue
我将两个天真的日期传递给一个表单。然后使用 pytz 确保时区设置为 EST。但是,它会导致错误。我猜这是由于 DST 问题。日期和 DST 令人困惑。有人可以告诉我如何制作 "DST proof" 吗?
from rest_framework import serializers
from datetime import datetime
import pytz
class SearchForm(serializers.Serializer):
start_date = serializers.DateField(required=True)
end_date = serializers.DateField(required=False)
def save(self):
# Doesn't actually save,
start_date = self.validated_data['start_date']
end_date = self.validated_data['end_date']
# Convert dates to EST timezone
est = pytz.timezone('America/New_York')
start_date = datetime.combine(start_date, time.min).astimezone(est)
end_date = datetime.combine(end_date, time.max).astimezone(est)
print(f'Start date: {start_date} => {start_date.tzinfo}')
print(f'End date: {end_date} => {end_date.tzinfo}')
assert start_date.tzinfo == end_date.tzinfo
# Filter based on timeframe
qs = self.filter_timeframe(qs, start_date, end_date)
return SearchSerializer(qs, many=True)
将 start_date
作为“2018-11-1”传递,将 end_date
作为“2018-11-5”传递会导致 AssertionError
。打印日期结果为:
Start date: 2018-11-01 00:00:00-04:00 => America/New_York
End date: 2018-11-05 23:59:59.999999-05:00 => America/New_York
问题是为什么 end_date
时区 -05:00
而不是 -04:00
像 start_date
?
America/New_York 与 EST 不同。前者根据夏令时的变化进行调整。后者固定为东部标准时间。
使用:
est = pytz.timezone('EST')
我将两个天真的日期传递给一个表单。然后使用 pytz 确保时区设置为 EST。但是,它会导致错误。我猜这是由于 DST 问题。日期和 DST 令人困惑。有人可以告诉我如何制作 "DST proof" 吗?
from rest_framework import serializers
from datetime import datetime
import pytz
class SearchForm(serializers.Serializer):
start_date = serializers.DateField(required=True)
end_date = serializers.DateField(required=False)
def save(self):
# Doesn't actually save,
start_date = self.validated_data['start_date']
end_date = self.validated_data['end_date']
# Convert dates to EST timezone
est = pytz.timezone('America/New_York')
start_date = datetime.combine(start_date, time.min).astimezone(est)
end_date = datetime.combine(end_date, time.max).astimezone(est)
print(f'Start date: {start_date} => {start_date.tzinfo}')
print(f'End date: {end_date} => {end_date.tzinfo}')
assert start_date.tzinfo == end_date.tzinfo
# Filter based on timeframe
qs = self.filter_timeframe(qs, start_date, end_date)
return SearchSerializer(qs, many=True)
将 start_date
作为“2018-11-1”传递,将 end_date
作为“2018-11-5”传递会导致 AssertionError
。打印日期结果为:
Start date: 2018-11-01 00:00:00-04:00 => America/New_York
End date: 2018-11-05 23:59:59.999999-05:00 => America/New_York
问题是为什么 end_date
时区 -05:00
而不是 -04:00
像 start_date
?
America/New_York 与 EST 不同。前者根据夏令时的变化进行调整。后者固定为东部标准时间。 使用:
est = pytz.timezone('EST')