【问题标题】:Condition TRUE or FALSE output based on TIME of day. Python基于时间的条件 TRUE 或 FALSE 输出。 Python
【发布时间】:2018-07-26 23:11:39
【问题描述】:

考虑一家在上午 9:15 开门并在下午 3:30 关门的商店。根据当前时间,我想打印商店是打开还是关闭。 我在逻辑上有困难。在我的代码中,如果时间是上午 9:45,则输出关闭。

import time
timenow = time.localtime()
print(timenow)
print(timenow.tm_hour)
print(timenow.tm_min)
if ((timenow.tm_hour >= 9) & (timenow.tm_min >= 15)):
    if((timenow.tm_hour <= 15) & (timenow.tm_min <= 30)):
        print('Store open.')
    else:
        print('Store closed.')

如果有更好的方法可以做到这一点,我将非常感谢您的帮助。

【问题讨论】:

  • 你现在有什么问题?不行吗?
  • 当条件失败时,它应该为真,例如当它的上午 9:45 输出为假时,会有很大的差距。
  • @SouravB.Roy 请查看我的代码审查,希望它能帮助您提高技能并避免将来出现错误。

标签: python python-3.x python-2.7 logic


【解决方案1】:

首先您使用时间模块。在这种情况下,这不是最好的解决方案,下面我将解释原因。大部分情况下时间模块调用平台宿主的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

【讨论】:

  • 问候@Denis 真的很棒的答案。没有怀疑的余地。我从没想过要考虑时区。这个答案教会了我如何像真正的程序员一样思考。谢谢
【解决方案2】:

我想出了一个非常简单且不花哨的代码。我可以评论它,但我仍然没有足够的声誉。只需像这样将您的小时转换为分钟

import time

def time_to_min(hour, minute):
    return hour*60+minute

timenow = time.localtime()

open_time = time_to_min(9, 15)
close_time = time_to_min(15, 30)
current_time = time_to_min(timenow.tm_hour, timenow.tm_min)

if current_time >= open_time and current_time <= close_time:
    print 'Store opened'
else:
    print 'Store closed'

【讨论】:

  • 它很简单,但在交换值后不起作用,它总是显示商店关闭
【解决方案3】:

使用日期时间,我觉得这更容易:

import datetime

# define the opening hours
startTime = datetime.time(9, 15, 0)
endTime = datetime.time(15, 30, 0)

# function that compares the given time against opening and closing
def isOpen(startTime, endTime, x):
    if startTime <= endTime:
        return startTime <= x <= endTime
    else:
        return startTime <= x or x <= endTime

# Call isOpen function ( datetime.time is the "current time" )
print isOpen(startTime, endTime, datetime.time(14, 30, 0))
print isOpen(startTime, endTime, datetime.time(20, 30, 0))

如果你想在当前时间运行它,只需像这样调用函数:

currentTime = datetime.datetime.now().time()
print isOpen(startTime, endTime, currentTime)

【讨论】:

    猜你喜欢
    • 2021-10-05
    • 1970-01-01
    • 2016-11-25
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2023-04-04
    相关资源
    最近更新 更多