如何获得一天中的第一个日期时间?

Posted

技术标签:

【中文标题】如何获得一天中的第一个日期时间?【英文标题】:How to get the first datetime of a day? 【发布时间】:2015-03-02 10:59:38 【问题描述】:

使用 pytz 和 Python 3.4,如何在给定的时区(假设为 'America/Sao_Paulo')中获取给定日期(假设为 2014-10-19)的第一个 datetime

【问题讨论】:

您有datetimes 的列表吗?首先是什么意思? 有很多方法可以解释这个问题,一些输入和预期输出会让你想要做的事情更加明显。 首先,我的意思是该日期和时区的日期时间不大于该日期和时区的任何其他日期时间。 相关:How do I get the UTC time of “midnight” for a given timezone? 【参考方案1】:

使用localize()方法附加时区:

from datetime import datetime
import pytz # $ pip install pytz

tz = pytz.timezone('America/Sao_Paulo')    
naive = datetime(2014, 10, 19)
aware = tz.localize(naive, is_dst=None)

如果你运行代码;它生成NonExistentTimeError。如何处理此错误取决于应用程序,例如,在午夜附近获取一些有效的本地时间:

aware = tz.normalize(tz.localize(naive, is_dst=False))

或者您可以逐分钟增加时间,直到获得有效的本地(圣保罗)时间:

from datetime import datetime, timedelta
import pytz # $ pip install pytz

tz = pytz.timezone('America/Sao_Paulo')
d = naive = datetime(2014, 10, 19)
while True:
    try:
        aware = tz.localize(d, is_dst=None)
    except pytz.AmbiguousTimeError:
        aware = tz.localize(d, is_dst=False)
        assert tz.localize(d, is_dst=False) > tz.localize(d, is_dst=True)
        break
    except pytz.NonExistentTimeError:
        d += timedelta(minutes=1) # try future time
        continue
    else:
        break

结果:

>>> aware
datetime.datetime(2014, 10, 19, 1, 0, tzinfo=<DstTzInfo 'America/Sao_Paulo' BRST-1 day, 22:00:00 DST>
>>> aware.strftime('%Y-%m-%d %H:%M:%S %Z%z')
'2014-10-19 01:00:00 BRST-0200'

注意:当天第一个有效时间为01:00。并且时区比 UTC 晚两个小时(本地 = utc - 2)。

【讨论】:

以上是关于如何获得一天中的第一个日期时间?的主要内容,如果未能解决你的问题,请参考以下文章

获取“一天中的第几周”?

如何将包含日期时间的 DataFrame 列拆分为两列:一列包含日期,另一列包含一天中的时间?

DateTimePicker - 如何将时间间隔设置为 20 分钟、一周中允许的特定日期和一天中的时间?

Javascript中的日期差异(忽略一天中的时间)

在java中如何通过一个月份,获得该月份的第一天的日期?

MySQL中如何获得指定日期中月份的第一天是周几?