条件基于时间的TRUE或FALSE输出。蟒蛇

时间:2018-02-16 04:24:05

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

考虑一家商店,营业时间为上午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.')

如果有更好的方法,我真的很感谢你的帮助。

3 个答案:

答案 0 :(得分: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'

答案 1 :(得分:1)

使用datetime,我觉得更容易:

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)

答案 2 :(得分: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
  

有两种日期和时间对象:“天真”和“意识”。

     

感知对象充分了解适用的算法和政治时间调整,例如时区和夏令时信息,以便相对于其他感知对象定位自身。知觉对象用于表示不能解释的特定时刻。

     

天真对象不包含足够的信息,无法明确地相对于其他日期/时间对象定位自己。天真物体是代表协调世界时(UTC),当地时间还是某个其他时区的时间完全取决于程序,就像程序一样,特定数字代表米,英里或质量。天真的物体易于理解和使用,代价是忽视现实的某些方面

在现实世界的应用程序中,我们始终使用&#34;意识到&#34;日期时间对象。

示例:

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>)

现在我们有适当时区的正确时间。我们不需要关心日期时间对象下的操作。

  

例如,您想显示新加坡 - 曼谷的航班时间。 SNG和BKK时区之间的时差为1小时。所以当新加坡的14:00在曼谷的13:00。所有航空公司都遵守同样的规则。出发和到达时间以当地时间GMT偏移量表示。让我们假设SNG和BKK之间的实际飞行时间是1小时,我们将有SNG离开14:00 +8 - BKK到达14:00 +7。   因此,如果我们忽略出发和到达之间的时区差异   将是0小时,我们显示的飞行时间将是0小时。那当然是个错误。也不要忘记DST规则,闰年等等。但是如果你使用datetime&#34;意识到&#34;你不必担心任何事情。

总结以上所有内容,让我们重写代码

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