Python strftime - ngày mà không dẫn 0?


277

Khi sử dụng Python strftime, có cách nào để xóa 0 đầu tiên của ngày nếu trước ngày 10, tức là. nên 011? Không thể tìm thấy một điều %cho điều đó?

Cảm ơn!

Câu trả lời:


567

Trên thực tế tôi đã có cùng một vấn đề và tôi nhận ra rằng, nếu bạn thêm một dấu gạch nối giữa %và chữ cái, bạn có thể loại bỏ số 0 đứng đầu.

Ví dụ %Y/%-m/%-d.

Điều này chỉ hoạt động trên Unix (Linux, OS X), không phải Windows (bao gồm cả Cygwin). Trên Windows, bạn sẽ sử dụng #, vd %Y/%#m/%#d.


11
Thậm chí không hoạt động với tôi, đưa ra một ValueError (windows, python 2.6)
rocketmonkey

14
Nó hoạt động với tôi trên OS X, nhưng tôi đang sử dụng Python 2.7.2 từ python.org.
Tim Swast

13
@moose Tôi đã hỏi một câu hỏi về điều này :-) đây là câu trả lời -> stackoverflow.com/questions/28894172/ợi
Mathias

10
Tôi nhận được ValueError: '-' is a bad directive in format '%b %-d, %Y'. OSX, Python 2.7.
Richard

8
%#dsẽ làm tương tự trên Windows
dalle

190

Chúng ta có thể thực hiện loại điều này với sự ra đời của formatphương thức kể từ python2.6:

>>> import datetime
>>> '{dt.year}/{dt.month}/{dt.day}'.format(dt = datetime.datetime.now())
'2013/4/19'

Mặc dù có lẽ vượt quá phạm vi của câu hỏi ban đầu, đối với các định dạng thú vị hơn, bạn có thể thực hiện các công cụ như:

>>> '{dt:%A} {dt:%B} {dt.day}, {dt.year}'.format(dt=datetime.datetime.now())
'Wednesday December 3, 2014'

Và kể từ python3.6, điều này có thể được biểu thị dưới dạng một chuỗi được định dạng nội tuyến :

Python 3.6.0a2 (v3.6.0a2:378893423552, Jun 13 2016, 14:44:21) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> dt = datetime.datetime.now()
>>> f'{dt:%A} {dt:%B} {dt.day}, {dt.year}'
'Monday August 29, 2016'

2
Rất đẹp! Thật không may, không hoạt động một mình nếu bạn muốn sử dụng biểu diễn văn bản như time.strftime('%A %B %d, %Y'), điều này mang lại (bây giờ, trên ngôn ngữ tiếng Anh) Tuesday October 07, 2014.
Pekka Klärck

@ PekkaKlärck - Một số lý do tôi đã không nhận thấy bình luận của bạn cho đến bây giờ. Hóa ra datetime chỉ định một __format__hook rất thú vị cho phép bạn viết những thứ như thế.
mgilson

2
Một vấn đề là '{dt.hour}'sử dụng đồng hồ 24 giờ :(. Sử dụng tùy chọn thứ hai vẫn đưa bạn quay lại sử dụng '{%#I}'trên Windows và '{%-I}'trên Unix.
ubomb

Điểm tốt. Tôi không bao giờ sử dụng các biểu diễn đồng hồ 12 giờ trong mã, vì vậy tôi đã không nghĩ về trường hợp đó.
mgilson

Tôi khuyên bạn nên xem tài liệu bổ sung này về chức năng định dạng: pyformat.info
Đánh dấu

37

Một số nền tảng có thể hỗ trợ thông số kỹ thuật về độ rộng và độ chính xác giữa %và chữ cái (chẳng hạn như 'd' cho ngày trong tháng), theo http://docs.python.org/l Library / time.html - nhưng chắc chắn là không thể di động giải pháp (ví dụ: không hoạt động trên máy Mac của tôi ;-). Có lẽ bạn có thể sử dụng một chuỗi thay thế (hoặc RE, cho định dạng thực sự khó chịu) sau khi strftimekhắc phục điều đó? ví dụ:

>>> y
(2009, 5, 7, 17, 17, 17, 3, 127, 1)
>>> time.strftime('%Y %m %d', y)
'2009 05 07'
>>> time.strftime('%Y %m %d', y).replace(' 0', ' ')
'2009 5 7'

@guneysus có nghĩa là gì? Nó sẽ dẫn đến 'ngày 1 tháng 1 năm 2000'
Người dùng

6
@User Đoạn mã trên kiểm tra một khoảng trống trước 0 mà trong trường hợp "01 tháng 1 năm 2000" không có mặt.
Alagappan Ramu

@alex Hãy xóa câu trả lời này, như bạn có thể biết, đó là một câu trả lời đúng.
CONvid19

29

Dưới đây là tài liệu về các công cụ sửa đổi được hỗ trợ strftime()trong thư viện GNU C. (Giống như mọi người đã nói trước đây, nó có thể không di động.) Điều bạn quan tâm có thể là:

  • %ethay vì %dsẽ thay thế số 0 đứng đầu trong ngày bằng một khoảng trắng

Nó hoạt động trên Python của tôi (trên Linux). Tôi không biết nếu nó sẽ làm việc trên của bạn.


3
% e thất bại với tôi trên Windows w / Python 2.6. Tôi đoán nó * nix cụ thể. Quá tệ :(
lửa

1
Đây là giải pháp sạch nhất, tổng quát nhất --- trên hệ thống * nix, ít nhất. Điều này hoạt động trên OS X.
BFTM

Giống như %-d ở trên , điều này hoạt động trong OS X 10.8.5 với Python 2.7.2, nhưng không phải trong Windows 7 Pro 64-bit với Python 2.7.3.
Johan

1
Điều này làm việc cho tôi trên Windows 7 SP1 với Python 3.5.1.
Neil Billingham

1
Điều này đã giới thiệu một không gian bổ sung thay vì số 0 đứng đầu, vì vậy nếu bạn đang tìm kiếm một kết hợp chính xác thì đây có thể không phải là nó. >>> one = datetime.datetime (2019, 5, 1, 23, 28, 48, 175214) >>> one.strftime ('% b% e% H') '1 tháng 1 23' >>> eleven = datetime .datetime (2019, 5, 11, 23, 28, 48, 175214) >>> eleven.strftime ('% b% e% H')
'11

28
>>> import datetime
>>> d = datetime.datetime.now()
>>> d.strftime('X%d/X%m/%Y').replace('X0','X').replace('X','')
'5/5/2011'

1
Điều này hoạt động ngày 1 tháng 1 năm 2000, Alexs không hoạt động.
guneysus

Quan điểm của việc làm là gì .replace('X0','X').replace('X','')? Chỉ cần làm .replace('X0', '')và nó sẽ tốt.
Marco Bonelli

2
@MarcoBonelli: Hãy thử đề xuất của bạn về chuỗi "X12 / X12 / 14" và bạn sẽ thấy.
gdw2

1
Đây là hack, nhưng nó là hack pythonic.
Josh M.


17

đến bữa tiệc khá muộn nhưng %-dkết thúc tốt đẹp

datetime.now().strftime('%B %-d, %Y')sản xuất một cái gì đó như "ngày 5 tháng 11 năm 2014"

chúc mừng :)


1
trùng lặp câu trả lời hàng đầu? stackoverflow.com/a/2073189/389812
gdw2

2
ValueError: Invalid format stringtrong hệ thống Windows của tôi.
De Khánh

10

Tôi thấy bộ lọc định dạng ngày mẫu Django rất nhanh chóng và dễ dàng. Nó loại bỏ các số không hàng đầu. Nếu bạn không phiền khi nhập mô-đun Django, hãy kiểm tra nó.

http://docs.djangoproject.com/en/dev/ref/temsheet/builtins/#date

from django.template.defaultfilters import date as django_date_filter
print django_date_filter(mydate, 'P, D M j, Y')    

Lưu ý rằng nếu bạn giống tôi và bạn không xây dựng ứng dụng của mình trong django, bạn sẽ cần nói với django rằng bạn không cần định cấu hình nó:import django.conf django.conf.settings.configure()
Alex Pretzlav

8

Hãy nhìn vào -dưới đây:

>>> from datetime import datetime
>>> datetime.now().strftime('%d-%b-%Y')
>>> '08-Oct-2011'
>>> datetime.now().strftime('%-d-%b-%Y')
>>> '8-Oct-2011'
>>> today = datetime.date.today()
>>> today.strftime('%d-%b-%Y')
>>> print(today)

Hoạt động hoàn hảo trong python 3
Saurabh

Đây phải là câu trả lời được chấp nhận. Liệu những gì được hỏi, siêu đơn giản và dễ nhớ. Duyệt nhanh qua các tài liệu tôi không thể tìm thấy thông tin này.
Lucas Lima

1
"Đây phải là câu trả lời được chấp nhận". Không, không nên, vì điều này chỉ hoạt động trên Linux.
dùng136036

3

Để %dbạn có thể chuyển đổi thành số nguyên bằng cách int()đó, nó sẽ tự động xóa số 0 đứng đầu và trở thành số nguyên. Sau đó, bạn có thể chuyển đổi trở lại chuỗi bằng cách sử dụng str().


2
Câu hỏi của OP là về một giải pháp sử dụng một công cụ xác định định dạng trong một cuộc gọi đến strftime, chứ không phải là một giải pháp của riêng bạn liên quan đến str ()
Dave Hooper

câu trả lời tuyệt vời, đừng nghe dave hooper
Toskan

3

chỉ cần sử dụng replacenhư thế này:

(datetime.date.now()).strftime("%Y/%m/%d").replace("/0", "/")

nó sẽ xuất ra:

'2017/7/21'

3

sử dụng, ví dụ: "% -d" không khả dụng ngay cả giữa các phiên bản khác nhau của cùng một hệ điều hành. Một giải pháp tốt hơn sẽ là trích xuất từng thành phần ngày và chọn giữa các toán tử định dạng cụ thể ngày và truy cập thuộc tính ngày cho từng thành phần.

e = datetime.date(2014, 1, 6)
"{date:%A} {date.day} {date:%B}{date.year}".format(date=e)

2

Vì Python thực sự chỉ gọi strftime(3)hàm ngôn ngữ C trên nền tảng của bạn, nên có thể có các ký tự định dạng bạn có thể sử dụng để kiểm soát số 0 đứng đầu; Hãy thử man strftimevà xem. Nhưng, tất nhiên, kết quả sẽ không khả chuyển, vì hướng dẫn Python sẽ nhắc nhở bạn. :-)

Tôi sẽ cố gắng sử dụng một phong cách mới datetimeđối tượng thay vào đó, trong đó có các thuộc tính như t.yeart.montht.day, và đưa những người thông qua việc bình thường, cao-powered định dạng của %nhà điều hành, mà không kiểm soát hỗ trợ hàng đầu zero. Xem http://docs.python.org/l Library / datetime.html để biết chi tiết. Tốt hơn nữa, hãy sử dụng "".format()toán tử nếu Python của bạn có nó và thậm chí còn hiện đại hơn; nó có rất nhiều tùy chọn định dạng cho số. Xem: http://docs.python.org/l Library / chuỗi.html # String-format .


2

Dựa trên phương pháp của Alex, cách này sẽ hoạt động cho cả trường hợp bắt đầu chuỗi và sau khoảng trắng:

re.sub('^0|(?<= )0', '', "01 January 2000 08:00am")

Tôi thích điều này tốt hơn .format hoặc% -d vì đây là nền tảng chéo và cho phép tôi tiếp tục sử dụng strftime (để có được những thứ như "tháng 11" và "thứ hai").


1

Câu hỏi cũ, nhưng% l (chữ thường L) hoạt động cho tôi trong các lần thoát: mặc dù điều này có thể không hiệu quả với tất cả mọi người, vì nó không được liệt kê trong tài liệu Python tôi tìm thấy


1
import datetime
now = datetime.datetime.now()
print now.strftime("%b %_d")

Điều này thay thế số 0 đứng đầu bằng một khoảng trắng, đó không phải là điều OP yêu cầu
Dave Hooper

ValueError: '_' is a bad directive in format '%a %b %_d %H:%M:%S %Y'sử dụng python 3.5
ji-ruh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.