【问题标题】:calculate difference between two time in hour计算两个小时之间的差异
【发布时间】:2016-01-18 07:22:15
【问题描述】:

我想在sql db 中使用django 计算两个小时之间的时间差,时间存储在时间字段中。

我试过这个:

def DesigInfo(request):  # attendance summary
  emplist = models.staff.objects.values('empId', 'name')
  fDate = request.POST.get('fromDate')
  tDate = request.POST.get('toDate')

  if request.GET.get('empId_id'):
    sel = attendance.objects.filter(empId_id=request.GET.get('empId_id'),)
    for i in sel:
        # print i.
        # print   i.outTime
        # print i.inTime.hour,i.inTime.minute,i.inTime.second - i.outTime.hour,i.outTime.minute,i.outTime.second
        ss = i.inTime.hour
        ss1 = 12 - ss
        mm = i.outTime.hour
        mm1 = (12 + mm) - 12
        print ss1 + mm1

【问题讨论】:

  • 您可以使用任何timedatetime 模块,而不是重新发明轮子。

标签: python sql django


【解决方案1】:

由于i.inTimei.outTimetime 对象,您不能简单地将它们相减。一个好的方法是将它们转换为datetime 添加日期部分(使用 today() 但它与差异无关),然后减去获得timedelta 对象。

delta = datetime.combine(date.today(), i.outTime) - datetime.combine(date.today(), i.inTime)

(看这里:subtract two times in python

那么如果你想以小时为单位表达delta

delta_hours = delta.days * 24 + delta.seconds / 3600.0

一个 timedelta 对象有 3 个属性,代表 3 种不同的时差分辨率(天、秒和微秒)。在最后一个表达式中,我避免添加微秒,但我认为这与您的情况无关。如果也是加delta.microseconds / 3600000000.0 请注意,简单地将秒除以 3600 将仅返回小时的整数部分,避免使用小数。这取决于您的业务规则如何将其四舍五入(圆形、地板、天花板或像我一样保留小数部分)

【讨论】:

  • 假设 time1=10:54:25 和 time2=05:22:23 我们计算 ans=timet2-time1 就像 ss = i.inTime.hour ss1 = 12 - ss mm = i.outTime .hour mm1 = (12 + mm) - 12 print ss1 + mm1 但计算分钟或秒有问题​​
  • 如前所述。不要试图重新发明轮子:基本类型已经有了获取时差的方法。由于我了解您的变量不是日期时间对象而是时间对象,因此我会调整答案。
  • 如果 outTime
【解决方案2】:

你可能想玩这些代码:

from datetime import datetime

#set the date and time format
date_format = "%m-%d-%Y %H:%M:%S"

#convert string to actual date and time
time1  = datetime.strptime('8-01-2008 00:00:00', date_format)
time2  = datetime.strptime('8-02-2008 01:30:00', date_format)

#find the difference between two dates
diff = time2 - time1


''' days and overall hours between two dates '''
print ('Days & Overall hours from the above two dates')
#print days
days = diff.days
print (str(days) + ' day(s)')

#print overall hours
days_to_hours = days * 24
diff_btw_two_times = (diff.seconds) / 3600
overall_hours = days_to_hours + diff_btw_two_times
print (str(overall_hours) + ' hours');



''' now print only the time difference '''
''' between two times (date is ignored) '''

print ('\nTime difference between two times (date is not considered)')

#like days there is no hours in python
#but it has seconds, finding hours from seconds is easy
#just divide it by 3600

hours = (diff.seconds) / 3600  
print (str(hours) + ' Hours')


#same for minutes just divide the seconds by 60

minutes = (diff.seconds) / 60
print (str(minutes) + ' Minutes')

#to print seconds, you know already ;)

print (str(diff.seconds) + ' secs')

【讨论】:

    【解决方案3】:

    使用日期时间对象:https://docs.python.org/2/library/datetime.html

    关于主题How to get current time in Python的一个很好的堆栈溢出帖子

    from datetime import datetime
    now = datetime.now()
    # wait some time
    then = ... some time
    # diff is a datetime.timedelta instance
    diff = then - now
    diff_hours = diff.seconds / 3600
    

    【讨论】:

    • 老兄,但实际上我只使用 Timefield() 将时间存储到数据库中
    • 没关系。您可以使用 datetime.datetime.strptime 从字符串转换为时间对象
    【解决方案4】:

    我实现的最简单的方法是上面给出的 Zac 的评论。我正在使用这样的relativedelta

    from dateutil import relativedelta
    difference = relativedelta.relativedelta( date1, date2)
    no_of_hours = difference.hours
    

    但是当日子改变时,它没有给我正确的结果。所以,我使用了上面表达的方法:

    no_of_hours = (difference.days * 24) + (difference.seconds / 3600)
    

    请注意,如果 date2 大于 date1,您将得到负值。所以,你需要在 relativedelta 中滑动日期变量的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      相关资源
      最近更新 更多