根据一天中的时间条件输出为真或假。python

根据一天中的时间条件输出为真或假。python,python,python-3.x,python-2.7,logic,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)):

考虑一家上午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.')
导入时间
timenow=time.localtime()
打印(timenow)
打印(timenow.tm_小时)
打印(timenow.tm\u min)
如果((timenow.tm_hour>=9)和(timenow.tm_min>=15)):

如果((timenow.tm_hour我想出了一个非常简单且不花哨的代码。我可以对它进行注释,但我仍然没有足够的声誉。只需像这样将你的小时转换为分钟

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'
导入时间
def时间到分钟(小时,分钟):
返回时间*60分钟以上
timenow=time.localtime()
打开时间=时间到分钟(9,15)
关闭时间=时间到分钟(15,30)
当前时间=时间到分钟(timenow.tm\u小时,timenow.tm\u分钟)

如果当前时间>=打开时间且当前时间使用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))

首先使用时间模块。在这种情况下,这不是下面的最佳解决方案。我将解释原因。在大多数情况下,时间模块调用平台主机的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)
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>)
以GMT显示,但我的实际时间为

root@xxx# date
Fri Feb 16 13:57:55 +08 2018
在这里,我们将遇到时区

时区是全球为法律、商业和社会目的遵守统一标准时间的地区。时区往往遵循国家及其分区的边界,因为它便于密切商业或其他通信的地区保持相同的时间

在Python中,处理时间和日期的最佳方法是操作的datetime模块和时区的pytz

Pytz不是Python库的标准,所以别忘了安装它

pip install pytz
日期和时间对象有两种:“naive”和“aware”

aware对象对适用的算法和政治时间调整(如时区和夏令时信息)有足够的了解,以相对于其他aware对象定位自身。aware对象用于表示不可解释的特定时间点

朴素对象包含的信息不足,无法相对于其他日期/时间对象明确定位自身。朴素对象是否表示协调世界时(UTC),本地时间或其他时区的时间完全取决于程序,就像特定数字是否表示米、英里或质量取决于程序一样。简单的对象很容易理解和处理,但代价是忽略了现实的某些方面

在现实世界的应用程序中,我们总是使用“感知”的日期时间对象

例如:

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)
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>)
导入日期时间
进口皮茨
tz=pytz.时区('新加坡')
datetime.datetime.now(tz)
datetime.datetime(2018,2,16,14,15,682038,tzinfo=)
现在我们有了正确的时间和正确的时区。我们不需要关心datetime对象下的操作

例如,您希望显示新加坡-曼谷的航班时间。SNG和BKK时区之间的时差为1小时。因此,当新加坡14:00时,曼谷的时差为13:00。所有航空公司都遵守相同的规则。出发和到达时间在当地时间以时区GMT偏移表示。让我们假设n SNG和BKK为1小时,我们将在SNG起飞14:00+8-BKK抵达14:00+7。 因此,如果我们忽略出发和到达之间的时区差异
因此将为0小时,我们显示的飞行时间将为0小时。这当然是一个错误。也不要忘记DST规则、闰年等。但如果使用datetime“感知”对象,则无需担心任何问题

综上所述,让我们重写代码

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
导入日期时间
进口皮茨
def商店开业(tz='新加坡'):
tz=pytz.时区(tz)
time\u now=datetime.datetime.now(tz.time)()
#在这里,我们可以根据地理位置应用任何时区
time_open=datetime.time(9,45,tzinfo=tz)
time\u close=datetime.time(15,30,tzinfo=tz)
是否打开=错误

如果time\u now>=time\u open和time\u now您现在拥有的有什么问题吗?它不起作用吗?当条件失败时,当它应该是真的时,会有很大的差距,例如当它是上午9:45时,输出为假。@SouravB.Roy请查看下面的我的代码审阅,希望它能帮助您提高技能,避免将来出现错误。问候@Den这是一个非常好的答案。毫无疑问。我从来没有想过在时区中考虑因素。这个答案教会了我如何像一个真正的程序员一样思考。谢谢。它很简单,但在交换值后不起作用。它总是显示商店关闭