Data / hora do Python para string sem componente de microssegundo

410

Estou adicionando cadeias de tempo UTC às respostas da API do Bitbucket que atualmente contêm apenas cadeias de tempo de Amsterdã (!). Para consistência com as seqüências de tempo UTC retornadas em outro local, o formato desejado é 2011-11-03 11:07:04(seguido por +00:00, mas isso não é relevante).

Qual é a melhor maneira de criar uma string ( sem um componente de microssegundo) a partir de uma datetimeinstância com um componente de microssegundo?

>>> import datetime
>>> print unicode(datetime.datetime.now())
2011-11-03 11:13:39.278026

Acrescentarei a melhor opção que me ocorreu como uma resposta possível, mas pode muito bem haver uma solução mais elegante.

Editar: devo mencionar que não estou realmente imprimindo a hora atual - costumava datetime.nowfornecer um exemplo rápido. Portanto, a solução não deve assumir que quaisquer datetimeinstâncias recebidas incluirão componentes de microssegundos.

davidchambers
fonte

Respostas:

840

Se você deseja formatar um datetimeobjeto em um formato específico diferente do formato padrão, é melhor especificar explicitamente esse formato:

>>> datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
'2011-11-03 18:21:26'

Consulte a documentação dedatetime.strftime() para obter uma explicação das %diretrizes.

Sven Marnach
fonte
10
Um colega acabou de fazer um argumento convincente para que essa seja a abordagem correta. Considere-me convencido.
Davidchambers #
3
Qual foi o caso convincente - colocar esta solução acima da sua solução usando datetime.replace?
matlehmann
13
@matlehmann: Claro que não conheço os argumentos do colega davidchambers. No entanto, acho que se sua intenção é imprimir uma data em um formato muito específico, você deve ser explícito sobre essa intenção. O código nesta resposta diz "pegue a hora atual e formate-a exatamente assim". O código na outra resposta diz "pegue o tempo atual, defina os microssegundos para 0 e depois converta-o em uma string de alguma forma".
precisa saber é o seguinte
3
+1, sendo explícito sobre o formato da cadeia evita problemas se a conversão de data e hora-str padrão muda em uma versão futura do Python
Alan Evangelista
2
@DylanYoung O requisito do OP é imprimir um objeto datetime em um formato diferente do formato padrão retornado por .isoformat(), que inclui os microssegundos por padrão. Se é disso que você precisa, seja explícito. Todos entenderão imediatamente o que esse código faz. Dificilmente alguém entenderá o outro código sem consultar a documentação.
Sven Marnach
172
>>> import datetime
>>> now = datetime.datetime.now()
>>> print unicode(now.replace(microsecond=0))
2011-11-03 11:19:07
davidchambers
fonte
1
na minha situação, a data já foi construída e eu precisava "colocá-la" no segundo. isso é perfeito, obrigado.
Vigrond
1
Esta é a melhor resposta!
Havok
Muito melhor do que formatar ou analisar seqüências de caracteres para a comparação, obrigado.
Zach Young
47

É assim que eu faço. Formato ISO:

import datetime
datetime.datetime.now().replace(microsecond=0).isoformat()
# Returns: '2017-01-23T14:58:07'

Você pode substituir o 'T' se não quiser o formato ISO:

datetime.datetime.now().replace(microsecond=0).isoformat(' ')
# Returns: '2017-01-23 15:05:27'
Radtek
fonte
Isso é semelhante à minha resposta. Existe uma razão para favorecer .isoformat()mais unicode()?
Davidchambers
1
Depende do que você deseja, se você deseja usar a representação de cadeias de caracteres python unicode()e se deseja ISO-8601, useisoformat()
radtek
Eu vejo. unicode()é mais conveniente do que .isoformat().replace('T', ' '), certamente. ;)
davidchambers
Gostaria apenas de usar a solução de Sven para o formato não iso, é mais explícito: datetime.now (). Strftime ("% Y-% m-% d% H:% M"), mas substituir o 'T' é apenas mais um caminho. Pode ser a melhor solução se você precisar da data ISO e unicode.
Radtek
isoformataceita o especificador separador, portanto, nenhuma substituição deve ser feita. apenas faça:datetime.datetime.now().replace(microsecond=0).isoformat(' ')
coya
17

Mais uma opção:

>>> import time
>>> time.strftime("%Y-%m-%d %H:%M:%S")
'2011-11-03 11:31:28'

Por padrão, isso usa a hora local; se você precisar do UTC, pode usar o seguinte:

>>> time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
'2011-11-03 18:32:20'
Andrew Clark
fonte
Voto negativo porque o OP perguntou sobre data e hora, não hora.
Jürgen A. Erhard
15

Mantenha os 19 primeiros caracteres que você queria por meio do fatiamento:

>>> str(datetime.datetime.now())[:19]
'2011-11-03 14:37:50'
Steven Rumbalski
fonte
5
Isso está incorreto apenas porque as seqüências de tempo podem ter a especificação de fuso horário anexada, por exemplo +05:30. Correto seria str(now())[:19].
K3 --- rnc
1
@ K3 --- rnc: Obrigado. Atualizado de acordo com sua sugestão.
Steven Rumbalski 5/05
depois do ano 10000, um segundo será perdido
diti
o tempo dirá @diti;)
y Febsʞǝla
8

Eu costumo fazer:

import datetime
now = datetime.datetime.now()
now = now.replace(microsecond=0)  # To print now without microsecond.

# To print now:
print(now)

resultado:

2019-01-13 14:40:28
An0n
fonte
7

Como nem todas as datetime.datetimeinstâncias têm um componente de microssegundo (ou seja, quando é zero), você pode particionar a string em um "." e pegue apenas o primeiro item, que sempre funcionará:

unicode(datetime.datetime.now()).partition('.')[0]
Austin Marshall
fonte
3

Podemos tentar algo como abaixo

import datetime

date_generated = datetime.datetime.now()
date_generated.replace(microsecond=0).isoformat(' ').partition('+')[0]
Abhishek Bajaj
fonte
Isso é inferior a .isoformat(' ', 'seconds'), proposto em uma resposta anterior.
Davidchambers #
1
Quando estou tentando a resposta anterior proposta acima, estou recebendo o erro abaixo >>> datetime.datetime.now (). Isoformat ('', 'seconds') Traceback (última chamada mais recente): Arquivo "<stdin>", linha 1, na <module> TypeError: isoformat () leva, no máximo, 1 argumento (2 dado)
Abhishek Bajaj
Ah entendo. Ele funciona para mim em Python 3, mas não em Python 2.
davidchambers
Estou usando a versão python 3.4.3, na qual vejo esse erro. >>> datetime.datetime.now (). isoformat ('', 'seconds') Traceback (última chamada mais recente): O arquivo "<stdin>", linha 1, no <module> TypeError: isoformat () leva no máximo 1 argumento (2 dados)
Abhishek Bajaj 9/18
1

Eu achei que essa era a maneira mais simples.

>>> t = datetime.datetime.now()
>>> t
datetime.datetime(2018, 11, 30, 17, 21, 26, 606191)
>>> t = str(t).split('.')
>>> t
['2018-11-30 17:21:26', '606191']
>>> t = t[0]
>>> t
'2018-11-30 17:21:26'
>>> 
Muhammed Irfan
fonte
datetime.datetime.now (). strftime ("% Y-% m-% d% H:% M:% S") '2011-11-03 18:21:26' imo muito mais fácil. Mas fácil não é alwast o melhor
An0n
1

Isso eu uso porque posso entender e, portanto, me lembrar melhor (e o formato de data e hora também pode ser personalizado com base em sua escolha): -

import datetime
moment = datetime.datetime.now()
print("{}/{}/{} {}:{}:{}".format(moment.day, moment.month, moment.year,
                                 moment.hour, moment.minute, moment.second))
satyakam shashwat
fonte
Brilhante. Simples, flexível e independente de plataforma (diferente do tempo de espera).
Endre Both