Subtrair data/hora em Python

Rayven Esplanada 18 julho 2021
Subtrair data/hora em Python

Este tutorial irá introduzir como realizar a subtracção de data/hora em Python.

Iremos explorar diferentes resultados após a subtracção, como a produção do número de segundos, minutos, horas, ou anos da diferença dos dois objectos de data/hora fornecidos.

Utilizar o módulo datetime para subtrair datetime em Python

datetime é um módulo em Python que suportará funções que manipulam o objecto datetime.

A inicialização de um objecto datetime toma três parâmetros necessários como datetime.datetime(year, month, day). Também aceita parâmetros opcionais sob a forma de horas, minutos, segundos, microssegundos, e fuso horário.

O datetime também tem a função now(), que inicializa a data e a hora actuais no objecto.

A subtracção de dois objectos de data/hora devolverá a diferença do número de dias, e a diferença no tempo, se houver alguma.

from datetime import datetime

then = datetime(1987, 12, 30, 17, 50, 14)  # yr, mo, day, hr, min, sec
now = datetime(2020, 12, 25, 23, 13, 0)

print(now - then)

Resultado:

12055 days, 5:10:00

O resultado significa que as duas datas são 12055 dias e 5 horas e 10 minutos de intervalo.

Para converter este resultado em formatos diferentes, teríamos primeiro de converter a timedelta em segundos. O objecto datetime tem um método incorporado datetime.total_seconds() convertendo o objecto no total de segundos que contém.

Aqui está o código-fonte completo para a subtracção do datetime utilizando o módulo datetime e as suas funções.

from datetime import datetime


def getDifference(then, now=datetime.now(), interval="secs"):

    duration = now - then
    duration_in_s = duration.total_seconds()

    # Date and Time constants
    yr_ct = 365 * 24 * 60 * 60  # 31536000
    day_ct = 24 * 60 * 60  # 86400
    hour_ct = 60 * 60  # 3600
    minute_ct = 60

    def yrs():
        return divmod(duration_in_s, yr_ct)[0]

    def days():
        return divmod(duration_in_s, day_ct)[0]

    def hrs():
        return divmod(duration_in_s, hour_ct)[0]

    def mins():
        return divmod(duration_in_s, minute_ct)[0]

    def secs():
        return duration_in_s

    return {
        "yrs": int(yrs()),
        "days": int(days()),
        "hrs": int(hrs()),
        "mins": int(mins()),
        "secs": int(secs()),
    }[interval]


then = datetime(1987, 12, 30, 17, 50, 14)  # yr, mo, day, hr, min, sec
now = datetime(2020, 12, 25, 23, 13, 0)

print("The difference in seconds:", getDifference(then, now, "secs"))
print("The difference in minutes:", getDifference(then, now, "mins"))
print("The difference in hours:", getDifference(then, now, "hrs"))
print("The difference in days:", getDifference(then, now, "days"))
print("The difference in years:", getDifference(then, now, "yrs"))

A primeira coisa que o código faz é inicializar 2 datas separadas para a subtracção e chamar a função várias vezes com saídas diferentes de cada vez. No caso de all, devolverá uma saída que obtém a diferença com base em todos os casos de anos a segundos.

A função divmod() aceita dois números como dividendo e divisor e devolve um tuple do quociente e o restante entre eles. Apenas o quociente é necessário, e é por isso que apenas o índice 0 é utilizado através do código.

Resultado:

The difference in seconds: 1041052966
The difference in minutes: 17350882
The difference in hours: 289181
The difference in days: 12049
The difference in years: 33

Agora temos a diferença entre dois objectos de data e hora dentro de vários períodos de tempo diferentes.

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn

Artigo relacionado - Python DateTime