제로 패딩이없는 Python 날짜 시간 형식


90

날짜와 시간에 제로 패딩을 사용하지 않는 Python 날짜 시간을 인쇄하는 형식이 있습니까?

지금 사용중인 형식 :

mydatetime.strftime('%m/%d/%Y %I:%M%p')

결과 : 2012 년 2 월 29 일 오후 5시 03 분
희망 : 2012 년 2 월 29 일 오후 5시 3 분

월을 '02'대신 '2'로, 시간을 '05 : 03PM '대신'5:03 PM '으로 나타내는 형식은 무엇입니까?

답변:


77

에서 사용할 수있는 서식 옵션 datetime.strftime()은 모두 제로 패드입니다. 물론 자신의 서식 지정 기능을 롤링 할 수 있지만이 경우 가장 쉬운 해결책은 다음 결과를 후 처리하는 것입니다 datetime.strftime().

s = mydatetime.strftime('%m/%d/%Y %I:%M%p').lstrip("0").replace(" 0", " ")

1
Sven- Facebook처럼 보이고 싶기 때문입니다. 감사!
Yarin 2012 년

4
북미에서 손으로 시간을 쓸 때 제로 패딩 시간을 사용하는 사람은 거의 없습니다.
Eric Walker

2
이 달의 요일은 여전히 ​​제로 패드가 아닐까요?
Maygarden 판사 2014 년

1
@JudgeMaygarden : 이것이 솔루션이 .lstrip("0")선행 0을 제거하는 이유 입니다.
Sven Marnach 2014 년

1
패드 0을 제거해야하는 이유는 무엇입니까? 이것은 팟 캐스트 피드와 같은 RFC 2822에 의해 잘못 되었기 때문 입니다.
Vitaly Zdanevich

165

위의 "전부 또는 없음"선행 0 측면을 방지하는 다른 방법은 필드 유형 앞에 마이너스를 배치하는 것입니다.

mydatetime.strftime('%-m/%d/%Y %-I:%M%p')

다음은 '2015 년 4 월 10 일 03:00 AM'

변경 : '4/10/2015 3:00 AM'

원하는 경우 선택적으로 하루 앞에 마이너스를 배치 할 수 있습니다.

편집 : 빼기 기능은 "Glibc 노트"아래 의 Linux strftime 맨 페이지 에 언급 된 GNU C 라이브러리 ( "glibc")에서 파생됩니다.


48
좋은 대답이지만 Linux에만 해당됩니다. Windows에서는 작동하지 않습니다. stackoverflow.com/questions/10807164/…
ExactaBox

1
왜 이것이 작동합니까? 나는에 대한 문서에서이에 대한 참조를 찾을 수없는 date.__format__time.strftime, docs.python.org/3/library/...을 하고 docs.python.org/3.8/library/time.html#time.strftime 각각
아민 샤 라니

1
@AminShahGilani 게시물이 src 참조로 업데이트되었습니다
ChrisFreeman

93

새로운 문자열 형식화 시스템은 strftime. 꽤 가독성이 좋으며 실제로 strftime그 계정 보다 더 나을 수 있습니다 . 제로 패드가 아니라는 사실은 말할 것도 없습니다.

>>> '{d.month}/{d.day}/{d.year}'.format(d=datetime.datetime.now())
'3/1/2012'

분 필드에 0 채우기를 원할 것이므로 다음과 같이 할 수 있습니다.

>>> '{d.month}/{d.day}/{d.year} {d.hour}:{d.minute:02}'.format(d=now)
'3/1/2012 20:00'

"군사"시간 대신 "정규"시간을 원하는 경우에도 표준 strftime지정자를 사용할 수 있습니다. 편리하게, 우리의 목적을 위해 strftime 수행 하는 대신 0을 선두의 빈과 함께 12 시간의 시간 패딩에 대한 코드를 제공합니다 :

'{d.month}/{d.day}/{d.year} {d:%l}:{d.minute:02}{d:%p}'.format(d=now)
'4/4/2014  6:00PM'

아아, 이것은 다소 가독성이 떨어집니다. 그리고 @mlissner가 지적했듯이 strftime1900 년 이전 날짜의 일부 (모든?) 플랫폼에서 실패합니다.


1
파이썬 2.6부터 사용되었습니다. (그렇지 않아 새.)
senderle

3
예를 들어, 달의 철자를 쓰려면 다음을 사용할 수 있습니다. 이 주석의 날로 "{0.day} {0:%B %Y}".format(d)제공 '2 August 2013'됩니다. :)
Jens

2
이것은 흥미롭지 만 실제로는 오전 / 오후 시간을 원하기 때문에 OP에 응답하지 않습니다. 나는 실제로 그것을 비하하지는 않을 것이지만, 파이썬에서 "미국식"날짜 / 시간 형식을 얻으려고한다면 받아 들여지는 대답은 실제로 옳다.
Dana Cartwright 2014

이 기술은 1900 년 이전의 날짜에는 실패하는 strftime을 사용합니다. 오래된 날짜가 있다면 후회하게 될 것입니다.
mlissner 2016

1
fak! d가 다른 객체를 가리 키지 않고 위치 인수로 전달했습니다.
JacobIRR

50

적절한 해결책이 아닌 수락 된 답변 (IMHO) 적절한 문서화 된 방법 :

Linux에서 "#"은 "-"로 대체됩니다.

% -d, % -H, % -I, % -j, % -m, ​​% -M, % -S, % -U, % -w, % -W, % -y, % -Y

Windows에서 "-"는 "#"로 대체됩니다.

% # d, % # H, % # I, % # j, % # m, % # M, % # S, % # U, % # w, % # W, % # y, % # Y

#Linux
mydatetime.strftime('%-m/%d/%Y %-I:%M%p')

# Windows
mydatetime.strftime('%#m/%d/%Y %#I:%M%p')

출처 : https://msdn.microsoft.com/en-us/library/fe06s4ak.aspx

Sagneta가 언급 한대로 : Windows의 # 해시 트릭은 네이티브 Python 실행 파일에서만 사용할 수 있습니다. 이것은 cygwin 기반 파이썬 구현에서는 작동하지 않습니다.


3
맞습니다. 그러나 Windows의 # 해시 트릭은 네이티브 Python 실행 파일에서만 사용할 수 있습니다. 즉, 이것은 cygwin 기반 파이썬 구현에서는 작동하지 않습니다.
사그 네타

2
와우 알면서도 좋지만 그 결과가 무서워요. 데이터베이스에서 반환 된 날짜 형식을 테스트 중이며 각 테스트에 대해 예상되는 형식을 전달해야하는데 이로 인해 엄청난 복잡성이 추가됩니다.
Keith

10

Linux에서 Chris Freeman의 좋은 답변입니다.

Windows에서는 다음과 같습니다.

mydate.strftime('%#m/%#d/%Y')

도움이 될 거라고 생각했습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.