Làm thế nào để in một ngày trong một định dạng thông thường?


682

Đây là mã của tôi:

import datetime
today = datetime.date.today()
print(today)

Bản in này: 2008-11-22đó chính xác là những gì tôi muốn.

Nhưng, tôi có một danh sách tôi đang thêm nó vào và rồi đột nhiên mọi thứ trở nên "khủng khiếp". Đây là mã:

import datetime
mylist = []
today = datetime.date.today()
mylist.append(today)
print(mylist)

Điều này in như sau:

[datetime.date(2008, 11, 22)]

Làm thế nào tôi có thể có được một ngày đơn giản như thế 2008-11-22nào?


13
Câu trả lời ngắn gọn: Bằng cách áp dụng str()(cho từng yếu tố của danh sách), vì đó chỉ là những gì printngầm làm cho todayđối tượng solo của bạn .
Lutz Prechelt

Câu trả lời:


947

TẠI SAO: ngày là đối tượng

Trong Python, ngày là đối tượng. Do đó, khi bạn thao tác với chúng, bạn thao tác với các đối tượng, không phải chuỗi, không phải dấu thời gian cũng như bất cứ điều gì.

Bất kỳ đối tượng nào trong Python đều có biểu diễn chuỗi TWO:

  • Biểu diễn thông thường được sử dụng bởi "in", có thể được sử dụng str()hàm. Đây là phần lớn định dạng phổ biến nhất của con người và được sử dụng để dễ dàng hiển thị. Vì vậy, str(datetime.datetime(2008, 11, 22, 19, 53, 42))cung cấp cho bạn '2008-11-22 19:53:42'.

  • Biểu diễn thay thế được sử dụng để thể hiện bản chất đối tượng (dưới dạng dữ liệu). Nó có thể được sử dụng repr()chức năng và thuận tiện để biết loại dữ liệu nào bạn thao tác trong khi bạn đang phát triển hoặc gỡ lỗi. repr(datetime.datetime(2008, 11, 22, 19, 53, 42))mang đến cho bạn 'datetime.datetime(2008, 11, 22, 19, 53, 42)'.

Điều gì đã xảy ra là khi bạn đã in ngày bằng cách sử dụng "in", nó được sử dụng str()để bạn có thể thấy một chuỗi ngày đẹp. Nhưng khi bạn đã in mylist, bạn đã in một danh sách các đối tượng và Python đã cố gắng biểu diễn tập dữ liệu bằng cách sử dụng repr().

Làm thế nào: bạn muốn làm gì với điều đó?

Chà, khi bạn thao túng ngày tháng, hãy tiếp tục sử dụng các đối tượng ngày dài. Họ đã nhận được hàng ngàn phương thức hữu ích và hầu hết API Python dự kiến ​​ngày sẽ là đối tượng.

Khi bạn muốn hiển thị chúng, chỉ cần sử dụng str(). Trong Python, thực hành tốt là bỏ tất cả mọi thứ. Vì vậy, ngay khi đến lúc in, hãy lấy một chuỗi đại diện cho ngày của bạn bằng cách sử dụng str(date).

Một điều cuối cùng. Khi bạn cố in ngày, bạn đã in mylist. Nếu bạn muốn in một ngày, bạn phải in các đối tượng ngày, không phải thùng chứa của chúng (danh sách).

EG, bạn muốn in tất cả các ngày trong một danh sách:

for date in mylist :
    print str(date)

Lưu ý rằng trong trường hợp cụ thể đó , bạn thậm chí có thể bỏ qua str()vì in sẽ sử dụng nó cho bạn. Nhưng nó không nên trở thành thói quen :-)

Trường hợp thực tế, sử dụng mã của bạn

import datetime
mylist = []
today = datetime.date.today()
mylist.append(today)
print mylist[0] # print the date object, not the container ;-)
2008-11-22

# It's better to always use str() because :

print "This is a new day : ", mylist[0] # will work
>>> This is a new day : 2008-11-22

print "This is a new day : " + mylist[0] # will crash
>>> cannot concatenate 'str' and 'datetime.date' objects

print "This is a new day : " + str(mylist[0]) 
>>> This is a new day : 2008-11-22

Định dạng ngày nâng cao

Ngày có một đại diện mặc định, nhưng bạn có thể muốn in chúng theo một định dạng cụ thể. Trong trường hợp đó, bạn có thể nhận được một biểu diễn chuỗi tùy chỉnh bằng strftime()phương thức.

strftime() mong đợi một mẫu chuỗi giải thích cách bạn muốn định dạng ngày của bạn.

VÍ DỤ :

print today.strftime('We are the %d, %b %Y')
>>> 'We are the 22, Nov 2008'

Tất cả các chữ cái sau một "%"đại diện cho một định dạng cho một cái gì đó:

  • %d là số ngày
  • %m là số tháng
  • %b là chữ viết tắt của tháng
  • %y là năm cuối cùng của hai chữ số
  • %Y là cả năm

Vân vân

Hãy xem tài liệu chính thức hoặc tài liệu tham khảo nhanh của McCutchen mà bạn không thể biết tất cả.

Kể từ PEP3101 , mọi đối tượng có thể có định dạng riêng được sử dụng tự động theo định dạng phương thức của bất kỳ chuỗi nào. Trong trường hợp của datetime, định dạng tương tự được sử dụng trong strftime Vì vậy, bạn có thể làm tương tự như trên như thế này:

print "We are the {:%d, %b %Y}".format(today)
>>> 'We are the 22, Nov 2008'

Ưu điểm của hình thức này là bạn cũng có thể chuyển đổi các đối tượng khác cùng một lúc.
Với việc giới thiệu các chuỗi ký tự được định dạng (kể từ Python 3.6, 2016-12-23), điều này có thể được viết là

import datetime
f"{datetime.datetime.now():%Y-%m-%d}"
>>> '2017-06-15'

Bản địa hóa

Ngày có thể tự động thích ứng với ngôn ngữ và văn hóa địa phương nếu bạn sử dụng chúng đúng cách, nhưng nó hơi phức tạp. Có thể cho một câu hỏi khác về SO (Stack Overflow) ;-)


3
BTW Hầu như mọi loại dữ liệu trong python là một lớp (ngoại trừ bất biến, nhưng chúng có thể được phân lớp) stackoverflow.com/questions/865911/
Lỗi

1
Bạn có nghĩa là "gần như"? str và int có một thuộc tính lớp , chứa 'loại', do đó có chính chúng là lớp, vì chúng là các thể hiện của siêu dữ liệu kiểu.
e-satis

4
Đây chính xác là câu hỏi về thuật ngữ: type! = Class?, Tức là nó có đủ thuộc tính type (cung cấp cơ chế suy luận kiểu để đủ điều kiện cho một đối tượng) hay thực thể nên hành xử như một đối tượng. Tôi đang cố gắng giải quyết vấn đề này cho bản thân mình ở đây, lập trình
viên.stackexchange.com/questions/164570/iêu

1
Nếu bạn là một thể hiện của một lớp, bạn là một đối tượng. Tại sao bạn cần nó phức tạp hơn?
e-satis

9
Mỗi giá trị trong Python là một đối tượng. Mỗi đối tượng có một loại. "gõ" == "class" chính thức (cũng xem inspect.isclassđể đảm bảo). Mọi người có xu hướng nói "loại" cho phần tích hợp và "lớp" cho phần còn lại, nhưng điều đó không quan trọng
Kos

340
import datetime
print datetime.datetime.now().strftime("%Y-%m-%d %H:%M")

Biên tập:

Sau khi đề xuất Cees, tôi cũng đã bắt đầu sử dụng thời gian:

import time
print time.strftime("%Y-%m-%d %H:%M")

6
datetime.datetime?
Cees Timmerman

2
Bạn có thể sử dụng từ datetime import datetime, và sau đó print datetime().now().strftime("%Y-%m-%d %H:%M"). Chỉ có một sự khác biệt cú pháp.
Daniel Magnusson

7
from datetime import date; date.today().strftime("%Y-%m-%d")vẫn có vẻ không đẹp đối với tôi, nhưng đó là thứ tốt nhất mà không có import time. Tôi nghĩ rằng mô-đun datetime là dành cho toán học ngày.
Cees Timmerman

2
yêu thích của tôi là from datetime import datetime as dtvà bây giờ chúng ta có thể chơi vớidt.now()
diewland

164

Tất cả các đối tượng ngày, thời gian và thời gian đều hỗ trợ phương thức strftime (format), để tạo một chuỗi biểu thị thời gian dưới sự kiểm soát của chuỗi định dạng rõ ràng.

Dưới đây là danh sách các mã định dạng với chỉ thị và ý nghĩa của chúng.

    %a  Locales abbreviated weekday name.
    %A  Locales full weekday name.      
    %b  Locales abbreviated month name.     
    %B  Locales full month name.
    %c  Locales appropriate date and time representation.   
    %d  Day of the month as a decimal number [01,31].    
    %f  Microsecond as a decimal number [0,999999], zero-padded on the left
    %H  Hour (24-hour clock) as a decimal number [00,23].    
    %I  Hour (12-hour clock) as a decimal number [01,12].    
    %j  Day of the year as a decimal number [001,366].   
    %m  Month as a decimal number [01,12].   
    %M  Minute as a decimal number [00,59].      
    %p  Locales equivalent of either AM or PM.
    %S  Second as a decimal number [00,61].
    %U  Week number of the year (Sunday as the first day of the week)
    %w  Weekday as a decimal number [0(Sunday),6].   
    %W  Week number of the year (Monday as the first day of the week)
    %x  Locales appropriate date representation.    
    %X  Locales appropriate time representation.    
    %y  Year without century as a decimal number [00,99].    
    %Y  Year with century as a decimal number.   
    %z  UTC offset in the form +HHMM or -HHMM.
    %Z  Time zone name (empty string if the object is naive).    
    %%  A literal '%' character.

Đây là những gì chúng ta có thể làm với các mô đun thời gian và thời gian trong Python

    import time
    import datetime

    print "Time in seconds since the epoch: %s" %time.time()
    print "Current date and time: ", datetime.datetime.now()
    print "Or like this: ", datetime.datetime.now().strftime("%y-%m-%d-%H-%M")


    print "Current year: ", datetime.date.today().strftime("%Y")
    print "Month of year: ", datetime.date.today().strftime("%B")
    print "Week number of the year: ", datetime.date.today().strftime("%W")
    print "Weekday of the week: ", datetime.date.today().strftime("%w")
    print "Day of year: ", datetime.date.today().strftime("%j")
    print "Day of the month : ", datetime.date.today().strftime("%d")
    print "Day of week: ", datetime.date.today().strftime("%A")

Điều đó sẽ in ra một cái gì đó như thế này:

    Time in seconds since the epoch:    1349271346.46
    Current date and time:              2012-10-03 15:35:46.461491
    Or like this:                       12-10-03-15-35
    Current year:                       2012
    Month of year:                      October
    Week number of the year:            40
    Weekday of the week:                3
    Day of year:                        277
    Day of the month :                  03
    Day of week:                        Wednesday

1
Điều này đã giải quyết vấn đề của tôi khi "câu trả lời nhiều hơn" không có. Nhưng vấn đề của tôi khác với OP. Tôi muốn tháng được in dưới dạng văn bản ("Tháng hai" thay vì "2")
Nathan

73

Sử dụng date.strftime. Các đối số định dạng được mô tả trong tài liệu .

Đây là những gì bạn muốn:

some_date.strftime('%Y-%m-%d')

Điều này đưa Locale vào tài khoản. (làm cái này)

some_date.strftime('%c')

36

Cái này ngắn hơn:

>>> import time
>>> time.strftime("%Y-%m-%d %H:%M")
'2013-11-19 09:38'

26
# convert date time to regular format.

d_date = datetime.datetime.now()
reg_format_date = d_date.strftime("%Y-%m-%d %I:%M:%S %p")
print(reg_format_date)

# some other date formats.
reg_format_date = d_date.strftime("%d %B %Y %I:%M:%S %p")
print(reg_format_date)
reg_format_date = d_date.strftime("%Y-%m-%d %H:%M:%S")
print(reg_format_date)

ĐẦU RA

2016-10-06 01:21:34 PM
06 October 2016 01:21:34 PM
2016-10-06 13:21:34

25

Hoặc thậm chí

from datetime import datetime, date

"{:%d.%m.%Y}".format(datetime.now())

Hết: '25 .12.2013

hoặc là

"{} - {:%d.%m.%Y}".format("Today", datetime.now())

Hết: 'Hôm nay - 25.12.2013'

"{:%A}".format(date.today())

Hết: 'Thứ tư'

'{}__{:%Y.%m.%d__%H-%M}.log'.format(__name__, datetime.now())

Hết: '__main ____ 2014,06,0__16-56.log'



8

Với datetimeđịnh dạng chuỗi cụ thể theo loại (xem câu trả lời của nk9 bằng cách sử dụng str.format().) Trong một chuỗi ký tự được định dạng (kể từ Python 3.6, 2016-12-23):

>>> import datetime
>>> f"{datetime.datetime.now():%Y-%m-%d}"
'2017-06-15'

Các chỉ thị định dạng ngày / giờ không được ghi thành một phần của Cú pháp chuỗi định dạng mà là trong date, datetimetime's strftime()tài liệu. Chúng dựa trên Tiêu chuẩn C năm 1989, nhưng bao gồm một số chỉ thị ISO 8601 kể từ Python 3.6.


Lưu ý rằng tôi cũng đã thêm thông tin này vào câu trả lời được chấp nhận .
xử lý

strftime không thực sự bao gồm một "đầu ra ISO 8601". Có "chỉ thị", nhưng chỉ dành cho các mã thông báo cụ thể như "ngày trong tuần", không phải toàn bộ dấu thời gian ISO 8601, điều mà tôi luôn thấy khó chịu.
Anarcat

5

Bạn cần chuyển đổi đối tượng thời gian ngày thành một chuỗi.

Các mã sau đây làm việc cho tôi:

import datetime
collection = []
dateTimeString = str(datetime.date.today())
collection.append(dateTimeString)
print collection

Hãy cho tôi biết nếu bạn cần thêm sự giúp đỡ.


3
Nào ! Đừng khuyến khích người mới lưu trữ một chuỗi thay vì một đối tượng ngày. Anh ta sẽ không thể biết khi nào đó là một ý tưởng tốt hay xấu ...
e-satis

e-satis: Nếu tất cả những gì bạn cần là một chuỗi, thì vấn đề lớn là gì? Chúng tôi lưu trữ ngày xây dựng chương trình cơ sở của chúng tôi dưới dạng chuỗi mọi lúc - đôi khi lưu trữ toàn bộ một đối tượng là quá mức khi tất cả những gì bạn cần là dấu thời gian đơn giản (YAGNI và tất cả).
HanClinto

3
Vâng, trong trường hợp chắc chắn đó là. Tôi chỉ có nghĩa là chỉ là một người mới sẽ không thể xác định những trường hợp này. Vì vậy, hãy bắt đầu với chân phải :-)
e-satis


3

Tôi ghét ý tưởng nhập quá nhiều mô-đun cho thuận tiện. Tôi thà làm việc với mô-đun có sẵn mà trong trường hợp này là datetimethay vì gọi một mô-đun mới time.

>>> a = datetime.datetime(2015, 04, 01, 11, 23, 22)
>>> a.strftime('%Y-%m-%d %H:%M')
'2015-04-01 11:23'

1
Tôi nghĩ sẽ hiệu quả hơn khi thực hiện điều đó trong một dòng mã bằng cách thực hiệna = datetime.datetime(2015, 04, 01, 23, 22).strftime('%Y-%m-%d %H:%M)
Dorian Dore

3

Xem xét thực tế bạn yêu cầu một cái gì đó đơn giản để làm những gì bạn muốn, bạn có thể chỉ cần:

import datetime
str(datetime.date.today())

3

Đối với những người muốn ngày dựa trên địa phương và không bao gồm thời gian, sử dụng:

>>> some_date.strftime('%x')
07/11/2019

2

Bạn có thể muốn nối nó như một chuỗi?

import datetime 
mylist = [] 
today = str(datetime.date.today())
mylist.append(today) 
print mylist

2

print todaytrả về những gì bạn muốn, điều này có nghĩa là __str__hàm của đối tượng ngày hôm nay trả về chuỗi bạn đang tìm kiếm.

Vì vậy, bạn có thể làm mylist.append(today.__str__())như là tốt.


1

Bạn có thể sử dụng easy_date để làm cho nó dễ dàng:

import date_converter
my_date = date_converter.date_to_string(today, '%Y-%m-%d')

1

Từ chối trách nhiệm nhanh chóng cho câu trả lời của tôi - Tôi mới chỉ học Python được khoảng 2 tuần, vì vậy tôi không có nghĩa là một chuyên gia; do đó, lời giải thích của tôi có thể không phải là tốt nhất và tôi có thể sử dụng thuật ngữ không chính xác. Dù sao, ở đây nó đi.

Tôi nhận thấy trong mã của bạn rằng khi bạn khai báo biến của mình, today = datetime.date.today()bạn đã chọn đặt tên cho biến của mình bằng tên của hàm tích hợp.

Khi dòng mã tiếp theo của mylist.append(today)bạn nối thêm danh sách của bạn, nó sẽ nối toàn bộ chuỗi datetime.date.today()mà trước đây bạn đã đặt làm giá trị của todaybiến của mình , thay vì chỉ nối thêm today().

Một giải pháp đơn giản, mặc dù có thể không phải hầu hết các lập trình viên sẽ sử dụng khi làm việc với mô đun datetime, là thay đổi tên của biến của bạn.

Đây là những gì tôi đã thử:

import datetime
mylist = []
present = datetime.date.today()
mylist.append(present)
print present

và nó in yyyy-mm-dd.


1

Dưới đây là cách hiển thị ngày dưới dạng (năm / tháng / ngày):

from datetime import datetime
now = datetime.now()

print '%s/%s/%s' % (now.year, now.month, now.day)

1
from datetime import date
def time-format():
  return str(date.today())
print (time-format())

cái này sẽ in 6-23-2018 nếu đó là những gì bạn muốn :)


-1
import datetime
import time

months = ["Unknown","January","Febuary","Marchh","April","May","June","July","August","September","October","November","December"]
datetimeWrite = (time.strftime("%d-%m-%Y "))
date = time.strftime("%d")
month= time.strftime("%m")
choices = {'01': 'Jan', '02':'Feb','03':'Mar','04':'Apr','05':'May','06': 'Jun','07':'Jul','08':'Aug','09':'Sep','10':'Oct','11':'Nov','12':'Dec'}
result = choices.get(month, 'default')
year = time.strftime("%Y")
Date = date+"-"+result+"-"+year
print Date

Bằng cách này, bạn có thể nhận được Ngày được định dạng như ví dụ này: 22-tháng 6 năm 2017


1
Quá nhiều mã cho một cái gì đó bạn có thể nhận được trong một dòng. Với %bbạn sẽ nhận được ba từ đầu tiên, và với %Bcả tháng. Ví dụ: datetime.datetime.now().strftime("%Y-%b-%d %H:%M:%S")sẽ trở lại '2018-Oct-04 09:44:08'
Víctor López

-1

Tôi không hiểu đầy đủ nhưng, có thể sử dụng pandasđể nhận được thời gian ở định dạng đúng:

>>> import pandas as pd
>>> pd.to_datetime('now')
Timestamp('2018-10-07 06:03:30')
>>> print(pd.to_datetime('now'))
2018-10-07 06:03:47
>>> pd.to_datetime('now').date()
datetime.date(2018, 10, 7)
>>> print(pd.to_datetime('now').date())
2018-10-07
>>> 

Và:

>>> l=[]
>>> l.append(pd.to_datetime('now').date())
>>> l
[datetime.date(2018, 10, 7)]
>>> map(str,l)
<map object at 0x0000005F67CCDF98>
>>> list(map(str,l))
['2018-10-07']

Nhưng đó là lưu trữ chuỗi nhưng dễ dàng chuyển đổi:

>>> l=list(map(str,l))
>>> list(map(pd.to_datetime,l))
[Timestamp('2018-10-07 00:00:00')]

4
Toàn bộ phụ thuộc để làm một cái gì đó thư viện std python có phương pháp để làm gì?
Hejazzman
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.