繁体   English   中英

两次之间的时差(python)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM