Как напечатать дату в обычном формате? - PullRequest
604 голосов
/ 22 ноября 2008

Это мой код:

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

Это печатает: 2008-11-22 это именно то, что я хочу.

Но у меня есть список, к которому я добавляю это, и затем вдруг все становится "вялым". Вот код:

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

Это печатает следующее:

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

Как я могу получить просто простое свидание, как 2008-11-22?

Ответы [ 21 ]

876 голосов
/ 22 ноября 2008

ПОЧЕМУ: даты являются объектами

В Python даты - это объекты. Поэтому, когда вы манипулируете ими, вы манипулируете объектами, а не строками, ни временными метками, ни чем-либо еще.

Любой объект в Python имеет ДВА строковых представления:

  • Обычное представление, используемое «print», можно получить с помощью функции str(). В большинстве случаев это самый распространенный читаемый формат, используемый для облегчения отображения. Так что str(datetime.datetime(2008, 11, 22, 19, 53, 42)) дает вам '2008-11-22 19:53:42'.

  • Альтернативное представление, которое используется для представления природы объекта (в виде данных). Его можно получить с помощью функции repr() и удобно знать, какими данными вы манипулируете во время разработки или отладки. repr(datetime.datetime(2008, 11, 22, 19, 53, 42)) дает вам 'datetime.datetime(2008, 11, 22, 19, 53, 42)'.

Случилось так, что когда вы печатали дату, используя «print», она использовала str(), чтобы вы могли видеть красивую строку даты. Но когда вы напечатали mylist, вы напечатали список объектов, и Python попытался представить набор данных, используя repr().

Как: что вы хотите с этим делать?

Хорошо, когда вы манипулируете датами, продолжайте все время использовать объекты даты. Они получили тысячи полезных методов, и большинство API Python ожидают, что даты будут объектами.

Если вы хотите отобразить их, просто используйте str(). В Python хорошей практикой является явное приведение всех. Поэтому, когда пришло время печатать, получите строковое представление вашей даты, используя str(date).

И последнее. Когда вы пытались напечатать даты, вы напечатали mylist. Если вы хотите напечатать дату, вы должны напечатать объекты даты, а не их контейнер (список).

E.G, вы хотите напечатать всю дату в списке:

for date in mylist :
    print str(date)

Обратите внимание, что в данном конкретном случае , вы даже можете опустить str(), потому что печать будет использовать его для вас. Но это не должно стать привычкой: -)

Практический кейс, используя ваш код

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

Расширенное форматирование даты

Даты имеют представление по умолчанию, но вы можете распечатать их в определенном формате. В этом случае вы можете получить пользовательское строковое представление, используя метод strftime().

strftime() ожидает строковый шаблон, объясняющий, как вы хотите отформатировать дату.

E.G:

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

Все буквы после "%" представляют формат для чего-то:

  • %d номер дня
  • %m - номер месяца
  • %b - сокращение месяца
  • %y - это последние две цифры года
  • %Y весь год

и т.д.

Посмотрите официальную документацию или Краткий справочник Маккатчена , вы не можете знать их все.

Начиная с PEP3101 , каждый объект может иметь свой собственный формат, автоматически используемый форматом метода любой строки. В случае даты и времени формат тот же, что и в STRFTIME. Таким образом, вы можете сделать то же, что и выше, как это:

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

Преимущество этой формы в том, что вы также можете конвертировать другие объекты одновременно.
С введением отформатированных строковых литералов (начиная с Python 3.6, 2016-12-23) это можно записать как

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

Локализация

Даты могут автоматически адаптироваться к местному языку и культуре, если вы используете их правильно, но это немного сложно. Может быть, для другого вопроса о SO (переполнение стека); -)

300 голосов
/ 14 января 2013
import datetime
print datetime.datetime.now().strftime("%Y-%m-%d %H:%M")

Edit:

После предложения Cees я тоже начал использовать время:

import time
print time.strftime("%Y-%m-%d %H:%M")
141 голосов
/ 22 сентября 2013

Объекты date, datetime и time поддерживают метод strftime (format), создать строку, представляющую время под контролем явного формата строка.

Вот список кодов формата с их указанием и значением.

    %a  Locale’s abbreviated weekday name.
    %A  Locale’s full weekday name.      
    %b  Locale’s abbreviated month name.     
    %B  Locale’s full month name.
    %c  Locale’s 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  Locale’s 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  Locale’s appropriate date representation.    
    %X  Locale’s 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.

Это то, что мы можем сделать с модулями даты и времени в 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")

Это выведет что-то вроде этого:

    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
69 голосов
/ 22 ноября 2008

Использовать date.strftime. Аргументы форматирования описаны в документации .

Это то, что вы хотели:

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

Это учитывает локаль. (сделай это)

some_date.strftime('%c')
32 голосов
/ 19 ноября 2013

Это короче:

>>> import time
>>> time.strftime("%Y-%m-%d %H:%M")
'2013-11-19 09:38'
24 голосов
/ 06 октября 2016
# 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)

OUTPUT

2016-10-06 01:21:34 PM
06 October 2016 01:21:34 PM
2016-10-06 13:21:34
21 голосов
/ 26 декабря 2013

Или даже

from datetime import datetime, date

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

Out: 25.12.2013

или

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

Out: «Сегодня - 25.12.2013»

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

Выход: «Среда»

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

Out: '__main ____ 2014.06.09__16-56.log'

10 голосов
/ 01 февраля 2015

Простой ответ -

datetime.date.today().isoformat()
7 голосов
/ 15 июня 2017

С типоспецифичным datetime форматированием строки (см. ответ nk9 с использованием str.format().) В Форматированный строковый литерал (начиная с Python 3.6, 2016-12-23):

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

Директивы формата даты / времени не документированы как часть синтаксиса строки формата , а скорее в date, datetime и time * strftime() документация. Они основаны на стандарте C 1989 года, но включают некоторые директивы ISO 8601 начиная с Python 3.6.

3 голосов
/ 22 ноября 2008

Вам необходимо преобразовать объект даты и времени в строку.

У меня работал следующий код:

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

Дайте мне знать, если вам понадобится дополнительная помощь.

...