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

Это мой код:

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?

Краткий ответ: Применяя str() (к каждому элементу списка), потому что это именно то, что print неявно сделал с вашим соло-объектом today.
Lutz Prechelt 23.02.2016 19:33
stackoverflow.com/a/39890902/1900645
Waqas Ali 17.10.2016 13:50
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
728
2
1 423 560
22
Перейти к ответу Данный вопрос помечен как решенный

Ответы 22

Вам необходимо преобразовать объект datetime в str.

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

import datetime

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

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

Ну давай же ! Не поощряйте новичка хранить строку вместо объекта даты. Он не сможет понять, хорошая это идея или плохая ...

e-satis 22.11.2008 22:17

e-satis: Если все, что вам нужно, это веревка, в чем дело? Мы все время храним даты сборки прошивки в виде строк - иногда хранение всего объекта является излишним, когда все, что вам нужно, это простая временная метка (YAGNI и все такое).

HanClinto 22.11.2008 22:58

Да, в некоторых случаях это так. Я просто имею в виду, что новичок не сможет идентифицировать эти случаи. Итак, начнем с правой ноги :-)

e-satis 23.11.2008 21:25

Вы можете добавить его в виде строки?

import datetime

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

print(mylist)

Ты можешь сделать:

mylist.append(str(today))

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

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

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

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

some_date.strftime('%c')
Ответ принят как подходящий

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

В 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. Если вы хотите напечатать дату, вы должны распечатать объекты даты, а не их контейнер (список).

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

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

Кстати, почти каждый тип данных в python - это класс (кроме неизменяемых, но они могут быть подклассами) stackoverflow.com/questions/865911/…

Yauhen Yakimovich 12.09.2012 03:42

Что значит «почти»? str и int имеют атрибут класс, который содержит «тип», поэтому существует сам класс, поскольку они являются экземплярами метакласса типа.

e-satis 12.09.2012 12:41

Это как раз вопрос терминологии: type! = Class ?, т.е. достаточно ли иметь атрибут типа (предоставить механизм вывода типа для квалификации объекта) или сущность должна вести себя как объект. Я пытаюсь решить это для себя здесь programmers.stackexchange.com/questions/164570/…

Yauhen Yakimovich 12.09.2012 14:44

Если вы являетесь экземпляром класса, вы являетесь объектом. Зачем нужно усложнять?

e-satis 12.09.2012 14:52

Чтобы понять, как Python реализует парадигму объектно-ориентированного программирования. Конечно, самое интересное в программировании на Python - вам даже не нужно знать, что дата является объектом или что такое ООП - вы можете просто написать фрагмент кода и быть довольным тем, что он работает. Я думаю, задавая вопрос "что такое объект?" приводит к теории обучения. Я не думаю, что есть гарантия, что ООП улучшит навыки программирования - это только теоретический аспект, который в конечном итоге может. Например. зная, что можно реализовать / достичь OO-поведения без вывода типа (a = 1; issubclass (type (a), int) выводит тип), круто.

Yauhen Yakimovich 12.09.2012 15:10

Каждое значение в Python - это объект. У каждого объекта есть тип. "тип" == "класс" формально (также см. inspect.isclass, чтобы убедиться). Люди обычно говорят "тип" для встроенных модулей и "класс" для остальных, но это не важно.

Kos 16.03.2013 17:11

Я думаю, что раздел PEP3101 следует переместить ближе к началу, а примеры, включая strftime, следует переместить в конец приложения, в котором говорится: «Если вы используете старую версию ...»

ArtOfWarfare 23.02.2016 18:50

Не могли бы вы изменить свой ответ на python-3.x, пожалуйста?

Reinstate C0MMUNiSM 13.12.2019 21:06

Автору этого ответа следует подумать о карьере в обновлении основной документации Python, качество которой является основной причиной такого количества таких вопросов;)

Ed Randall 23.05.2020 12:26

используйте в этом случае: telegram_message = "" "\" <b> Critical_Open: "" "+ f" {datetime.datetime.now ():% Y-% m-% d% H:% M:% S} " + "" "</b> <pre> Порядок" "" + пороговые значения [0] ['name'] + "" "" "" "+ пороговые значения [0] ['описать'] +" "" </pre> <code> больше 10 с </code> \ "" ""

Nikolay Baranenko 05.01.2021 15:22
import datetime
print datetime.datetime.now().strftime("%Y-%m-%d %H:%M")

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

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

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

Можно использовать от datetime import datetime, а потом от print datetime().now().strftime("%Y-%m-%d %H:%M"). Только синтаксическая разница.

Daniel Magnusson 19.11.2013 12:44
from datetime import date; date.today().strftime("%Y-%m-%d") по-прежнему кажется мне непонятным, но без import time это лучший вариант. Я думаю, что модуль datetime предназначен для математики даты.
Cees Timmerman 19.11.2013 13:01

мой любимый - from datetime import datetime as dt, и теперь мы можем играть с dt.now().

diewland 24.06.2019 10:23

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

Это решило мою проблему, в которой «ответы с большим количеством голосов» - нет. Но моя проблема отличалась от OP. Я хотел, чтобы месяцы были напечатаны в виде текста («Февраль», а не «2»)

Nathan 12.03.2020 19:21

Это короче:

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

Или даже

from datetime import datetime, date

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

Вышел: '25 .12.2013

или же

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

Ушел: 'Сегодня - 25.12.2013'

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

Выход: 'Среда'

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

Вышел: '__main ____ 2014.06.09__16-56.log'

Поскольку print today возвращает то, что вы хотите, это означает, что функция __str__ объекта today возвращает искомую строку.

Так что вы тоже можете использовать mylist.append(today.__str__()).

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

datetime.date.today().isoformat()

Небольшой отказ от ответственности за свой ответ - я изучаю Python всего около 2 недель, так что я ни в коем случае не эксперт; поэтому мое объяснение может быть не лучшим, и я могу использовать неправильную терминологию. В любом случае, вот оно.

Я заметил в вашем коде, что, когда вы объявили свою переменную today = datetime.date.today(), вы решили назвать свою переменную именем встроенной функции.

Когда ваша следующая строка кода mylist.append(today) добавляла ваш список, она добавляла всю строку datetime.date.today(), которую вы ранее установили как значение вашей переменной today, а не просто добавляла today().

Простое решение, хотя, возможно, не один из большинства программистов будет использовать при работе с модулем datetime, является изменение имени вашей переменной.

Вот что я пробовал:

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

и печатает yyyy-mm-dd.

Я ненавижу импортировать слишком много модулей для удобства. Я бы предпочел работать с доступным модулем, которым в данном случае является datetime, а не называть новый модуль time.

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

Я думаю, что было бы эффективнее сделать это одной строкой кода, выполнив a = datetime.datetime(2015, 04, 01, 23, 22).strftime('%Y-%m-%d %H:%M)

Dorian Dore 15.05.2015 06:11

Вы можете использовать easy_date, чтобы упростить:

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

Вот как отобразить дату как (год / месяц / день):

from datetime import datetime
now = datetime.now()

print '%s/%s/%s' % (now.year, now.month, now.day)
# 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

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

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

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

Обратите внимание, что я также добавил эту информацию в принятый отвечать.

handle 17.11.2017 12:59

strftime на самом деле не включает «вывод ISO 8601». Есть «директивы», но только для определенных токенов, таких как «день недели», а не для всей временной метки ISO 8601, что меня всегда раздражало.

anarcat 30.11.2018 19:37
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

Таким образом вы можете получить дату в формате, подобном этому примеру: 22 июня 2017 г.

Слишком много кода для чего-то, что можно поместить в одну строку. С %b вы получите слова за первые три месяца, а с %B - за весь месяц. Пример: datetime.datetime.now().strftime("%Y-%b-%d %H:%M:%S") вернет '2018-Oct-04 09:44:08'

Víctor López 04.10.2018 10:44
from datetime import date

def today_in_str_format():
    return str(date.today())

print (today_in_str_format())

Это напечатает 2018-06-23, если вы этого хотите :)

Учитывая тот факт, что вы просили что-то простое, чтобы сделать то, что вы хотели, вы могли просто:

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

Я не совсем понимаю, но могу использовать pandas для получения времени в правильном формате:

>>> 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
>>> 

И:

>>> 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']

Но он хранит строки, но его легко преобразовать:

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

Целая зависимость, чтобы делать что-то в библиотеке Python std, есть методы для выполнения?

Hejazzman 05.03.2019 17:45

Для тех, кому нужна дата на основе локали без учета времени, используйте:

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

Другие вопросы по теме