답변:
당신은 datetime.timedelta
기능 을 사용할 수 있습니다 :
>>> import datetime
>>> str(datetime.timedelta(seconds=666))
'0:11:06'
str(datetime.timedelta(seconds=60*60*24+1))
='1 day, 0:00:01'
str(datetime.timedelta(seconds=round(666666.55)))
일을 올바르게 렌더링합니다. 십진수 초를 억제합니다.
timedelta
오버플로 안전하지 않고 수학 연산을 올바르게 수행 할 수 없습니다. 예를 들어 str(timedelta(hours=8) - timedelta(hours=10))
결과 '-1 day, 22:00:00'
및 정수 기반 솔루션은 정확히 필요한 상황에 적합합니다 '-02:00:00'
.
divmod()
몫과 나머지를 모두 생성하기 위해 단일 나누기 만하 는 함수 를 사용하면 두 가지 수학 연산만으로도 결과를 매우 빠르게 얻을 수 있습니다.
m, s = divmod(seconds, 60)
h, m = divmod(m, 60)
그런 다음 문자열 형식 을 사용 하여 결과를 원하는 출력으로 변환하십시오.
print('{:d}:{:02d}:{:02d}'.format(h, m, s)) # Python 3
print(f'{h:d}:{m:02d}:{s:02d}') # Python 3.6+
'%d:%02dmn' % (seconds / 60, seconds % 60)
d, h = divmod(h, 24)
.
m, d = divmod(m, 31)
. 안돼, 안돼 더구나, 윤초가 게임에 들어 오면 코드가 잘못 될 것입니다. 간단히 말해서 : timedelta
달력을 사용 하고 엉망으로 만들지 마십시오.
timedelta
윤초를 처리합니까? 나는 의심하지 않는다. 이 간단한 수학만으로도 충분한 응용 프로그램이 있습니다.
str(timedelta(hours=8) - timedelta(hours=10))
결과는 '-1 day, 22:00:00'이므로 윤초와 함께 작동하지만 음수로는 작동하지 않으면 idk입니다.
쉬운 방법으로 이름을 지정할 수는 없지만 (적어도 구문을 기억할 수는 없지만) time.strftime 을 사용 하면 서식을보다 효율적으로 제어 할 수 있습니다.
from time import strftime
from time import gmtime
strftime("%H:%M:%S", gmtime(666))
'00:11:06'
strftime("%H:%M:%S", gmtime(60*60*24))
'00:00:00'
gmtime 은 초를 필요한 특수 튜플 형식으로 변환하는 데 사용됩니다 strftime()
.
참고 : 23:59:59 이후에 잘립니다.
time.strftime('%d %H:%M:%S', time.gmtime(1))
=> '1 day, 0:00:01'입니다.
datetime
:':0>8'
형식 :from datetime import timedelta
"{:0>8}".format(str(timedelta(seconds=66)))
# Result: '00:01:06'
"{:0>8}".format(str(timedelta(seconds=666777)))
# Result: '7 days, 17:12:57'
"{:0>8}".format(str(timedelta(seconds=60*60*49+109)))
# Result: '2 days, 1:01:49'
':0>8'
형식이 없으면 :"{}".format(str(timedelta(seconds=66)))
# Result: '00:01:06'
"{}".format(str(timedelta(seconds=666777)))
# Result: '7 days, 17:12:57'
"{}".format(str(timedelta(seconds=60*60*49+109)))
# Result: '2 days, 1:01:49'
time
:from time import gmtime
from time import strftime
# NOTE: The following resets if it goes over 23:59:59!
strftime("%H:%M:%S", gmtime(125))
# Result: '00:02:05'
strftime("%H:%M:%S", gmtime(60*60*24-1))
# Result: '23:59:59'
strftime("%H:%M:%S", gmtime(60*60*24))
# Result: '00:00:00'
strftime("%H:%M:%S", gmtime(666777))
# Result: '17:12:57'
# Wrong
"{:0>8}".format(timedelta(milliseconds=66)) '0:00:00.066000'
without ':0>8':
예제 {:0>8}
에는 왼쪽에있는 0 개의 선행 0 패드 가 없습니다 .
time.time()-start
변수를 포맷하고 있습니다. 통찰력이 있습니까? TypeError: non-empty format string passed to object.__format__
datetime.now()
대신 사용하려고했는데 time.time()
동일한 오류가 발생합니다.
이것은 나의 빠른 속임수입니다.
from humanfriendly import format_timespan
secondsPassed = 1302
format_timespan(secondsPassed)
# '21 minutes and 42 seconds'
자세한 내용을 보려면 다음 사이트를 방문하십시오 : https://humanfriendly.readthedocs.io/en/latest/#humanfriendly.format_timespan
datetime.time
가치 를 얻으려면 다음과 같은 트릭을 사용할 수 있습니다.
my_time = (datetime(1970,1,1) + timedelta(seconds=my_seconds)).time()
에 추가 timedelta
할 수는 없지만에 추가 할 time
수 있습니다 datetime
.
UPD : 동일한 기술의 또 다른 변형 :
my_time = (datetime.fromordinal(1) + timedelta(seconds=my_seconds)).time()
대신 1
0보다 큰 숫자를 사용할 수 있습니다. 여기서는 datetime.fromordinal
항상 구성 요소가 0 인 datetime
객체를 반환 한다는 사실을 사용합니다 time
.
이것이 내가 얻은 방법입니다.
def sec2time(sec, n_msec=3):
''' Convert seconds to 'D days, HH:MM:SS.FFF' '''
if hasattr(sec,'__len__'):
return [sec2time(s) for s in sec]
m, s = divmod(sec, 60)
h, m = divmod(m, 60)
d, h = divmod(h, 24)
if n_msec > 0:
pattern = '%%02d:%%02d:%%0%d.%df' % (n_msec+3, n_msec)
else:
pattern = r'%02d:%02d:%02d'
if d == 0:
return pattern % (h, m, s)
return ('%d days, ' + pattern) % (d, h, m, s)
몇 가지 예 :
$ sec2time(10, 3)
Out: '00:00:10.000'
$ sec2time(1234567.8910, 0)
Out: '14 days, 06:56:07'
$ sec2time(1234567.8910, 4)
Out: '14 days, 06:56:07.8910'
$ sec2time([12, 345678.9], 3)
Out: ['00:00:12.000', '4 days, 00:01:18.900']
str(datetime.timedelta(seconds=666))
666.0
및 666.1
값에 대해 일관된 문자열 길이를 제공 합니다.
다음 세트가 나를 위해 일했습니다.
def sec_to_hours(seconds):
a=str(seconds//3600)
b=str((seconds%3600)//60)
c=str((seconds%3600)%60)
d=["{} hours {} mins {} seconds".format(a, b, c)]
return d
print(sec_to_hours(10000))
# ['2 hours 46 mins 40 seconds']
print(sec_to_hours(60*60*24+105))
# ['24 hours 1 mins 45 seconds']
dateutil.relativedelta
수레, 시간, 분 및 초에 액세스 해야하는 경우 편리합니다. datetime.timedelta
유사한 인터페이스를 제공하지 않습니다.
from dateutil.relativedelta import relativedelta
rt = relativedelta(seconds=5440)
print(rt.seconds)
print('{:02d}:{:02d}:{:02d}'.format(
int(rt.hours), int(rt.minutes), int(rt.seconds)))
인쇄물
40.0
01:30:40
seconds=5440
대신 사용하려고했을 것 입니다 seconds=5540
. 그래도 나는 당신의 대답을 좋아합니다!
3600 (60 분 / 시간 * 60 초 / 분)으로 초 단위로 나눈 값으로 계산 된 시간 (h)
남은 초 (시간 계산의 나머지, %)를 60 (60 초 / 분)으로 나눈 층으로 나눈 분 (m)
마찬가지로 나머지 시간 및 분 계산에 의한 초 (s).
나머지는 단지 문자열 형식입니다!
def hms(seconds):
h = seconds // 3600
m = seconds % 3600 // 60
s = seconds % 3600 % 60
return '{:02d}:{:02d}:{:02d}'.format(h, m, s)
print(hms(7500)) # Should print 02h05m00s
division = 3623 // 3600 #to hours
division2 = 600 // 60 #to minutes
print (division) #write hours
print (division2) #write minutes
추신 : 내 코드는 전문가가 아닙니다