鱼C论坛

 找回密码
 立即注册
查看: 4355|回复: 38

[技术交流] Python:每日一题 142

[复制链接]
发表于 2018-1-15 18:55:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬雪雪冬 于 2018-2-4 20:36 编辑

我们的玩法做了一下改变:

1. 楼主不再提供答案。
2. 请大家先独立思考”,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
给出两个时间算出时间差(以秒计),如果结束时间小于开始时间则结束时间在下一天,开始和结束时间不超过1天。
例如:
start = 17:55:31
stop = 4:21:57
时间差为:37586s

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-15 19:30:06 From FishC Mobile | 显示全部楼层
本帖最后由 shigure_takimi 于 2018-1-15 19:41 编辑
  1. start = '17:55:31'
  2. stop = '4:21:57'

  3. def getSeconds(start, stop):
  4.         start = [int(i) for i in start.split(':')]
  5.         stop = [int(i) for i in stop.split(':')]
  6.         startSeconds = start[0]*3600 + start[1]*60 + start[2]
  7.         stopSeconds = stop[0]*3600 + stop[1]*60 + stop[2]
  8.         if stop[0]<start[0] or (stop[0]==start[0] and stop[1]<start[1]) or (stop[0]==start[0] and stop[1]==start[1] and stop[2]<start[2]):
  9.                 stopSeconds += 24*3600
  10.         return stopSeconds - startSeconds

  11. print('Start time:', start)
  12. print('Stop time:', stop)
  13. print('Time passed:', getSeconds(start, stop), 'seconds.')
  14.        

  15. ##    Start time: 17:55:31
  16. ##    Stop time: 4:21:57
  17. ##    Time passed: 37586 seconds.
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-15 21:07:00 | 显示全部楼层
本帖最后由 wyp02033 于 2018-1-17 22:24 编辑
  1. def main():
  2.     start = "17:55:31"
  3.     stop = "4:21:57"
  4.     start_time = [int(each) for each in start.split(":")]
  5.     stop_time = [int(each) for each in stop.split(":")]
  6.     time_difference = [0 for i in range(3)]
  7.     for i in range(3):
  8.         time_difference[i] = stop_time[i] - start_time[i]
  9.     time_difference.reverse()
  10.     for i in range(2):
  11.         if time_difference[i] < 0:
  12.             time_difference[i] += 60
  13.             time_difference[i+1] -= 1
  14.     if time_difference[-1] < 0:
  15.         time_difference[-1] += 24

  16.     all_seconds = 0
  17.     for i in range(3):
  18.         all_seconds += time_difference[i] * 60 ** i

  19.     print("时差为:%d s" % all_seconds)

  20. if __name__ == '__main__':
  21.     main()
复制代码

结果:37586 s

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-1-15 21:30:50 | 显示全部楼层
def change(time):
    hour,minter,second=time.split(':')
    time_second=3600*int(hour)+60*int(minter)+int(second)
    return time_second
start=input('请输入开始时间:')
stop=input('请输入结束时间:')
t1=change(start)
t2=change(stop)
if t2>t1:
    t=t2 -t1
else:
    t=86400-t1+t2
    print('已经是第二天')
print('时间差为%ds'% t)

请输入开始时间:17:55:31
请输入结束时间:4:21:57
已经是第二天
时间差为37586s

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-15 22:27:28 | 显示全部楼层
  1. from datetime import datetime, timedelta

  2. start = "17:55:31"
  3. stop = "4:21:57"


  4. start_time = datetime.strptime(start, "%H:%M:%S")

  5. stop_time = datetime.strptime(stop, "%H:%M:%S")
  6. delta = start_time - stop_time
  7. if start_time < stop_time:
  8.     print(delta.total_seconds())
  9. else:
  10.     delta = timedelta(seconds=86400) - delta
  11.     print(delta.total_seconds())
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-16 03:17:15 | 显示全部楼层
感觉有点笨。。

  1. start = "17:55:31"
  2. stop = "4:21:57"
  3. start_list = [int(x) for x in start.split(':')]
  4. stop_list = [int(x) for x in stop.split(':')]

  5. if stop_list[0] - start_list[0] < 0:
  6.         h_diff = stop_list[0] - start_list[0] + 24
  7. else:
  8.         h_diff = stop_list[0] - start_list[0]

  9. diff = h_diff*60*60 + (stop_list[1] - start_list[1])*60 + (stop_list[2] - start_list[2])
  10. print(diff)
复制代码


结果:37586

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-16 09:39:22 | 显示全部楼层
  1. import easygui

  2. def gettime(msg):
  3.     while True:
  4.         title = 'time'
  5.         a = easygui.enterbox(msg,title)
  6.         b = a.split(':')
  7.         for i in range(0,3):
  8.             b[i] = int(b[i])
  9.             if b[i] >= 60 :
  10.                 msg = '输入时间有误,请重新输入'
  11.                 easygui.msgbox(msg,title)
  12.         if (b[0] < 60) and (b[1] < 60) and (b[2] < 60):
  13.             return b

  14. start = gettime('请输入开始时间(以冒号间隔)')
  15. stop = gettime('请输入结束时间(以冒号间隔)')

  16. if start > stop:
  17.     stop[0] = stop[0] + 24

  18. start_seconds = start[0] * 60 * 60 + start[1] * 60 + start[2]
  19. stop_seconds = stop[0] * 60 * 60 + stop [1] * 60 + stop[2]
  20. interval_seconds = stop_seconds - start_seconds

  21. msg = '时间间隔为:{a}秒'
  22. msg = msg.format(a = interval_seconds)
  23. title = 'time'
  24. easygui.msgbox(msg,title)

复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-16 09:57:34 | 显示全部楼层
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from datetime import  datetime
  4. start = '17:55:31'
  5. stop = '4:21:57'
  6. print  (datetime.strptime(stop,'%H:%M:%S')-datetime.strptime(start,'%H:%M:%S')).seconds
复制代码

------
res:37586

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-16 10:19:05 | 显示全部楼层
start=input('start')
stop=input('stop')
#读取时,分,秒
def turn(time):
    start1=time.partition(':')
    h1=int(start1[0])
    start1=start1[2].partition(':')
    m1=int(start1[0])
    s1=int(start1[2])
    return h1,m1,s1

start=turn(start)
stop=turn(stop)

time1=start[0]*3600+start[1]*60+start[2]
time2=stop[0]*3600+stop[1]*60+stop[2]

if time2>=time1:
    time=time2-time1
else:
    time=24*3600+(time2-time1)


print('时间差为'+str(time)+'s')

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-16 10:22:57 | 显示全部楼层
  1. start = '17:55:31'
  2. stop = '17:21:57'
  3. start = start.split(":")       #先去掉:,变成str的列表
  4. stop = stop.split(":")
  5. start_ = []     #新建空列表
  6. stop_ = []
  7. for i in start:     #将str转为int,添加到空列表
  8.     i = int(i)
  9.     start_.append(i)
  10. for i in stop:
  11.     i = int(i)
  12.     stop_.append(i)
  13. print(start_,stop_)
  14. all_start = eval('(start_[0])*3600 + start_[1]*60 + start_[2]')
  15. all_stop = eval('(stop_[0])*3600 + stop_[1]*60 + stop_[2]')
  16. if all_stop < all_start:    #如果结束时间小于开始时间,结束时间就在下一天,要加上一天的秒数
  17.     daytime = 24*3600
  18.     print((all_stop+daytime)-all_start)
  19. else:
  20.     print(all_stop - all_start)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-16 11:07:25 | 显示全部楼层

  1. import datetime
  2. start='17:55:31'
  3. end='4:21:57'
  4. st= datetime.datetime.strptime(start,"%H:%M:%S")
  5. et= datetime.datetime.strptime(end,"%H:%M:%S")

  6. print((et-st).seconds,end='')
  7. print('s')
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-16 11:42:53 | 显示全部楼层
print('''给出两个时间算出时间差(以秒计),如果结束时间小于开始时间则结束时间在下一天,开始和结束时间不超过1天''')
start1 = input('请输入开始时间(例如15:24:33):')
while (':' not in start1) or (len(start1) > 8):
        print('请输入格式有误')
        start1 = input('请输入开始时间(例如15:24:33):')
stop1 = input('请输入结束时间(例如3:24:33):')
while (':' not in stop1) or (len(stop1) > 8):
        print('请输入格式有误')
        start1 = input('请输入开始时间(例如15:24:33):')

start1 = start1.split(':')
stop1 = stop1.split(':')

#print(start1)

for i in range(3):
        start1[i]=int(start1[i])
        stop1[i]=int(stop1[i])
#print(start1)
second1 = start1[0] * 3600 + start1[1] * 60 + start1[2]
second2 = stop1[0] * 3600 + stop1[1] * 60 + stop1[2]

#print(second1 , second2)
if second1 >= second2:
        result = second2 - second1 + 24 * 3600
else:
        result = second2 - second1
print('时间差为:{0}s'.format(result))
print('时间差为:%ds'%(result))

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-16 12:02:42 | 显示全部楼层
  1. #!usr/bin/python3
  2. import datetime
  3. #输入时间
  4. Dstart=datetime.datetime.strptime(input("start="),'%H:%M:%S')
  5. Dstop=datetime.datetime.strptime(input("stop="),'%H:%M:%S')
  6. #如果结束时间小于开始时间那么结束时间加一天
  7. if Dstop<Dstart:
  8.         Dstop = Dstop + datetime.timedelta(days=1)
  9. result = (Dstop - Dstart).total_seconds()
  10. print(result)
复制代码

py的时间戳课真麻烦,用过c#就知道c#处理时间真的很爽很丝滑。

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-16 13:28:53 | 显示全部楼层
  1. start = '17:55:31'
  2. stop = '4:21:57'
  3. from datetime import datetime, timedelta
  4. st = datetime.strptime(start,'%H:%M:%S')
  5. sp = datetime.strptime(stop,'%H:%M:%S')
  6. td = (sp-st).seconds if (sp-st).seconds>0 else (sp-st+timedelta(days=1)).seconds
  7. print(td)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-16 13:40:40 From FishC Mobile | 显示全部楼层
a
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-16 14:06:09 | 显示全部楼层
import time

class CalTimer:
   
    def __init__(self):
        self.begin = ''

    '''
    函数名:start
    参数:begin:开始时间
    返回值:None
    功能:开始计时
    '''
    def start(self):
        self.begin = time.localtime()[3:6] #获取时分秒
        print('开始计时')
        

    '''
    函数名:stop
    参数:end:结束时间
    返回值:None
    功能:结束计时
    '''
    def stop(self):
        if not self.begin:
            print('please start first!')

        end = time.localtime()[3:6] #获取时分秒
        
        timeLi = []
        timeTag = ['时', '分', '秒']
        for index, item in enumerate(timeTag):
            tmp = end[index] - self.begin[index]
            timeLi.append(tmp)

        res = str(timeLi[0]*3600 + timeLi[1]*60 + timeLi[2])
        print('结束计时,总耗时:' + res + '秒')

        
if __name__ == '__main__':
    a = CalTimer()
    a.start()
    time.sleep(30)
    a.stop()
        

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-16 14:49:56 From FishC Mobile | 显示全部楼层
start = '17:55:31'
end = '4:21:57'

start = map(lambda x:int(x),start.split(':'))
end = map(lambda x:int(x),end.split(':'))

for k in range(-1,-4,-1):
    if end[k] < start[k]:
        if k != -3:
            end[k] += 60
            end[k-1] -= 1
        else:
            end[k] += 24

def second(x,y):
    return 60*x + y

divide = reduce(second, map(lambda x, y: x - y, end, start))

print divide

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-16 18:28:42 | 显示全部楼层
不超过1天这个限制条件太方便了,手动
  1. def fun(t1, t2):
  2.     times = [sum(60**(2-i)*int(j) for i,j in enumerate(time.split(":")))
  3.              for time in (t1, t2)]
  4.     return "{}s".format((times[1] - times[0]) % 86400)
  5. print(fun("17:55:31", "4:21:57"))
复制代码

datetime也很快
  1. import datetime

  2. def fun2(t1, t2):
  3.     t1 = datetime.datetime.strptime(t1, "%H:%M:%S")
  4.     t2 = datetime.datetime.strptime(t2, "%H:%M:%S")
  5.     return (t2 - t1).total_seconds() % 86400
  6. print(fun2("17:55:31", "4:21:57"))
复制代码

久没用过,小小的写个类
  1. class timedelta:

  2.     def __init__(self, hours=0, minutes=0, seconds=0):
  3.         self.hours = hours
  4.         self.minutes = minutes
  5.         self.seconds = seconds
  6.         self.time = self.hours * 3600 + self.minutes * 60 + self.seconds
  7.         
  8.     def __sub__(self, other):
  9.         return (self.time - other.time) % 86400

  10. start = timedelta(17, 55, 31)
  11. stop = timedelta(4, 21, 57)
  12. print(stop - start)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-17 10:36:00 | 显示全部楼层
from datetime import datetime,timedelta

start = '17:55:31'
stop ='4:21:57'

d1=datetime.strptime(start,"%H:%M:%S")
d2=datetime.strptime(stop,'%H:%M:%S')

if d2>d1:
    print((d2-d1).seconds)
else:
    print((d2+timedelta(days=1)-d1).seconds)

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-17 12:43:36 | 显示全部楼层
  1. '''
  2. :号分割, 自行计算
  3. '''

  4. # 偏差
  5. D = 3600 * 24

  6. def time2seconds(time):
  7.     time = [int(x) for x in time.split(":")]
  8.     return time[0]*3600 + time[1]*60 + time[2]

  9. def fun(start, stop):
  10.     start = time2seconds(start)
  11.     stop = time2seconds(stop)
  12.     res = stop - start
  13.     res += 0 if res >= 0 else D
  14.     return res

  15. def main():
  16.     start = '17:55:31'
  17.     stop = '4:21:57'
  18.     print('start =',start)
  19.     print('stop =',stop)
  20.     print("时间差为:", fun(start,stop),'s')

  21. if __name__ == "__main__":
  22.     main()
复制代码

结果:
  1. start = 17:55:31
  2. stop = 4:21:57
  3. 时间差为: 37586 s
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 01:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表