在Python中,将一天中的特定时间与纪元中的当前时间进行比较

时间:2016-05-18 11:03:45

标签: python datetime time

我试图将当前时间(A)与当天的某个时间(B)进行比较。随后,根据比较结果,我想在明天(C)或后天(D)返回特定时间的POSIX时间。

举例说明:

  

假设我们当前时间(A)为12:00。   我想将其与(B)进行比较,即今天20:00。

     

由于A< B,我想明天13:00返回,格式化为POSIX时间。

另一个例子:

  

现在假设当前时间(A)是21:00。   我仍然希望将其与(B)进行比较,即今天20:00。

     

由于A> B,我希望明天之后返回13:00,再次格式化为POSIX时间。

我一直在尝试使用timedatetime库来完成这项工作,但在使用time时,我很难找到B并且在使用{{1时我无法找到一种方法将C和D作为POSIX时间返回。

我是否正确识别了应该使用哪些库?如果是,我缺少什么?

2 个答案:

答案 0 :(得分:2)

有两个问题:

  • 根据相对于20:00 <的当前时间,确定您是否需要“明天13:00”“后天13:00” / LI>
  • 将结果转换为例如“明天13:00”到POSIX时间

第一个很简单:

#!/usr/bin/env python
import datetime as DT

current_time = DT.datetime.now()
one_or_two = 1 if current_time.time() < DT.time(20, 0) else 2
target_date = current_time.date() + DT.timedelta(days=one_or_two)
target_time = DT.datetime.combine(target_date, DT.time(13, 0))

注意:00:00被视为小于20:00。您可能希望使用时间间隔,例如20:00-8:008:00-20:00find out whether the current time is in between

第二个问题与How do I convert local time to UTC in Python?基本相同在一般情况下,没有确切的答案,例如,相同的本地时间可能会发生两次或者可能完全丢失 - 使用的答案取决于具体的应用。请参阅我对python converting string in localtime to UTC epoch timestamp的回复中的详细信息。

要获得正确的结果,要考虑可能的DST转换或现在与目标时间之间的本地UTC偏移的其他变化(例如,“后天”):

import pytz    # $ pip install pytz
import tzlocal # $ pip install tzlocal

epoch = DT.datetime(1970,1,1, tzinfo=pytz.utc)
local_timezone = tzlocal.getlocalzone()
timezone_aware_dt = local_timezone.localize(target_time, is_dst=None)
posix_time = (timezone_aware_dt - epoch).total_seconds()

注意:is_dst=None用于断言给定的本地时间存在且明确无误,例如,当地时间13:00没有DST转换。

如果time.mktime()可以访问您平台上的历史时区数据库(或者您只是不关心本地utc偏移的变化),那么您可以仅使用stdlib找到“纪元”时间:

import time

unix_time = time.mktime(target_time.timetuple())

您可以在Find if 24 hrs have passed between datetimes - Python中阅读有关何时失败以及如何解决此问题的详细信息。

或者你可能想知道如何在Python中找到POSIX时间戳,可以在Converting datetime.date to UTC timestamp in Python中找到。

答案 1 :(得分:0)

import datetime

A = datetime.datetime.now()
# A = A.replace(hour=21, minute=5)  # This line simlulates "after 21:00"
B = A.replace(hour=20, minute=0, second=0, microsecond=0)  # 20:00 today

if A < B:
    print A.replace(hour=13, minute=0, second=0, microsecond=0) + datetime.timedelta(days=1)  # 13:00 tomorrow
else:
    print A.replace(hour=13, minute=0, second=0, microsecond=0) + datetime.timedelta(days=2)  # 13:00 the day after

在Python 3中,您可以返回

X.timestamp()
在Python 2中你可以使用

def timestamp(dt):
    return (dt - datetime.datetime(1970, 1, 1)).total_seconds()

timestamp(X)