问题:如何以常规格式打印日期?
这是我的代码:
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
?
This is my code:
import datetime
today = datetime.date.today()
print(today)
This prints: 2008-11-22
which is exactly what I want.
But, I have a list I’m appending this to and then suddenly everything goes “wonky”. Here is the code:
import datetime
mylist = []
today = datetime.date.today()
mylist.append(today)
print(mylist)
This prints the following:
[datetime.date(2008, 11, 22)]
How can I get just a simple date like 2008-11-22
?
回答 0
为什么:日期是对象
在Python中,日期是对象。因此,当您操作它们时,您将操作对象,而不是字符串,时间戳或其他任何对象。
Python中的任何对象都有两个字符串表示形式:
可以使用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)'
。
发生的事情是,当您使用“打印”打印日期时,会使用它,str()
以便可以看到一个不错的日期字符串。但是在打印后mylist
,您已经打印了一个对象列表,Python尝试使用来表示数据集repr()
。
方法:您想怎么做?
好吧,当您操作日期时,请一直使用日期对象。他们获得了数千种有用的方法,并且大多数Python API都希望日期成为对象。
要显示它们时,只需使用str()
。在Python中,良好的做法是显式转换所有内容。因此,仅在打印时,使用即可获取日期的字符串表示形式str(date)
。
最后一件事。当您尝试打印日期时,您打印了mylist
。如果要打印日期,则必须打印日期对象,而不是其容器(列表)。
EG,您想将所有日期打印在列表中:
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()
需要一个字符串模式来说明如何格式化日期。
EG:
print today.strftime('We are the %d, %b %Y')
>>> 'We are the 22, Nov 2008'
a之后的所有字母"%"
代表某种格式:
%d
是天数
%m
是月份号
%b
是月份的缩写
%y
是年份的后两位数字
%Y
是整年
等等
查看官方文档或McCutchen的快速参考资料,您可能一无所知。
从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(堆栈溢出)的另一个问题;-)
The WHY: dates are objects
In Python, dates are objects. Therefore, when you manipulate them, you manipulate objects, not strings, not timestamps nor anything.
Any object in Python have TWO string representations:
The regular representation that is used by “print”, can be get using the str()
function. It is most of the time the most common human readable format and is used to ease display. So str(datetime.datetime(2008, 11, 22, 19, 53, 42))
gives you '2008-11-22 19:53:42'
.
The alternative representation that is used to represent the object nature (as a data). It can be get using the repr()
function and is handy to know what kind of data your manipulating while you are developing or debugging. repr(datetime.datetime(2008, 11, 22, 19, 53, 42))
gives you 'datetime.datetime(2008, 11, 22, 19, 53, 42)'
.
What happened is that when you have printed the date using “print”, it used str()
so you could see a nice date string. But when you have printed mylist
, you have printed a list of objects and Python tried to represent the set of data, using repr()
.
The How: what do you want to do with that?
Well, when you manipulate dates, keep using the date objects all long the way. They got thousand of useful methods and most of the Python API expect dates to be objects.
When you want to display them, just use str()
. In Python, the good practice is to explicitly cast everything. So just when it’s time to print, get a string representation of your date using str(date)
.
One last thing. When you tried to print the dates, you printed mylist
. If you want to print a date, you must print the date objects, not their container (the list).
E.G, you want to print all the date in a list :
for date in mylist :
print str(date)
Note that in that specific case, you can even omit str()
because print will use it for you. But it should not become a habit :-)
Practical case, using your code
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
Advanced date formatting
Dates have a default representation, but you may want to print them in a specific format. In that case, you can get a custom string representation using the strftime()
method.
strftime()
expects a string pattern explaining how you want to format your date.
E.G :
print today.strftime('We are the %d, %b %Y')
>>> 'We are the 22, Nov 2008'
All the letter after a "%"
represent a format for something :
%d
is the day number
%m
is the month number
%b
is the month abbreviation
%y
is the year last two digits
%Y
is the all year
etc
Have a look at the official documentation, or McCutchen’s quick reference you can’t know them all.
Since PEP3101, every object can have its own format used automatically by the method format of any string. In the case of the datetime, the format is the same used in
strftime. So you can do the same as above like this:
print "We are the {:%d, %b %Y}".format(today)
>>> 'We are the 22, Nov 2008'
The advantage of this form is that you can also convert other objects at the same time.
With the introduction of Formatted string literals (since Python 3.6, 2016-12-23) this can be written as
import datetime
f"{datetime.datetime.now():%Y-%m-%d}"
>>> '2017-06-15'
Localization
Dates can automatically adapt to the local language and culture if you use them the right way, but it’s a bit complicated. Maybe for another question on SO(Stack Overflow) ;-)
回答 1
import datetime
print datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
编辑:
在Cees建议之后,我也开始使用时间:
import time
print time.strftime("%Y-%m-%d %H:%M")
import datetime
print datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
Edit:
After Cees suggestion, I have started using time as well:
import time
print time.strftime("%Y-%m-%d %H:%M")
回答 2
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中的datetime和time模块来做的事情
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
The date, datetime, and time objects all support a strftime(format) method,
to create a string representing the time under the control of an explicit format
string.
Here is a list of the format codes with their directive and meaning.
%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.
This is what we can do with the datetime and time modules in 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")
That will print out something like this:
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
回答 3
使用date.strftime。格式参数在文档中进行了描述。
这是您想要的:
some_date.strftime('%Y-%m-%d')
这一部分考虑了语言环境。(做这个)
some_date.strftime('%c')
Use date.strftime. The formatting arguments are described in the documentation.
This one is what you wanted:
some_date.strftime('%Y-%m-%d')
This one takes Locale into account. (do this)
some_date.strftime('%c')
回答 4
这更短:
>>> import time
>>> time.strftime("%Y-%m-%d %H:%M")
'2013-11-19 09:38'
This is shorter:
>>> import time
>>> time.strftime("%Y-%m-%d %H:%M")
'2013-11-19 09:38'
回答 5
# 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
# 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
回答 6
甚至
from datetime import datetime, date
"{:%d.%m.%Y}".format(datetime.now())
出:’25 .12.2013
要么
"{} - {:%d.%m.%Y}".format("Today", datetime.now())
离开:“今天-2013年12月25日”
"{:%A}".format(date.today())
出:“星期三”
'{}__{:%Y.%m.%d__%H-%M}.log'.format(__name__, datetime.now())
出:’__main ____ 2014.06.09__16-56.log’
Or even
from datetime import datetime, date
"{:%d.%m.%Y}".format(datetime.now())
Out: ‘25.12.2013
or
"{} - {:%d.%m.%Y}".format("Today", datetime.now())
Out: ‘Today – 25.12.2013’
"{:%A}".format(date.today())
Out: ‘Wednesday’
'{}__{:%Y.%m.%d__%H-%M}.log'.format(__name__, datetime.now())
Out: ‘__main____2014.06.09__16-56.log’
回答 7
简单的答案-
datetime.date.today().isoformat()
Simple answer –
datetime.date.today().isoformat()
回答 8
With type-specific datetime
string formatting (see nk9’s answer using str.format()
.) in a Formatted string literal (since Python 3.6, 2016-12-23):
>>> import datetime
>>> f"{datetime.datetime.now():%Y-%m-%d}"
'2017-06-15'
The date/time format directives are not documented as part of the Format String Syntax but rather in date
, datetime
, and time
‘s strftime()
documentation. The are based on the 1989 C Standard, but include some ISO 8601 directives since Python 3.6.
回答 9
您需要将日期时间对象转换为字符串。
以下代码为我工作:
import datetime
collection = []
dateTimeString = str(datetime.date.today())
collection.append(dateTimeString)
print collection
让我知道您是否需要更多帮助。
You need to convert the date time object to a string.
The following code worked for me:
import datetime
collection = []
dateTimeString = str(datetime.date.today())
collection.append(dateTimeString)
print collection
Let me know if you need any more help.
回答 10
你可以做:
mylist.append(str(today))
You can do:
mylist.append(str(today))
回答 11
我讨厌为了方便而导入太多模块的想法。我宁愿使用可用模块,在这种情况下也datetime
不愿调用新模块time
。
>>> a = datetime.datetime(2015, 04, 01, 11, 23, 22)
>>> a.strftime('%Y-%m-%d %H:%M')
'2015-04-01 11:23'
I hate the idea of importing too many modules for convenience. I would rather work with available module which in this case is datetime
rather than calling a new module time
.
>>> a = datetime.datetime(2015, 04, 01, 11, 23, 22)
>>> a.strftime('%Y-%m-%d %H:%M')
'2015-04-01 11:23'
回答 12
考虑到您要求做一些简单的事情来做自己想做的事情,您可以:
import datetime
str(datetime.date.today())
Considering the fact you asked for something simple to do what you wanted, you could just:
import datetime
str(datetime.date.today())
回答 13
对于那些想要基于区域设置的日期而不包括时间的人,请使用:
>>> some_date.strftime('%x')
07/11/2019
For those wanting locale-based date and not including time, use:
>>> some_date.strftime('%x')
07/11/2019
回答 14
您可能想将其附加为字符串?
import datetime
mylist = []
today = str(datetime.date.today())
mylist.append(today)
print mylist
You may want to append it as a string?
import datetime
mylist = []
today = str(datetime.date.today())
mylist.append(today)
print mylist
回答 15
由于print today
返回所需的内容,因此这意味着Today对象的__str__
函数将返回您要查找的字符串。
所以你也可以做mylist.append(today.__str__())
。
Since the print today
returns what you want this means that the today object’s __str__
function returns the string you are looking for.
So you can do mylist.append(today.__str__())
as well.
回答 16
您可以使用easy_date使其变得容易:
import date_converter
my_date = date_converter.date_to_string(today, '%Y-%m-%d')
You can use easy_date to make it easy:
import date_converter
my_date = date_converter.date_to_string(today, '%Y-%m-%d')
回答 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
。
A quick disclaimer for my answer – I’ve only been learning Python for about 2 weeks, so I am by no means an expert; therefore, my explanation may not be the best and I may use incorrect terminology. Anyway, here it goes.
I noticed in your code that when you declared your variable today = datetime.date.today()
you chose to name your variable with the name of a built-in function.
When your next line of code mylist.append(today)
appended your list, it appended the entire string datetime.date.today()
, which you had previously set as the value of your today
variable, rather than just appending today()
.
A simple solution, albeit maybe not one most coders would use when working with the datetime module, is to change the name of your variable.
Here’s what I tried:
import datetime
mylist = []
present = datetime.date.today()
mylist.append(present)
print present
and it prints yyyy-mm-dd
.
回答 18
这是将日期显示为(年/月/日)的方法:
from datetime import datetime
now = datetime.now()
print '%s/%s/%s' % (now.year, now.month, now.day)
Here is how to display the date as (year/month/day) :
from datetime import datetime
now = datetime.now()
print '%s/%s/%s' % (now.year, now.month, now.day)
回答 19
from datetime import date
def time-format():
return str(date.today())
print (time-format())
如果那是您想要的,它将打印6-23-2018 :)
from datetime import date
def time-format():
return str(date.today())
print (time-format())
this will print 6-23-2018 if that’s what you want :)
回答 20
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
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
In this way you can get Date formatted like this example: 22-Jun-2017
回答 21
我不太了解,但是可以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')]
I don’t fully understand but, can use pandas
for getting times in right format:
>>> 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
>>>
And:
>>> 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']
But it’s storing strings but easy to convert:
>>> l=list(map(str,l))
>>> list(map(pd.to_datetime,l))
[Timestamp('2018-10-07 00:00:00')]