Định dạng ngày giờ trong Python mà không có dấu đệm 0


90

Có định dạng nào để in lịch ngày tháng trong Python không sử dụng dấu đệm không trên ngày và giờ không?

Định dạng hiện tôi đang sử dụng:

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

Kết quả: 29/02/2012 05:03 PM
Mong muốn: 29/02/2012 5:03 PM

Định dạng nào sẽ đại diện cho tháng là '2' thay vì '02' và thời gian là '5:03 PM' thay vì '05: 03PM '

Câu trả lời:


77

Các tùy chọn định dạng có sẵn với datetime.strftime()tất cả sẽ là zero-pad. Tất nhiên, bạn có thể cuộn chức năng định dạng của riêng mình, nhưng giải pháp dễ nhất trong trường hợp này có thể là xử lý sau kết quả của datetime.strftime():

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

1
Sven- Bởi vì tôi muốn giống Facebook. Cảm ơn!
Yarin

4
Rất ít người sử dụng giờ không đệm ở Bắc Mỹ khi viết giờ bằng tay.
Eric Walker

2
Điều này sẽ không còn là số không vào ngày trong tháng chứ?
Judge Maygarden

1
@JudgeMaygarden: Đó là lý do tại sao giải pháp .lstrip("0")để loại bỏ số 0 ở đầu.
Sven Marnach

1
Tại sao tôi muốn xóa các số 0 trên bàn phím? Bởi vì điều này là sai bởi RFC 2822 , chẳng hạn như trong nguồn cấp dữ liệu podcast.
Vitaly Zdanevich

165

Phương thức thay thế khác để tránh khía cạnh số 0 đứng đầu "tất cả hoặc không" ở trên là đặt dấu trừ trước loại trường:

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

Sau đó là: '4/10/2015 03:00 AM'

Trở thành: '4/10/2015 3:00 AM'

Bạn có thể tùy ý đặt dấu trừ trước ngày nếu muốn.

Chỉnh sửa: Tính năng trừ bắt nguồn từ thư viện GNU C (“glibc”) như được đề cập trong trang chủ Linux strftime trong “Ghi chú Glibc”


49
Câu trả lời tuyệt vời, nhưng chỉ Linux. Không hoạt động trên Windows. stackoverflow.com/questions/10807164/...
ExactaBox

1
Tại sao điều này hoạt động? Tôi không thể tìm thấy một tham chiếu đến này trong các tài liệu cho date.__format__hay time.strftime, docs.python.org/3/library/... , và docs.python.org/3.8/library/time.html#time.strftime tương ứng
Amin Shah Gilani

1
@AminShahGilani bài đăng được cập nhật với tham chiếu src
ChrisFreeman

93

Hệ thống định dạng chuỗi mới cung cấp một giải pháp thay thế cho strftime. Nó khá dễ đọc - thực sự, nó có thể tốt hơn strftimetrên tài khoản đó. Chưa kể thực tế là nó không phải là zero-pad:

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

Vì bạn có thể muốn không có phần đệm trong trường phút, bạn có thể làm như sau:

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

Nếu bạn muốn thời gian "thông thường" thay vì thời gian "quân đội", bạn vẫn có thể sử dụng các từ strftimechỉ định tiêu chuẩn . Thuận tiện, vì mục đích của chúng tôi, strftime không cung cấp một mã cho thời gian đệm 12 giờ với một trống thay vì một số không hàng đầu:

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

Điều này trở nên hơi khó đọc hơn, than ôi. Và như @mlissner đã chỉ ra, strftimesẽ không thành công trên một số (tất cả?) Nền tảng vào những ngày trước năm 1900.


1
Nó đã có từ phiên bản python 2.6. (Nó không phải mới.)
gửi

3
Ví dụ: để đánh vần tháng, bạn có thể sử dụng như sau: "{0.day} {0:%B %Y}".format(d)sẽ cho bạn '2 August 2013'là ngày của nhận xét này :)
Jens

2
Điều này thật thú vị, nhưng nó không thực sự trả lời OP, bởi vì anh ấy muốn giờ AM / PM. Tôi sẽ không thực sự phản đối nó, nhưng câu trả lời được chấp nhận thực sự là đúng nếu bạn đang cố lấy định dạng ngày / giờ "kiểu Mỹ" trong python.
Dana Cartwright

Lưu ý rằng kỹ thuật này sử dụng strftime, sẽ không thành công vào những ngày trước năm 1900. Nếu bạn có ngày cũ, bạn sẽ hối tiếc vì điều này.
mlissner

1
giả dối! Tôi chỉ nhận ra vị trí mà tôi không trỏ d đến một đối tượng khác, tôi chỉ chuyển nó như một đối số vị trí.
JacobIRR

50

Câu trả lời được chấp nhận không phải là một giải pháp thích hợp (IMHO) Các phương pháp được tài liệu hóa thích hợp:

Trong Linux, "#" được thay thế bằng "-":

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

Trong Windows, "-" được thay thế bằng "#":

% # 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')

Nguồn: https://msdn.microsoft.com/en-us/library/fe06s4ak.aspx

Như Sagneta đã nêu: Thủ thuật # băm trên Windows chỉ khả dụng cho tệp thực thi gốc python. điều này sẽ không hoạt động đối với triển khai python dựa trên cygwin.


3
Chính xác. Tuy nhiên, lưu ý rằng thủ thuật # băm trên Windows chỉ khả dụng cho các tệp thực thi gốc python. Nói cách khác, điều này sẽ không hoạt động đối với triển khai python dựa trên cygwin.
sagneta

2
Wow điều này thật tuyệt khi biết nhưng tôi kinh hoàng về hậu quả. Tôi đang thử nghiệm định dạng ngày tháng được trả về từ Cơ sở dữ liệu và tôi cần vượt qua định dạng dự kiến ​​cho mỗi lần kiểm tra và điều này làm tăng thêm rất nhiều độ phức tạp.
Keith

10

Câu trả lời hay từ Chris Freeman trên Linux.

Trên cửa sổ, đó là:

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

Nghĩ rằng có thể hữu ích.


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.