Dado um datetime.time
valor em Python, existe uma maneira padrão de adicionar um número inteiro de segundos a ele, de modo que 11:34:59
+ 3 = 11:35:02
, por exemplo?
Essas idéias óbvias não funcionam:
>>> datetime.time(11, 34, 59) + 3
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'int'
>>> datetime.time(11, 34, 59) + datetime.timedelta(0, 3)
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.timedelta'
>>> datetime.time(11, 34, 59) + datetime.time(0, 0, 3)
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.time'
No final, escrevi funções como esta:
def add_secs_to_time(timeval, secs_to_add):
secs = timeval.hour * 3600 + timeval.minute * 60 + timeval.second
secs += secs_to_add
return datetime.time(secs // 3600, (secs % 3600) // 60, secs % 60)
Não posso deixar de pensar que estou perdendo uma maneira mais fácil de fazer isso.
Respostas:
Você pode usar
datetime
variáveis completas comtimedelta
, e fornecendo uma data fictícia e usandotime
apenas para obter o valor do tempo.Por exemplo:
resulta nos dois valores, com três segundos de diferença:
Você também pode optar pelo mais legível
se você é tão inclinado.
Se você procura uma função que pode fazer isso, pode usar o
addSecs
seguinte:Isso gera:
fonte
Como outros aqui declararam, você pode simplesmente usar objetos completos de data e hora em todo o evento:
No entanto, acho que vale a pena explicar por que os objetos completos de data e hora são necessários. Considere o que aconteceria se eu adicionasse duas horas às 23h. Qual é o comportamento correto? Uma exceção, porque você não pode ter um tempo maior que 23:59? Deveria voltar?
Programadores diferentes esperam coisas diferentes; portanto, qualquer resultado que eles escolherem surpreenderá muitas pessoas. Pior ainda, os programadores escreveriam código que funcionou bem quando o testaram inicialmente e depois o interromperam fazendo algo inesperado. Isso é muito ruim, e é por isso que você não tem permissão para adicionar objetos timedelta a objetos de tempo.
fonte
Uma pequena coisa, pode adicionar clareza para substituir o valor padrão por segundos
fonte
Agradecemos a @Pax Diablo, @bvmou e @Arachnid pela sugestão de usar datetime completos em todo o site. Se eu tiver que aceitar objetos datetime.time de uma fonte externa, isso parece ser uma
add_secs_to_time()
função alternativa :Este código detalhado pode ser compactado para esta linha:
mas acho que gostaria de encerrar isso em uma função para maior clareza do código.
fonte
Se vale a pena adicionar outro arquivo / dependência ao seu projeto, acabei de escrever uma pequena classe que se estende
datetime.time
com a capacidade de fazer aritmética. Quando você passa da meia-noite, ele fica em torno de zero. Agora, "que horas serão daqui a 24 horas" tem muitos casos de canto, incluindo horário de verão, segundos bissextos, alterações históricas do fuso horário e assim por diante. Mas às vezes você realmente precisa do caso simples, e é isso que isso fará.Seu exemplo seria escrito:
nptime
herda dedatetime.time
, portanto, qualquer um desses métodos também deve ser usado.Está disponível no PyPi como
nptime
("horário não pedante") ou no GitHub: https://github.com/tgs/nptimefonte
Você não pode simplesmente adicionar um número
datetime
porque não está claro qual unidade é usada: segundos, horas, semanas ...Há
timedelta
aula para manipulações com data e hora.datetime
menosdatetime
dátimedelta
,datetime
maistimedelta
dádatetime
, doisdatetime
objetos não podem ser adicionados, embora doistimedelta
possam.Crie um
timedelta
objeto com quantos segundos você deseja adicionar e adicione-o aodatetime
objeto:Há mesmo conceito em C ++:
std::chrono::duration
.fonte
Por uma questão de completude, eis o caminho para fazê-lo
arrow
(datas e horários melhores para o Python):fonte
Tente adicionar um
datetime.datetime
a umdatetime.timedelta
. Se você deseja apenas a parte do tempo, pode chamar otime()
método nodatetime.datetime
objeto resultante para obtê-lo.fonte
Pergunta antiga, mas achei que iria jogar uma função que lida com fusos horários. As partes principais estão passando o atributo
datetime.time
do objetotzinfo
para combinar e, em seguida, usando-o emtimetz()
vez datime()
data e hora fictícia resultante. Esta resposta foi parcialmente inspirada pelas outras respostas aqui.E aqui está uma classe de caso de teste realmente simples (usando o built-in
unittest
):fonte