import java.util.Scanner; public class StringToNum {public static void main (String args []) {Сканер sc = новый сканер (System.in); System.out.println («Введите no:»); int no = sc.nextInt (); int arrNum [] = new int [10]; int i = 0; while (no! = 0) {arrNum [i] = no% 10; нет нет = нет / 10; я ++; } int len = i; int arrNum1 [] = new int [len]; int j = 0; для (int k = len-1; k & gt; = 0; k--) {arrNum1 [j] = arrNum [k]; j ++; } StringToNum stn = new StringToNum (); Строковый вывод = ""; switch (len) {case 1: {output + = stn.strNum1 (arrNum1 [len-1]); System.out.println ( "выход =" + выход); ломать; } случай 2: {int no1 = arrNum1 [len-2] * 10 + arrNum1 [len-1]; if (no1 & gt; = 11 & amp; no1 & lt; = 19) {output = stn.strNum2 (no1); // output = output + "" + stn.strNum1 (arrNum1 [len-1]); System.out.println ( "выход =" + выход); } else {arrNum1 [len-2] = arrNum1 [len-2] * 10; выход + = stn.strNum2 (arrNum1 [LEN-2]); output = output + "" + stn.strNum1 (arrNum1 [len-1]); System.out.println ( "выход =" + выход); } ломать; } случай 3: {output = stn.strNum1 (arrNum1 [len-3]) + "сто"; int no1 = arrNum1 [len-2] * 10 + arrNum1 [len-1]; if (no1 & gt; = 11 & amp; no1 & lt; = 19) {output = stn.strNum2 (no1); } else {arrNum1 [len-2] = arrNum1 [len-2] * 10; выход + = stn.strNum2 (arrNum1 [LEN-2]); output = output + "" + stn.strNum1 (arrNum1 [len-1]); } System.out.println ("output =" + output); ломать; } case 4: {output = stn.strNum1 (arrNum1 [len-4]) + "тыс."; if (! stn.strNum1 (arrNum1 [len - 3]). равен ("")) {output + = stn.strNum1 (arrNum1 [len-3]) + "сто"; } int no1 = arrNum1 [len-2] * 10 + arrNum1 [len-1]; if (no1 & gt; = 11 & amp; no1 & lt; = 19) {output = stn.strNum2 (no1); } else {arrNum1 [len-2] = arrNum1 [len-2] * 10; выход + = stn.strNum2 (arrNum1 [LEN-2]); output = output + "" + stn.strNum1 (arrNum1 [len-1]); } System.out.println ("output =" + output); ломать; } случай 5: {int no1 = arrNum1 [len-5] * 10 + arrNum1 [len-4]; if (no1 & gt; = 11 & amp; no1 & lt; = 19) {output = stn.strNum2 (no1) + "тыс."; } else {arrNum1 [len-5] = arrNum1 [len-5] * 10; выход + = stn.strNum2 (arrNum1 [LEN-5]); output = output + "" + stn.strNum1 (arrNum1 [len-4]) + "тыс."; } if (! stn.strNum1 (arrNum1 [len - 3]). равен ("")) {output + = stn.strNum1 (arrNum1 [len-3]) + "сто"; } no1 = arrNum1 [len - 2] * 10 + arrNum1 [len - 1]; if (no1 & gt; = 11 & amp; no1 & lt; = 19) {output = stn.strNum2 (no1); } else {arrNum1 [len-2] = arrNum1 [len-2] * 10; выход + = stn.strNum2 (arrNum1 [LEN-2]); output = output + "" + stn.strNum1 (arrNum1 [len-1]); } System.out.println ("output =" + output); ломать; } case 6: {output + = stn.strNum1 (arrNum1 [len-6]) + "million"; int no1 = arrNum1 [len-5] * 10 + arrNum1 [len-4]; if (no1 & gt; = 11 & amp; no1 & lt; = 19) {output + = stn.strNum2 (no1) + "тыс."; } else {arrNum1 [len-5] = arrNum1 [len-5] * 10; выход + = stn.strNum2 (arrNum1 [LEN-5]); output = output + "" + stn.strNum1 (arrNum1 [len-4]) + "тыс."; } if (! stn.strNum1 (arrNum1 [len - 3]). равен ("")) {output + = stn.strNum1 (arrNum1 [len-3]) + "сто"; } no1 = arrNum1 [len - 2] * 10 + arrNum1 [len - 1]; if (no1 & gt; = 11 & amp; no1 & lt; = 19) {output = stn.strNum2 (no1); } else {arrNum1 [len-2] = arrNum1 [len-2] * 10; выход + = stn.strNum2 (arrNum1 [LEN-2]); output = output + "" + stn.strNum1 (arrNum1 [len-1]); } System.out.println ("output =" + output); ломать; } case 7: {int no1 = arrNum1 [len-7] * 10 + arrNum1 [len-6]; if (no1 & gt; = 11 & amp; no1 & lt; = 19) {output = stn.strNum2 (no1) + "Milloin"; } else {arrNum1 [len-7] = arrNum1 [len-7] * 10; выход + = stn.strNum2 (arrNum1 [LEN-7]); output = output + "" + stn.strNum1 (arrNum1 [len-6]) + "Million"; } no1 = arrNum1 [len-5] * 10 + arrNum1 [len-4]; if (no1 & gt; = 11 & amp; no1 & lt; = 19) {output = stn.strNum2 (no1) + "Thousand"; } else {arrNum1 [len-5] = arrNum1 [len-5] * 10; выход + = stn.strNum2 (arrNum1 [LEN-5]); output = output + "" + stn.strNum1 (arrNum1 [len-4]) + "Thousand"; } if (! stn.strNum1 (arrNum1 [len - 3])) равно ("")) {output + = stn.strNum1 (arrNum1 [len-3]) + «Сто»; } no1 = arrNum1 [len - 2] * 10 + arrNum1 [len - 1]; if (no1 & gt; = 11 & amp; no1 & lt; = 19) {output = stn.strNum2 (no1); } else {arrNum1 [len-2] = arrNum1 [len-2] * 10; выход + = stn.strNum2 (arrNum1 [LEN-2]); output = output + "" + stn.strNum1 (arrNum1 [len-1]); } System.out.println ("output =" + output); ломать; }}} Строка strNum1 (int a) {String op = ""; switch (a) {case 1: {op = "one"; ломать; } случай 2: {op = "two"; ломать; } случай 3: {op = "three"; ломать; } случай 4: {op = "four"; ломать; } случай 5: {op = "five"; ломать; } случай 6: {op = "six"; ломать; } case 7: {op = "seven"; ломать; } case 8: {op = "eight"; ломать; } случай 9: {op = "девять"; ломать; }} return op; } Строка strNum2 (int a) {String op = ""; switch (a) {case 10: {op = "ten"; ломать; } случай 20: {op = "двадцать"; ломать; } случай 30: {op = "тридцать"; ломать; } case 40: {op = "fourty"; ломать; } случай 50: {op = "пятьдесят"; ломать; } case 60: {op = "sixty"; ломать; } случай 70: {op = "семьдесят"; ломать; } случай 80: {op = "восемьдесят"; ломать; } случай 90: {op = "ninty"; ломать; } случай 11: {op = "одиннадцать"; ломать; } случай 12: {op = "двенадцать"; ломать; } случай 13: {op = "тринадцать"; ломать; } случай 14: {op = "четырнадцать"; ломать; } случай 15: {op = "пятнадцать"; ломать; } случай 16: {op = "шестнадцать"; ломать; } случай 17: {op = "семнадцать"; ломать; } случай 18: {op = "восемнадцать"; ломать; } случай 19: {op = "девятнадцать"; ломать; }} return op; }}
Спасибо всем за вашу помощь. Я взял много ваших идей и собрал их вместе, дайте мне знать, что вы думаете.
Я добавил два метода в класс следующим образом:
def hours(self):
retval = ""
if self.totalTime:
hoursfloat = self.totalTime.seconds / 3600
retval = round(hoursfloat)
return retval
def minutes(self):
retval = ""
if self.totalTime:
minutesfloat = self.totalTime.seconds / 60
hoursAsMinutes = self.hours() * 60
retval = round(minutesfloat - hoursAsMinutes)
return retval
В моем джанго я использовал это (сумма - это объект, и он находится в словаре):
<td>{{ sum.0 }}</td>
<td>{{ sum.1.hours|stringformat:"d" }}:{{ sum.1.minutes|stringformat:"#02.0d" }}</td>
Мои объекты datetime.timedelta
прошли больше дня. Итак, вот еще одна проблема. Все вышеприведенное обсуждение предполагает менее одного дня. A timedelta
на самом деле является кортежем дней, секунд и микросекунд. Вышеприведенное обсуждение должно использовать td.seconds
как joe, но если у вас есть дни, он не включен в значение секунд.
Я получаю промежуток времени между 2 датами и печатьми дней и часов.
span = currentdt - previousdt
print '%d,%d\n' % (span.days,span.seconds/3600)
Я лично использую библиотеку humanize
для этого:
>>> import datetime
>>> humanize.naturalday(datetime.datetime.now())
'today'
>>> humanize.naturalday(datetime.datetime.now() - datetime.timedelta(days=1))
'yesterday'
>>> humanize.naturalday(datetime.date(2007, 6, 5))
'Jun 05'
>>> humanize.naturaldate(datetime.date(2007, 6, 5))
'Jun 05 2007'
>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=1))
'a second ago'
>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=3600))
'an hour ago'
Конечно, это не дает вам точно ответ (f3), но я обнаружил, что после того, как вы выходите за пределы нескольких часов, дисплей становится быстро нечитаемым. humanize
поддерживает гораздо большие значения, которые читаются человеком, и также хорошо локализованы.
Это вдохновлено модулем Django contrib.humanize
, по-видимому, так как вы используете Django, вам, вероятно, следует это использовать.
naturaltime
- это то, что вы хотите использовать.
– anarcat
14 December 2016 в 20:58
from django.utils.translation import ngettext
def localize_timedelta(delta):
ret = []
num_years = int(delta.days / 365)
if num_years > 0:
delta -= timedelta(days=num_years * 365)
ret.append(ngettext('%d year', '%d years', num_years) % num_years)
if delta.days > 0:
ret.append(ngettext('%d day', '%d days', delta.days) % delta.days)
num_hours = int(delta.seconds / 3600)
if num_hours > 0:
delta -= timedelta(hours=num_hours)
ret.append(ngettext('%d hour', '%d hours', num_hours) % num_hours)
num_minutes = int(delta.seconds / 60)
if num_minutes > 0:
ret.append(ngettext('%d minute', '%d minutes', num_minutes) % num_minutes)
return ' '.join(ret)
Это даст:
>>> from datetime import timedelta
>>> localize_timedelta(timedelta(days=3660, minutes=500))
'10 years 10 days 8 hours 20 minutes'
t1 = datetime.datetime.strptime(StartTime, "%H:%M:%S %d-%m-%y")
t2 = datetime.datetime.strptime(EndTime, "%H:%M:%S %d-%m-%y")
return str(t2-t1)
Итак, для:
StartTime = '15:28:53 21-07-13'
EndTime = '15:32:40 21-07-13'
возвращается:
'0:03:47'
Вот универсальная функция для преобразования либо объекта timedelta
, либо обычного номера (в виде секунд или минут и т. д.) в красиво отформатированную строку. Я взял фантастический ответ mpounsett по дублированному вопросу, сделал его немного более гибким, улучшенным читабельностью и добавленной документацией.
Вы найдете, что это самый гибкий ответ здесь, поскольку он позволяет вам:
Функция:
from string import Formatter
from datetime import timedelta
def strfdelta(tdelta, fmt='{D:02}d {H:02}h {M:02}m {S:02}s', inputtype='timedelta'):
"""Convert a datetime.timedelta object or a regular number to a custom-
formatted string, just like the stftime() method does for datetime.datetime
objects.
The fmt argument allows custom formatting to be specified. Fields can
include seconds, minutes, hours, days, and weeks. Each field is optional.
Some examples:
'{D:02}d {H:02}h {M:02}m {S:02}s' --> '05d 08h 04m 02s' (default)
'{W}w {D}d {H}:{M:02}:{S:02}' --> '4w 5d 8:04:02'
'{D:2}d {H:2}:{M:02}:{S:02}' --> ' 5d 8:04:02'
'{H}h {S}s' --> '72h 800s'
The inputtype argument allows tdelta to be a regular number instead of the
default, which is a datetime.timedelta object. Valid inputtype strings:
's', 'seconds',
'm', 'minutes',
'h', 'hours',
'd', 'days',
'w', 'weeks'
"""
# Convert tdelta to integer seconds.
if inputtype == 'timedelta':
remainder = int(tdelta.total_seconds())
elif inputtype in ['s', 'seconds']:
remainder = int(tdelta)
elif inputtype in ['m', 'minutes']:
remainder = int(tdelta)*60
elif inputtype in ['h', 'hours']:
remainder = int(tdelta)*3600
elif inputtype in ['d', 'days']:
remainder = int(tdelta)*86400
elif inputtype in ['w', 'weeks']:
remainder = int(tdelta)*604800
f = Formatter()
desired_fields = [field_tuple[1] for field_tuple in f.parse(fmt)]
possible_fields = ('W', 'D', 'H', 'M', 'S')
constants = {'W': 604800, 'D': 86400, 'H': 3600, 'M': 60, 'S': 1}
values = {}
for field in possible_fields:
if field in desired_fields and field in constants:
values[field], remainder = divmod(remainder, constants[field])
return f.format(fmt, **values)
Демоверсия:
>>> td = timedelta(days=2, hours=3, minutes=5, seconds=8, microseconds=340)
>>> print strfdelta(td)
02d 03h 05m 08s
>>> print strfdelta(td, '{D}d {H}:{M:02}:{S:02}')
2d 3:05:08
>>> print strfdelta(td, '{D:2}d {H:2}:{M:02}:{S:02}')
2d 3:05:08
>>> print strfdelta(td, '{H}h {S}s')
51h 308s
>>> print strfdelta(12304, inputtype='s')
00d 03h 25m 04s
>>> print strfdelta(620, '{H}:{M:02}', 'm')
10:20
>>> print strfdelta(49, '{D}d {H}h', 'h')
2d 1h
Я использовал библиотеку python humanfriendly
для этого, он работает очень хорошо.
import humanfriendly
from datetime import timedelta
delta = timedelta(seconds = 321)
humanfriendly.format_timespan(delta)
'5 minutes and 21 seconds'
Доступно в https://pypi.org/project/humanfriendly/
Как вы знаете, вы можете получить секунды от объекта timedelta, обратившись к атрибуту .seconds
.
Вы можете преобразовать его в часы и остаток с помощью комбинации по модулю и вычитанию:
# arbitrary number of seconds
s = 13420
# hours
hours = s // 3600
# remaining seconds
s = s - (hours * 3600)
# minutes
minutes = s // 60
# remaining seconds
seconds = s - (minutes * 60)
# total time
print '%s:%s:%s' % (hours, minutes, seconds)
# result: 3:43:40
Однако python предоставляет встроенную функцию divmod (), которая позволяет нам упростить этот код:
s = 13420
hours, remainder = divmod(s, 3600)
minutes, seconds = divmod(remainder, 60)
print '%s:%s:%s' % (hours, minutes, seconds)
# result: 3:43:40
Надеюсь, что это поможет!
abs(s)
.
– mbarkhau
4 May 2011 в 11:45
'%d:%02d:%02d'
, чтобы иметь ведущие нули в выходной строке.
– ShinNoNoir
20 March 2014 в 14:35
.seconds
, если разница может быть отрицательной или длиннее 24 часов (атрибут .seconds
игнорирует .days
). Вместо этого используйте .total_seconds()
или его аналог.
– jfs
30 January 2015 в 21:33
t = str(timedelta(seconds=500000))
print t[:-6] + ' hours ' + t[-5:-3] + ' mins'
def td_format(td_object):
seconds = int(td_object.total_seconds())
periods = [
('year', 60*60*24*365),
('month', 60*60*24*30),
('day', 60*60*24),
('hour', 60*60),
('minute', 60),
('second', 1)
]
strings=[]
for period_name, period_seconds in periods:
if seconds > period_seconds:
period_value , seconds = divmod(seconds, period_seconds)
has_s = 's' if period_value > 1 else ''
strings.append("%s %s%s" % (period_value, period_name, has_s))
return ", ".join(strings)
if seconds > period_seconds:
на if seconds >= period_seconds:
.
– CBenni
19 June 2015 в 19:04
>>> str(datetime.timedelta(hours=10.56))
10:33:36
>>> td = datetime.timedelta(hours=10.505) # any timedelta object
>>> ':'.join(str(td).split(':')[:2])
10:30
Передача объекта timedelta
в функцию str()
вызывает тот же используемый код форматирования, если мы просто наберем print td
. Поскольку вы не хотите секунд, мы можем разделить строку на двоеточия (3 части) и вернуть их вместе только с первыми двумя частями.
Участник хочет более приятный формат, чем типичный:
>>> import datetime
>>> datetime.timedelta(seconds=41000)
datetime.timedelta(0, 41000)
>>> str(datetime.timedelta(seconds=41000))
'11:23:20'
>>> str(datetime.timedelta(seconds=4102.33))
'1:08:22.330000'
>>> str(datetime.timedelta(seconds=413302.33))
'4 days, 18:48:22.330000'
Итак, на самом деле есть два формата: один, где дни равны 0, и он отсутствует, а другой, где есть текст «n дней», h: Миз". Но секунды могут иметь дроби, и в распечатках нет нулевых нулей, поэтому столбцы беспорядочны.
Вот моя рутина, если вам это нравится:
def printNiceTimeDelta(stime, etime):
delay = datetime.timedelta(seconds=(etime - stime))
if (delay.days > 0):
out = str(delay).replace(" days, ", ":")
else:
out = "0:" + str(delay)
outAr = out.split(':')
outAr = ["%02d" % (int(float(x))) for x in outAr]
out = ":".join(outAr)
return out
это возвращает вывод как dd: hh: mm: ss format:
00:00:00:15
00:00:00:19
02:01:31:40
02:01:32:22
Я действительно думал о добавлении лет к этому, но это оставлено как упражнение для читателя, поскольку выход безопасен в течение более 1 года :
>>> str(datetime.timedelta(seconds=99999999))
'1157 days, 9:46:39'
У него уже есть объект timedelta, поэтому почему бы не использовать его встроенный метод total_seconds (), чтобы преобразовать его в секунды, а затем использовать divmod () для получения часов и минут?
hours, remainder = divmod(myTimeDelta.total_seconds(), 3600)
minutes, seconds = divmod(remainder, 60)
# Formatted only for hours and minutes as requested
print '%s:%s' % (hours, minutes)
Это работает независимо от того, имеет ли дельта времени даже дни или годы.
Вы можете просто преобразовать timedelta в строку с помощью str (). Вот пример:
import datetime
start = datetime.datetime(2009,2,10,14,00)
end = datetime.datetime(2009,2,10,16,00)
delta = end-start
print(str(delta))
# prints 2:00:00
print 'some thing ' + str(delta)
– Plinio.Santos
6 February 2015 в 14:33
ConvertDuration=datetime.timedelta(milliseconds=int(254459))
, вы просто используете split, чтобы вывести микросекунды из игры. Из 0: 03: 43.765000 Я могу получить 0:03:43 простым запуском TotalDuration=str(ConvertDuration).split('.', 2)[0]
– DarkXDroid
8 February 2015 в 12:51
Пожалуйста, проверьте эту функцию - она преобразует объект timedelta в строку «HH: MM: SS»
def format_timedelta(td):
hours, remainder = divmod(td.total_seconds(), 3600)
minutes, seconds = divmod(remainder, 60)
hours, minutes, seconds = int(hours), int(minutes), int(seconds)
if hours < 10:
hours = '0%s' % int(hours)
if minutes < 10:
minutes = '0%s' % minutes
if seconds < 10:
seconds = '0%s' % seconds
return '%s:%s:%s' % (hours, minutes, seconds)
У меня была аналогичная проблема с выводом расчета сверхурочных на работу. Значение должно всегда отображаться в HH: MM, даже если оно больше одного дня, и значение может стать отрицательным. Я объединил некоторые из представленных решений, и, возможно, кто-то еще найдет это решение полезным. Я понял, что если значение timedelta отрицательно, большинство представленных решений с использованием метода divmod не работают из коробки:
def td2HHMMstr(td):
'''Convert timedelta objects to a HH:MM string with (+/-) sign'''
if td < datetime.timedelta(seconds=0):
sign='-'
td = -td
else:
sign = ''
tdhours, rem = divmod(td.total_seconds(), 3600)
tdminutes, rem = divmod(rem, 60)
tdstr = '{}{:}:{:02d}'.format(sign, int(tdhours), int(tdminutes))
return tdstr
timedelta to HH: MM string:
td2HHMMstr(datetime.timedelta(hours=1, minutes=45))
'1:54'
td2HHMMstr(datetime.timedelta(days=2, hours=3, minutes=2))
'51:02'
td2HHMMstr(datetime.timedelta(hours=-3, minutes=-2))
'-3:02'
td2HHMMstr(datetime.timedelta(days=-35, hours=-3, minutes=-2))
'-843:02'
Я серьезно рассмотрел бы подход Оккама к Razor здесь:
td = str(timedelta).split('.')[0]
Это возвращает строку без микросекунд
Если вы хотите регенерировать объект datetime.timedelta, просто выполните это:
h,m,s = re.split(':', td)
new_delta = datetime.timedelta(hours=int(h),minutes=int(m),seconds=int(s))
2 года, я люблю этот язык!
Я знаю, что это старый ответ, но для этого я использую datetime.utcfromtimestamp()
. Он принимает количество секунд и возвращает datetime
, который может быть отформатирован, как и любой другой datetime
.
duration = datetime.utcfromtimestamp(end - begin)
print duration.strftime('%H:%M')
Пока вы остаетесь в правовых диапазонах для временных частей, это должно работать, т.е. он не возвращает 1234: 35, поскольку часы равны & lt; = 23.
.zfill(8)
, если вам это нужно.
– jfs
30 January 2015 в 22:34
import datetime
hours = datetime.timedelta(hours=16, minutes=30)
print((datetime.datetime(1,1,1) + hours).strftime('%H:%M'))
Следуя приведенному выше примеру Джо, я бы использовал оператор арифметики модуля, так:
td = datetime.timedelta(hours=10.56)
td_str = "%d:%d" % (td.seconds/3600, td.seconds%3600/60)
Обратите внимание, что целочисленное деление в Python округляется по умолчанию; если вы хотите быть более явным, используйте math.floor () или math.ceil (), если это необходимо.
td.total_seconds()
вместо .seconds
, чтобы он работал с интервалами & gt; 1 день.
– Antony Hatchkins
14 August 2014 в 14:03
def seconds_to_time_left_string(total_seconds):
s = int(total_seconds)
years = s // 31104000
if years > 1:
return '%d years' % years
s = s - (years * 31104000)
months = s // 2592000
if years == 1:
r = 'one year'
if months > 0:
r += ' and %d months' % months
return r
if months > 1:
return '%d months' % months
s = s - (months * 2592000)
days = s // 86400
if months == 1:
r = 'one month'
if days > 0:
r += ' and %d days' % days
return r
if days > 1:
return '%d days' % days
s = s - (days * 86400)
hours = s // 3600
if days == 1:
r = 'one day'
if hours > 0:
r += ' and %d hours' % hours
return r
s = s - (hours * 3600)
minutes = s // 60
seconds = s - (minutes * 60)
if hours >= 6:
return '%d hours' % hours
if hours >= 1:
r = '%d hours' % hours
if hours == 1:
r = 'one hour'
if minutes > 0:
r += ' and %d minutes' % minutes
return r
if minutes == 1:
r = 'one minute'
if seconds > 0:
r += ' and %d seconds' % seconds
return r
if minutes == 0:
return '%d seconds' % seconds
if seconds == 0:
return '%d minutes' % minutes
return '%d minutes and %d seconds' % (minutes, seconds)
for i in range(10):
print pow(8, i), seconds_to_time_left_string(pow(8, i))
Output:
1 1 seconds
8 8 seconds
64 one minute and 4 seconds
512 8 minutes and 32 seconds
4096 one hour and 8 minutes
32768 9 hours
262144 3 days
2097152 24 days
16777216 6 months
134217728 4 years
timedelta
имеет поля days
, seconds
и microseconds
в документации.
– Thomas Ahle
16 April 2014 в 10:23