[英]Difference Between Two Times (python)
只想知道我是否可以将变量设置为午夜前的签到时间。
我想签出是raw_input和午夜是固定值
到目前为止,我有这个:
#!/usr/bin/python
from datetime import datetime
from Tkinter import *
import math
#Variablesr
FMT = '%H%M' #Time Format
rate1 = 35.34 #Base Hourly Rate
rate2 = 35.34 #Base Hourly Rate
rate3 = 35.34 #Base Hourly Rate
rate4 = 35.34 #Base Hourly Rate
rate5 = 35.34 #Base Hourly Rate
rate6 = 50 #Base Hourly Rate
rate7 = 70 #Base Hourly Rate
Midnight = 0000,FMT
amp = 2.40 #Morning shift penalties
pmp = 2.50 #Afternoon shift penalties
ns = 4.4 #Night shift penalties
cabAll = 8.34 #Cab Allowance
signOnSun1 = raw_input("What time did you sign on Sunday: ");
signOffSun1 = raw_input("What time did you sign off Sunday: ");
diff = (datetime.strptime(signOffSun1, FMT) - datetime.strptime (Midnight, FMT))
print diff
您看不到使用signOnSun1
因此不确定要使用的是什么,但这应该更接近您想要的:
from datetime import datetime
#Variablesr
FMT = '%H:%M' #Time Format use HH:MM
rate1 = 35.34 #Base Hourly Rate
rate2 = 35.34 #Base Hourly Rate
rate3 = 35.34 #Base Hourly Rate
rate4 = 35.34 #Base Hourly Rate
rate5 = 35.34 #Base Hourly Rate
rate6 = 50 #Base Hourly Rate
rate7 = 70 #Base Hourly Rate
Midnight = "00:00" # make midnight a string
amp = 2.40 #Morning shift penalties
pmp = 2.50 #Afternoon shift penalties
ns = 4.4 #Night shift penalties
cabAll = 8.34 #Cab Allowance
# make sure user know format to use
signOnSun1 = raw_input("What time did you sign on Sunday, enter in format HH:MM: ")
signOffSun1 = raw_input("What time did you sign off Sunday, enter in format HH:MM: ")
# use Midnight string and FMT
diff = (datetime.strptime(signOffSun1, FMT) - datetime.strptime(Midnight,FMT))
print diff
确实,您应该确保用户使用try / except块输入了正确的数据,如果您在午夜前后比较时间,就会被抓到
如果所有时间都在午夜之前,您可以将午夜设置的日期硬编码为后一天:
FMT = '%H:%M-%Y-%m-%d' #Time Format
rate1 = 35.34 #Base Hourly Rate
rate2 = 35.34 #Base Hourly Rate
rate3 = 35.34 #Base Hourly Rate
rate4 = 35.34 #Base Hourly Rate
rate5 = 35.34 #Base Hourly Rate
rate6 = 50 #Base Hourly Rate
rate7 = 70 #Base Hourly Rate
Midnight = "00:00-1900-01-02"
amp = 2.40 #Morning shift penalties
pmp = 2.50 #Afternoon shift penalties
ns = 4.4 #Night shift penalties
cabAll = 8.34 #Cab Allowance
signOnSun1 = raw_input("What time did you sign on Sunday, enter in format HH:MM: ")
signOffSun1 = raw_input("What time did you sign off Sunday, enter in format HH:MM: ")
diff = datetime.strptime(Midnight, FMT) - datetime.strptime("{}-1900-01-01".format(signOnSun1), FMT)
print diff
如果您要处理的是上班时间,则应考虑DST转换(以及其他原因造成的UTC偏移量的变化),否则结果可能是错误的(通常是一个小时)。
正确找到午夜并非难事。 请参阅如何获取给定时区的UTC时间“午夜”?
为了获得正确的结果,除了时间以外,还应该指定一个日期,例如,假设最后一个星期日。 并且您需要知道本地时区,并且(为了可移植性)您需要一个历史时区数据库,例如pytz
模块提供的数据库。 tzlocal
模块可以找到您的本地时区:
from datetime import datetime, timedelta
from tzlocal import get_localzone # $ pip install tzlocal
from pytz import AmbiguousTimeError
DAY = timedelta(1)
local_timezone = get_localzone() # get pytz timezone
time_format = "%H:%M"
def asktime(prompt, format):
while True:
try:
return datetime.strptime(raw_input(prompt), format)
except ValueError:
print('Invalid time format, expected %s. Try again.' % format)
def disambiguate(time, date):
d = datetime.combine(date, time).replace(tzinfo=None)
try:
return local_timezone.localize(d, is_dst=None)
except AmbiguousTimeError:
is_dst = yes_or_no('Was it summer time (%s)?' % d)
return local_timezone.localize(d, is_dst=is_dst)
# allow NonExistentTimeError to propagate
# find last Sunday
sunday = datetime.now(local_timezone)
while sunday.weekday() != 6: # Sunday is 6
sunday -= DAY
# get 'sign on', 'sign off' times
#NOTE: assume, no 24h+ shifts
signon = asktime("What time did you sign on Sunday: ", time_format)
signoff = asktime("What time did you sign off Sunday: ", time_format)
if signoff < signon: # signon is a day before (Saturday)
signon = disambiguate(signon, sunday.date() - DAY)
signoff = disambiguate(signoff, sunday)
print("Signon time %s" % signon)
print("Signoff time %s" % signoff)
diff = signoff - signon
print("The difference %s" % diff)
如果“登录”,“退出”时间是在DST转换期间(“回退”),则同一本地时间可能会出现两次。 然后(除了日期),您需要知道在(“登录”,“退出”)期间是否是夏令时,以使时间无歧义。
其中yes_or_no()
是一个小的实用程序函数:
def yes_or_no(prompt):
while True:
answer = raw_input(prompt)
if answer.lower() in {'yes', 'no'}:
return answer == 'yes'
print("Please, answer 'yes' or 'no'. Try again.")
如果您不需要处理当地时区,并且可以要求UTC时间,则一切都变得简单得多:
signon = asktime("What UTC time did you sign on Sunday: ", time_format)
signoff = asktime("What UTC time did you sign off Sunday: ", time_format)
# support 24h+ shifts
while signoff < signon: # signon is on a previous date
signon -= DAY
diff = signoff - signon
print(diff)
这就是为什么建议尽可能使用UTC时间而不是当地时间的原因(如果您可以要求人们提供UTC时间)。
如果您无法安装tzlocal
模块且无法使用UTC时间,则可以使用time.mktime()
来消除本地时间的歧义(它可能不如上述使用tz数据库的方法可靠),请参阅我的回答“查找日期时间之间是否经过了24小时-Python” 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.