Python извлекает значения для даты времени [duplicate]

  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;  }}  
193
задан Oz123 30 June 2013 в 12:45
поделиться

21 ответ

Спасибо всем за вашу помощь. Я взял много ваших идей и собрал их вместе, дайте мне знать, что вы думаете.

Я добавил два метода в класс следующим образом:

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>
-8
ответ дан mawcs 15 August 2018 в 16:37
поделиться

Мои объекты datetime.timedelta прошли больше дня. Итак, вот еще одна проблема. Все вышеприведенное обсуждение предполагает менее одного дня. A timedelta на самом деле является кортежем дней, секунд и микросекунд. Вышеприведенное обсуждение должно использовать td.seconds как joe, но если у вас есть дни, он не включен в значение секунд.

Я получаю промежуток времени между 2 датами и печатьми дней и часов.

span = currentdt - previousdt
print '%d,%d\n' % (span.days,span.seconds/3600)
12
ответ дан Alex L 15 August 2018 в 16:37
поделиться

Я лично использую библиотеку 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, вам, вероятно, следует это использовать.

16
ответ дан arogachev 15 August 2018 в 16:37
поделиться
  • 1
    Nice, + 1 Хотя: humanize.naturaldelta (pd.Timedelta ('- 10sec')) - & gt; '10 секунд ': S ... – ntg 13 December 2016 в 11:49
  • 2
    хорошо это есть 10 секунд delta . :) это вы хотите time , 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'
1
ответ дан Artem Vasilev 15 August 2018 в 16:37
поделиться
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'
-1
ответ дан Aviad 15 August 2018 в 16:37
поделиться

Вот универсальная функция для преобразования либо объекта timedelta, либо обычного номера (в виде секунд или минут и т. д.) в красиво отформатированную строку. Я взял фантастический ответ mpounsett по дублированному вопросу, сделал его немного более гибким, улучшенным читабельностью и добавленной документацией.

Вы найдете, что это самый гибкий ответ здесь, поскольку он позволяет вам:

  1. Настроить формат строки «на лету» вместо того, чтобы быть жестко закодированным .
  2. Оставьте определенные промежутки времени без проблем (см. примеры ниже).

Функция:

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
9
ответ дан Community 15 August 2018 в 16:37
поделиться

Я использовал библиотеку 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/

0
ответ дан Dhiraj Gupta 15 August 2018 в 16:37
поделиться

Как вы знаете, вы можете получить секунды от объекта 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

Надеюсь, что это поможет!

135
ответ дан Felix Kling 15 August 2018 в 16:37
поделиться
  • 1
    Для отрицательных timedeltas вы должны сначала оценить знак, а затем сделать abs(s). – mbarkhau 4 May 2011 в 11:45
  • 2
    Обратите внимание, что вы действительно можете использовать '%d:%02d:%02d', чтобы иметь ведущие нули в выходной строке. – ShinNoNoir 20 March 2014 в 14:35
  • 3
    для python 2.7 и более используйте метод .total_seconds () – sk8asd123 22 April 2014 в 22:46
  • 4
    Не используйте .seconds, если разница может быть отрицательной или длиннее 24 часов (атрибут .seconds игнорирует .days). Вместо этого используйте .total_seconds() или его аналог. – jfs 30 January 2015 в 21:33
  • 5
    Для положительных различий я время от времени повторяю это. Спасибо, что просто нужно искать на этот раз :) – Wolf 25 April 2018 в 10:12
t = str(timedelta(seconds=500000)) 

print t[:-6] + ' hours ' + t[-5:-3] + ' mins'
-3
ответ дан i_am_jorf 15 August 2018 в 16:37
поделиться
  • 1
    Просьба представить некоторое описание вашего кода. – Zhaoxing Lu - Microsoft 21 November 2017 в 08:08
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)
28
ответ дан Jean-Francois T. 15 August 2018 в 16:37
поделиться
>>> 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 части) и вернуть их вместе только с первыми двумя частями.

44
ответ дан joeforker 15 August 2018 в 16:37
поделиться
  • 1
    Спасибо за ваш ответ joeforker, но я не уверен, что понимаю ваш ответ. Я получаю временную дельта с помощью datetime - datetime. Я не знаю часов. Кроме того, похоже, что ваш пример включает секунды, как бы удалить это? – mawcs 11 February 2009 в 21:46
  • 2
    Неважно, где вы получаете объект timedelta, он будет форматировать то же самое. – joeforker 11 February 2009 в 21:48
  • 3
    Если он длиннее одного дня, он будет отформатировать, например, "4 дня, 8: 00" после обработки split / join. – joeforker 11 February 2009 в 21:52
  • 4
    str(my_timedelta) плохо работает для отрицательных чисел – Catskul 18 May 2014 в 00:14
  • 5
    Показывает дни, когда & gt; 24 часа, например. '4 дня, 18: 48: 22.330000'. Многие методы, рекомендованные здесь, не имеют. – Alexei Martianov 17 May 2018 в 12:53

Участник хочет более приятный формат, чем типичный:

  >>> 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'
13
ответ дан Kevin J. Rice 15 August 2018 в 16:37
поделиться

У него уже есть объект 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)

Это работает независимо от того, имеет ли дельта времени даже дни или годы.

25
ответ дан Markus Amalthea Magnuson 15 August 2018 в 16:37
поделиться

Вы можете просто преобразовать 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
151
ответ дан Martijn Pieters 15 August 2018 в 16:37
поделиться
  • 1
    Больше похоже на вызов метода str () с timedelta в качестве аргумента. – joeforker 12 February 2009 в 19:23
  • 2
    Вам не нужен вызов str, это будет сделано автоматически с помощью печати. – Zitrax 14 February 2014 в 09:49
  • 3
    @Zitrax, но это необходимо, если вы собираетесь объединить дельту с другой строкой. Например, print 'some thing ' + str(delta) – Plinio.Santos 6 February 2015 в 14:33
  • 4
    И когда тип данных определяется как «datetime.timedelta», и вы используете его как 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
  • 5
    Это может печатать дельта в виде строки, но она не форматирует ее, как запрошено OP. – Dannid 18 February 2015 в 23:16

Пожалуйста, проверьте эту функцию - она ​​преобразует объект 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)
0
ответ дан MobilePro.pl 15 August 2018 в 16:37
поделиться

У меня была аналогичная проблема с выводом расчета сверхурочных на работу. Значение должно всегда отображаться в 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'
3
ответ дан nealtz 15 August 2018 в 16:37
поделиться

Я серьезно рассмотрел бы подход Оккама к 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 года, я люблю этот язык!

6
ответ дан Pyrotherm 15 August 2018 в 16:37
поделиться

Я знаю, что это старый ответ, но для этого я использую datetime.utcfromtimestamp(). Он принимает количество секунд и возвращает datetime, который может быть отформатирован, как и любой другой datetime.

duration = datetime.utcfromtimestamp(end - begin)
print duration.strftime('%H:%M')

Пока вы остаетесь в правовых диапазонах для временных частей, это должно работать, т.е. он не возвращает 1234: 35, поскольку часы равны & lt; = 23.

13
ответ дан sjngm 15 August 2018 в 16:37
поделиться
  • 1
    вы должны использовать print timedelta(seconds=end - begin). – jfs 30 January 2015 в 21:37
  • 2
    @ J.F.Sebastian. Тогда вам придется вручную вводить часы с ведущими нулями. – sjngm 30 January 2015 в 21:45
  • 3
    Я ничего не вижу о дополнении в вопросе. Используйте .zfill(8), если вам это нужно. – jfs 30 January 2015 в 22:34
  • 4
  • 5
    Я предпочитаю это решение, оно позволяет вам управлять форматированием. Обратите внимание, что вы также можете использовать str formatter прямо так: & quot; {0:% H}: {0:% M} ".format (duration) – toes 26 July 2017 в 15:26
import datetime
hours = datetime.timedelta(hours=16, minutes=30)
print((datetime.datetime(1,1,1) + hours).strftime('%H:%M'))
2
ответ дан SleX 15 August 2018 в 16:37
поделиться

Следуя приведенному выше примеру Джо, я бы использовал оператор арифметики модуля, так:

td = datetime.timedelta(hours=10.56)
td_str = "%d:%d" % (td.seconds/3600, td.seconds%3600/60)

Обратите внимание, что целочисленное деление в Python округляется по умолчанию; если вы хотите быть более явным, используйте math.floor () или math.ceil (), если это необходимо.

6
ответ дан UltraNurd 15 August 2018 в 16:37
поделиться
  • 1
    timedelta уже знает, как отформатировать себя, как в 'print some_timedelta'. – joeforker 11 February 2009 в 21:57
  • 2
    Да, но он не может принять произвольную строку формата, о чем Майкл спрашивал. Хотя теперь, когда я думаю об этом, модератор 3600-деления делает предположение о часах-секундах, которое вызывает проблемы на високосных секундах. – UltraNurd 11 February 2009 в 22:01
  • 3
    Да, но он не хочет произвольной строки форматирования, он хочет почти точно по умолчанию. – joeforker 11 February 2009 в 22:07
  • 4
    Не забывайте // для усечения деления в Python 3000 – joeforker 12 February 2009 в 19:22
  • 5
    +1, но почему вы не редактируете ответ на использование //? Я также предлагаю использовать 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
3
ответ дан Veselin Penev 15 August 2018 в 16:37
поделиться
  • 1
    Ты написал это? Сколько вы его протестировали? – Thomas Ahle 4 December 2013 в 14:30
  • 2
    Я использую этот код в своем проекте под названием datahaven.net . Он работает очень хорошо. Вы видели ошибки? – Veselin Penev 12 December 2013 в 18:07
  • 3
    Всегда приятно, если вы можете предоставить немного информации с таким тяжелым ответом кода :) Как пример того, как это работает, возможные сильные и слабые стороны. – Thomas Ahle 12 December 2013 в 18:13
  • 4
    Ой. Конечно!. Добавлен пример для вас. :-) – Veselin Penev 22 December 2013 в 18:26
  • 5
    Супер :) Также обратите внимание, что объект timedelta имеет поля days, seconds и microseconds в документации. – Thomas Ahle 16 April 2014 в 10:23
Другие вопросы по тегам:

Похожие вопросы: