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


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.