首先您使用时间模块。在这种情况下,这不是最好的解决方案,下面我将解释原因。大部分情况下时间模块调用平台宿主的C库。也就是说,同一函数的行为和结果在不同的操作系统上会有所不同。
其次,代码不使用时区,这当然会导致严重的应用错误。
例子:
In [38]: time.localtime()
Out[38]: time.struct_time(tm_year=2018, tm_mon=2, tm_mday=16, tm_hour=5, tm_min=56, tm_sec=49, tm_wday=4, tm_yday=47, tm_isdst=0)
以 GMT 显示,但我的实际时间是
root@xxx# date
Fri Feb 16 13:57:55 +08 2018
我们在这里遇到时区。
时区是为了法律、商业和社会目的遵守统一标准时间的全球区域。时区倾向于遵循国家及其细分的边界,因为便于商业或其他通信密切的区域保持相同的时间。
在 Python 中,处理时间和日期的最佳方法是 datetime 模块用于操作,pytz 用于时区。
Pytz 没有标准 Python 的 lib,所以不要忘记安装它
pip install pytz
有两种日期和时间对象:“naive”和“aware”。
感知对象对适用的算法和政治时间调整有足够的了解,例如时区和夏令时信息,以相对于其他感知对象定位自身。感知对象用于表示不可解释的特定时刻。
naive 对象不包含足够的信息来明确地相对于其他日期/时间对象定位自身。一个简单的对象是表示协调世界时 (UTC)、当地时间还是某个其他时区的时间完全取决于程序,就像特定数字是否表示米、英里或质量一样取决于程序。朴素的对象很容易理解和使用,但代价是忽略了现实的某些方面
在现实世界的应用程序中,我们总是使用“感知”的日期时间对象。
例子:
import datetime
import pytz
tz = pytz.timezone('Singapore')
datetime.datetime.now(tz)
datetime.datetime(2018, 2, 16, 14, 15, 6, 822038, tzinfo=<DstTzInfo 'Singapore' +08+8:00:00 STD>)
现在我们有了正确的时间和正确的时区。我们不需要关心 datetime 对象下的操作。
例如,您想显示新加坡-曼谷的航班时间。 SNG 和 BKK 时区之间的时差为 1 小时。所以新加坡的 14:00 是曼谷的 13:00。所有航空公司都遵守相同的规则。出发和到达时间以当地时间显示,时区 GMT 偏移。假设 SNG 和 BKK 之间的实际飞行时间是 1 小时,我们将有 SNG 起飞 14:00 +8 - BKK 到达 14:00 +7。
因此,如果我们忽略出发和到达之间的时区差异
因此将是 0 小时,我们显示的飞行时间将是 0 小时。这当然是一个错误。也不要忘记 DST 规则、闰年等。但如果您使用日期时间“感知”对象,您不必担心任何事情。
总结以上所有,让我们重写我们的代码
import datetime
import pytz
def shop_is_open(tz='Singapore'):
tz = pytz.timezone(tz)
time_now = datetime.datetime.now(tz).time()
#here we could apply any timezone according shop geo location
time_open = datetime.time(9, 45, tzinfo=tz)
time_close = datetime.time(15, 30, tzinfo=tz)
is_open = False
if time_now >= time_open and time_now <= time_close:
is_open = True
return is_open