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.

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.


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


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'

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'

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'

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

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]

3

Podemos tentar algo como abaixo

import datetime

date_generated = datetime.datetime.now()
date_generated.replace(microsecond=0).isoformat(' ').partition('+')[0]

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'
>>> 

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))

Brilhante. Simples, flexível e independente de plataforma (diferente do tempo de espera).
Endre Both
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.