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

Это мой код:

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?

Ответ 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().

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

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

EG:

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 (переполнение стека) ;-)

Ответ 2

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

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

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

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

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

some_date.strftime('%c')

Ответ 5

Это короче:

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

Ответ 6

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

ВЫХОД

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

Ответ 7

Или даже

from datetime import datetime, date

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

Out: '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())

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

Ответ 8

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

datetime.date.today().isoformat()

Ответ 9

С форматированным форматом строки datetime (см. Ответ nk9 с использованием str.format().) В строковом литерале Formatted (начиная с 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.

Ответ 10

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

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

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

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

Ответ 11

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

mylist.append(str(today))

Ответ 12

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

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

Ответ 13

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

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

Ответ 14

Так как print today возвращает то, что вы хотите, это означает, что функция object __str__ сегодня возвращает строку, которую вы ищете.

Итак, вы можете сделать mylist.append(today.__str__()).

Ответ 15

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

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

Ответ 16

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

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

Ответ 17

Быстрый отказ от моего ответа - я изучал 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.

Ответ 18

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

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

Ответ 19

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

from datetime import datetime
now = datetime.now()

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

Ответ 20

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

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

Ответ 21

with open(file_path") as my_file:
    print(my_file.readlines()[-1])

Ответ 22

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

Ответ 23

Я не совсем понимаю, но могу использовать 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')]