마이크로 초 구성 요소없이 문자열로 파이썬 날짜 시간


410

현재 암스테르담 (!) 시간 문자열 만 포함하는 Bitbucket API 응답에 UTC 시간 문자열을 추가하고 있습니다. 다른 곳에서 반환되는 UTC 시간 문자열과 일관성을 유지하기 위해 원하는 형식이 2011-11-03 11:07:04뒤에옵니다 ( +00:00하지만 그다지 독일어는 아닙니다).

(예 : 문자열을 만들 수있는 가장 좋은 방법은 무엇입니까 없이 A로부터 마이크로 초 구성 요소)를 datetime 마이크로 초 구성 요소는?

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

가능한 대답으로 나에게 발생한 최상의 옵션을 추가하지만 더 우아한 해결책이있을 수 있습니다.

편집 : 실제로 현재 시간을 인쇄하고 있지 않다는 것을 언급해야합니다 datetime.now. 빠른 예제를 제공하는 데 사용 했습니다. 따라서 솔루션은 datetime수신 하는 인스턴스에 마이크로 초 구성 요소가 포함 된다고 가정해서는 안됩니다 .

답변:


840

datetime표준 형식과 다른 특정 형식으로 오브젝트 를 형식화 하려면 해당 형식을 명시 적으로 지정하는 것이 가장 좋습니다.

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

지시문 에 대한 설명은 설명서를datetime.strftime() 참조하십시오 %.


10
동료는 이것이 올바른 접근 방법이라는 설득력있는 사례를 만들었습니다. 확신한다고 생각해
davidchambers

3
그 설득력있는 사례는 무엇입니까? datetime.replace를 사용 하여이 솔루션을 솔루션 위에 두는 것입니까?
matlehmann

13
@ matlehmann : 물론 나는 davidchambers의 동료의 주장을 모른다. 그러나 날짜를 매우 구체적인 형식으로 인쇄하려는 경우이 의도에 대해 명시해야한다고 생각합니다. 이 답변의 코드는 "현재 시간을 가져 와서 정확하게 다음과 같이 포맷하십시오"라고 말합니다. 다른 답변의 코드는 "현재 시간을 취하여 마이크로 초를 0으로 설정 한 다음 어떻게 든 문자열로 변환합니다"라고 말합니다.
Sven Marnach

3
+1, 문자열 형식에 대해 명시 적이므로 향후 Python 버전에서 표준 날짜 / 시간 변환이 변경되는 경우 문제를 피할 수 있습니다.
Alan Evangelista

2
@DylanYoung OP의 요구 사항은 기본적으로 마이크로 초를 포함하여 로 반환 된 표준 형식 과 다른 형식으로 날짜 시간 개체를 인쇄하는 것입니다 .isoformat(). 그것이 당신이 필요한 것이라면, 그것에 대해 명시하십시오. 누구나이 코드의 기능을 즉시 이해합니다. 문서를 보지 않고 다른 코드를 이해하는 사람은 거의 없습니다.
Sven Marnach

172
>>> import datetime
>>> now = datetime.datetime.now()
>>> print unicode(now.replace(microsecond=0))
2011-11-03 11:19:07

20
나는 이것이 읽기 쉽고 문서화되고 일관된 동작이기 때문에 이것이 올바른 해결책이라고 생각한다. " .isoformat([sep])-ISO 8601 형식, YYYY-MM-DDTHH : MM : SS.mmmmmm 또는 마이크로 초가 0, YYYY-MM-DDTHH : MM : SS "
Bengt

1
내 상황에서 날짜는 이미 구성되었으며 두 번째 날짜까지 "바닥"해야했습니다. 이것은 완벽합니다. 감사합니다.
Vigrond

1
이것이 가장 좋은 대답입니다!
Havok

비교를 위해 문자열을 형식화하거나 구문 분석하는 것보다 훨씬 좋습니다. 감사합니다.
Zach Young


47

이것이 내가하는 방법입니다. ISO 형식 :

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

ISO 형식을 원하지 않으면 'T'를 바꿀 수 있습니다.

datetime.datetime.now().replace(microsecond=0).isoformat(' ')
# Returns: '2017-01-23 15:05:27'

이것은 내 대답과 비슷합니다. 선호하는 이유가 .isoformat()이상은 unicode()?
davidchambers 2012 년

1
원하는 것에 따라, 파이썬 문자열 표현을 사용하려면 unicode(), ISO-8601을 사용하려면isoformat()
radtek

내가 참조. 확실히 unicode()보다 편리합니다 .isoformat().replace('T', ' '). ;)
davidchambers

나는 isiso가 아닌 형식에 대해 Sven의 솔루션을 사용하려고합니다. 방법. ISO 및 유니 코드 날짜가 모두 필요한 경우 최상의 솔루션 일 수 있습니다.
radtek

isoformat구분 기호 지정자를 허용하므로 교체를 수행하지 않아야합니다. 다만 수행datetime.datetime.now().replace(microsecond=0).isoformat(' ')
coya

17

또 다른 옵션 :

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

기본적으로 현지 시간을 사용하므로 UTC가 필요한 경우 다음을 사용할 수 있습니다.

>>> time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
'2011-11-03 18:32:20'

OP가 시간이 아니라 날짜 시간에 대해 물었 기 때문에 다운 보트.
Jürgen A. Erhard

15

슬라이싱을 통해 원하는 처음 19자를 유지하십시오.

>>> str(datetime.datetime.now())[:19]
'2011-11-03 14:37:50'

5
예를 들어, 시간 문자열에 시간대 지정이 추가 될 수 있기 때문에 이는 올바르지 않습니다 +05:30. 맞습니다 str(now())[:19].
K3 --- rnc

1
@ K3 --- rnc : 감사합니다. 귀하의 제안에 따라 업데이트되었습니다.
Steven Rumbalski

10000
지나면 초가 빠질

시간은 @diti에게 말할 것이다;)
yǝsʞǝla

8

나는 보통 :

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

# To print now:
print(now)

산출:

2019-01-13 14:40:28

7

모든 datetime.datetime인스턴스에 마이크로 초 구성 요소가있는 것은 아니므로 (즉, 0 일 때) 문자열을 "."로 분할 할 수 있습니다. 항상 작동하는 첫 번째 항목 만 가져옵니다.

unicode(datetime.datetime.now()).partition('.')[0]

3

우리는 아래와 같은 것을 시도 할 수 있습니다

import datetime

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

이것은 .isoformat(' ', 'seconds')이전 답변에서 제안 된 보다 열등합니다 .
davidchambers

1
위의 제안 된 이전 답변을 시도 할 때 오류 >>> datetime.datetime.now (). isoformat ( '', 'seconds') Traceback (가장 최근 호출) : File "<stdin>", line 1의 <모듈> 오류 : isoformat ()는 (주어진 2) 최대 1 인수 얻어
Abhishek 바자

아, 알겠습니다 파이썬 3에서는 작동하지만 파이썬 2에서는 작동하지 않습니다.
davidchambers

파이썬 3.4.3 버전을 사용하고 있는데 그 오류가 발생합니다. >>> datetime.datetime.now (). isoformat ( '', 'seconds') 역 추적 (가장 최근 호출) : <module>의 파일 "<stdin>", 1 행, TypeError : isoformat ()이 최대로 소요됨 1 인수 (2 주어진)
Abhishek Bajaj

1

나는 이것이 가장 간단한 방법이라는 것을 알았다.

>>> 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. 그러나 쉬운 것은 최고가 아닙니다
An0n

1

이것은 내가 이해할 수 있고 더 잘 기억하기 때문에 사용합니다 (그리고 날짜 시간 형식도 원하는대로 사용자 정의 할 수 있습니다) :-

import datetime
moment = datetime.datetime.now()
print("{}/{}/{} {}:{}:{}".format(moment.day, moment.month, moment.year,
                                 moment.hour, moment.minute, moment.second))

훌륭한. 단순하고 유연하며 플랫폼에 독립적입니다 (strftime과 달리).
Endre 두
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.