Невозможно создать таймер с пустым дневным интервалом, используя datetime - PullRequest
0 голосов
/ 24 июня 2019

У меня есть программа, которая должна сохранять общее количество времени, потраченного на выполнение чего-либо.У меня сохранено значение, которое должно начинаться с «000d 00h 00m 00s» в течение 0 дней, часов, минут и секунд.Однако, если я пытаюсь добавить время к нему, я получаю «ValueError: данные времени« 000d 00h 00m 00s »не соответствуют формату«% jd% Hh% Mm% Ss »».

Если я изменю начальную строку на «001d 00h 00m 00s», это добавит время без проблем, но тогда у меня будет значение на 24 часа больше, чем точное.Он также будет работать, если я просто уберу счетчик дней и у него будет «00h 00m 00s», но он все равно будет сбрасывать часы после того, как он достигнет 24.

Возможность начать с «000d 00h 00m 00s»было бы предпочтительнее, но если это невозможно, переполнение часов (т. е. «25h 00m 00s») будет работать.

from datetime import *

EmptyTime = '000d 00h 00m 00s'
EmptyTimeThatWorks = '001d 00h 00m 00s'
ExampleTime = '174d 19h 07m 53s' # June 23 7:07 PM
FMT = "%jd %Hh %Mm %Ss"

def TaskEnded(RunningTotal, TimerStartTime):
    PresentTime = datetime.now().strftime(FMT) #PresnetTime is when the TaskEnded

    st = datetime.strptime(TimerStartTime, FMT)  #Brings things into the right format 
    pt = datetime.strptime(PresentTime, FMT)  #Brings things into the right format
    rt = datetime.strptime(RunningTotal, FMT)  #Brings things into the right format, but EmptyTime cant be
                                               # conveted to the right time because day '0' doenst exist
                                               # while hour, minute, and second 0 do

    NewTotal = rt + (pt - st)      #takes the running total and adds the timer value, which is the difference of start and end times
    NewTotal2 = datetime.strftime(NewTotal, FMT)  # Puts the Datetime value back into the right format FMT
    print(NewTotal2)
    return NewTotal2

TaskEnded(EmptyTimeThatWorks, ExampleTime)
TaskEnded(EmptyTime, ExampleTime)

1 Ответ

0 голосов
/ 26 июня 2019

Вот что я хотел сказать о сохранении истекшего времени в timedelta и написании кода, соответствующего рекомендациям PEP 8:

from datetime import *


def task_ended(running_total, timer_start_time, fmt="%B %d, %Y %I:%M %p"):
    """ Add time elapsed between timer_start_time and now to
        running_total timedelta and return it.
    """
    present_time = datetime.now()   # When task ended.
    # Convert timer_start_time string into a datetime using fmt string.
    start_time = datetime.strptime(timer_start_time, fmt)
    # Add time elapsed between present time and timer start time to running
    # total and return it.
    return running_total + (present_time - start_time)

def format_timedelta(td):
    """ Format timedelta into custom string representation. """
    days = td.days
    hours, remainder = divmod(td.seconds, 3600)
    mins, secs = divmod(remainder, 60)
    return '{:03}d {:02}h {:02}m {:02}s'.format(days, hours, mins, secs)


running_total = timedelta()
example_start_time = 'June 25, 2019 5:00 PM'
running_total = task_ended(running_total, example_start_time)
print('running total:', format_timedelta(running_total))
print()
running_total = timedelta()
example_start_time = 'June 23, 2019 7:07 PM'
running_total = task_ended(running_total, example_start_time)
print('running total:', format_timedelta(running_total))

Вот способ разбить итоговую строку в timedelta(на основе пары ответов на вопрос Как построить timedelta объект из простой строки ):

import re

regex = re.compile(r'^((?P<days>[\d]+?)d)? *'
                   r'((?P<hours>[\d]+?)h)? *'
                   r'((?P<minutes>[\d]+?)m)? *'
                   r'((?P<seconds>[\d]+?)s)?$')

def parse_timedelta(time_str):
    """
    Parse a time string e.g. (2h 13m) into a timedelta object.

    Modified from virhilo & Peter's answers at https://stackoverflow.com/a/4628148/355230

    :param time_str: A string identifying a duration.  (eg. 2h 13m)
    :return datetime.timedelta: A datetime.timedelta object
    """
    parts = regex.match(time_str)
    assert parts is not None, "Could not parse any time information from '{}'".format(time_str)
    time_params = {name: float(param) for name, param in parts.groupdict().items() if param}
    return timedelta(**time_params)


# Test string parser function.
test_str = '000d 21h 40m 53s'
td = parse_timedelta(test_str)
assert format_timedelta(td) == test_str

test_str = '002d 19h 33m 53s'
td = parse_timedelta(test_str)
assert format_timedelta(td) == test_str
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...