Вопрос-Ответ

How to print a date in a regular format?

Как напечатать дату в обычном формате?

Это мой код:

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

Это выводит: 2008-11-22 это именно то, что я хочу.

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

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

Это печатает [datetime.date(2008, 11, 22)]. Как я могу получить простую дату, например 2008-11-22?

Переведено автоматически
Ответ 1

ПОЧЕМУ: даты - это объекты

В 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().

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

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

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

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

Например, вы хотите напечатать все даты в списке :

for date in mylist :
print str(date)

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

Практический пример использования вашего кода

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() ожидает строковый шаблон, объясняющий, как вы хотите отформатировать свою дату.

Например :

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

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


  • %d это номер дня (2 цифры, при необходимости с префиксом перед нулем)

  • %m это номер месяца (2 цифры, при необходимости с префиксом перед нулем)

  • %b это аббревиатура месяца (3 буквы)

  • %B полное ли название месяца (буквами)

  • %y сокращен ли номер года (последние 2 цифры)

  • %Y является ли номер года полным (4 цифры)

и др.

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

Начиная с PEP3101, каждый объект может иметь свой собственный формат, автоматически используемый методом format любой строки. В случае datetime формат тот же, что используется в 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 (Stack Overflow) ;-)

Ответ 2
import datetime
print datetime.datetime.now().strftime("%Y-%m-%d %H:%M")

Редактировать:

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

import time
print time.strftime("%Y-%m-%d %H:%M")
Ответ 3

Все объекты 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.

Это то, что мы можем сделать с модулями datetime и time в 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
Ответ 4

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

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

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

При этом учитывается локаль. (сделайте это)

some_date.strftime('%c')
python datetime