587

I'm adding UTC time strings to Bitbucket API responses that currently only contain Amsterdam (!) time strings. For consistency with the UTC time strings returned elsewhere, the desired format is 2011-11-03 11:07:04 (followed by +00:00, but that's not germane).

What's the best way to create such a string (without a microsecond component) from a datetime instance with a microsecond component?

>>> import datetime
>>> print unicode(datetime.datetime.now())
2011-11-03 11:13:39.278026

I'll add the best option that's occurred to me as a possible answer, but there may well be a more elegant solution.

Edit: I should mention that I'm not actually printing the current time – I used datetime.now to provide a quick example. So the solution should not assume that any datetime instances it receives will include microsecond components.

0

16 Answers 16

1134

If you want to format a datetime object in a specific format that is different from the standard format, it's best to explicitly specify that format:

>>> import datetime
>>> datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
'2011-11-03 18:21:26'

See the documentation of datetime.strftime() for an explanation of the % directives.

Starting from Python 3.6, the isoformat() method is flexible enough to also produce this format:

datetime.datetime.now().isoformat(sep=" ", timespec="seconds")
Sign up to request clarification or add additional context in comments.

17 Comments

What was that convincing case - putting this solution above your solution using datetime.replace?
@matlehmann: Of course I don't know the arguments of davidchambers' colleague. However, I think if your intention is to print a date in a very specific format, you should be explicit about this intention. The code in this answer says "take the current time and format it exactly like this". The code in the other answer says "take the current time, set the microseconds to 0, and then convert it to a string somehow".
+1, being explicit about the string format avoids problems if standard datetime-str conversion changes in a future Python version
@DylanYoung The requirement of the OP is to print a datetime object in a format that is different from the standard format returned by .isoformat(), which includes the microseconds by default. If that's what you need, be explicit about it. Everyone will immediately understand what this code does. Hardly anyone will understand the other code without looking at the documentation.
As of Python 3.6, you can simply do: datetime.now().isoformat(timespec='seconds', sep=' ')
|
226
>>> import datetime
>>> now = datetime.datetime.now()
>>> print unicode(now.replace(microsecond=0))
2011-11-03 11:19:07

7 Comments

in my situation, the date has already been constructed and I needed to "floor" it to the second. this is perfect, thanks.
This is the best answer!
Far better than formatting or parsing strings for the comparison, thank you.
This is the right answer as it upholds the format datetime, not turning it into string. But it can be shortened further by removing third line and changing second line of code to now = datetime.datetime.now().replace(microsecond=0). Also worth mentioning that datetime.datetime.utcnow() prints GMT—never store timestamps in local time
datetime.datetime.utcnow() is deprecated can use datetime.datetime.now(datetime.UTC) as per @miguelgrinberg
|
159

In Python 3.6:

from datetime import datetime
datetime.now().isoformat(' ', 'seconds')
'2017-01-11 14:41:33'

https://docs.python.org/3.6/library/datetime.html#datetime.datetime.isoformat

3 Comments

I think that now, 8 years later with the advent of Python 3.6 this should be the accepted, universal answer. This offers the better of both worlds argued about by @DylanYoung and AlexanderMP on this same thread here
I have always hated that 'T' in my times. I did not know of the separator option until now. Thank you and 1+.
57

This is the way I do it. ISO format:

import datetime
datetime.datetime.now().replace(microsecond=0).isoformat()
# Returns: '2017-01-23T14:58:07'

You can replace the 'T' if you don't want ISO format:

datetime.datetime.now().replace(microsecond=0).isoformat(' ')
# Returns: '2017-01-23 15:05:27'

5 Comments

This is similar to my answer. Is there a reason to favour .isoformat() over unicode()?
Depends on what you want, if you want the python string representation use unicode(), and if you want ISO-8601, use isoformat()
I see. unicode() is more convenient than .isoformat().replace('T', ' '), certainly. ;)
I would just use Sven's solution for non-iso format, its more explicit: datetime.now().strftime("%Y-%m-%d %H:%M") , but replacing the 'T' is just another way. May be best solution if you need both ISO and unicode date.
isoformat accepts the separator specifier, so no replace should be done. just do: datetime.datetime.now().replace(microsecond=0).isoformat(' ')
20

Yet another option:

>>> import time
>>> time.strftime("%Y-%m-%d %H:%M:%S")
'2011-11-03 11:31:28'

By default this uses local time, if you need UTC you can use the following:

>>> time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
'2011-11-03 18:32:20'

1 Comment

Downvote because the OP asked about datetime, not time.
19

Keep the first 19 characters that you wanted via slicing:

>>> str(datetime.datetime.now())[:19]
'2011-11-03 14:37:50'

4 Comments

This is only incorrect because time strings can have timezone specification appended, e.g. +05:30. Correct would be str(now())[:19].
@K3---rnc: Thanks. Updated per your suggestion.
after year 10000, a second will be missed
time will tell @diti ;)
18

I usually do:

import datetime
now = datetime.datetime.now()
now = now.replace(microsecond=0)  # To print now without microsecond.

# To print now:
print(now)

output:

2019-01-13 14:40:28

Comments

11

As of Python 3.6+, the best way of doing this is by the new timespec argument for isoformat.

isoformat(timespec='seconds', sep=' ')

Usage:

>>> datetime.now().isoformat(timespec='seconds')
'2020-10-16T18:38:21'
>>> datetime.now().isoformat(timespec='seconds', sep=' ')
'2020-10-16 18:38:35'

Comments

8

Since not all datetime.datetime instances have a microsecond component (i.e. when it is zero), you can partition the string on a "." and take only the first item, which will always work:

unicode(datetime.datetime.now()).partition('.')[0]

Comments

5

f-string formatting

>>> import datetime
>>> print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S}')
2021-12-01 22:10:07

Comments

3

We can try something like below

import datetime

date_generated = datetime.datetime.now()
date_generated.replace(microsecond=0).isoformat(' ').partition('+')[0]

4 Comments

This is inferior to .isoformat(' ', 'seconds'), proposed in an earlier answer.
When I am trying above proposed earlier answer, I am getting below error >>> datetime.datetime.now().isoformat(' ', 'seconds') Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: isoformat() takes at most 1 argument (2 given)
Ah, I see. It works for me in Python 3 but not in Python 2.
I am using python 3.4.3 version, in that i see that error. >>> datetime.datetime.now().isoformat(' ', 'seconds') Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: isoformat() takes at most 1 argument (2 given)
3
>>> from datetime import datetime
>>> dt = datetime.now().strftime("%Y-%m-%d %X")
>>> print(dt)
'2021-02-05 04:10:24'

Comments

2

This I use because I can understand and hence remember it better (and date time format also can be customized based on your choice) :-

import datetime
moment = datetime.datetime.now()
print("{}/{}/{} {}:{}:{}".format(moment.day, moment.month, moment.year,
                                 moment.hour, moment.minute, moment.second))

1 Comment

Brilliant. Simple, flexible and platform-independent (unlike strftime).
1

I found this to be the simplest way.

>>> t = datetime.datetime.now()
>>> t
datetime.datetime(2018, 11, 30, 17, 21, 26, 606191)
>>> t = str(t).split('.')
>>> t
['2018-11-30 17:21:26', '606191']
>>> t = t[0]
>>> t
'2018-11-30 17:21:26'
>>> 

1 Comment

datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") '2011-11-03 18:21:26' much easier imo. But easy is not alwast the best
1

You can also use the following method

import datetime as _dt

ts = _dt.datetime.now().timestamp()
print("TimeStamp without microseconds: ", int(ts)) #TimeStamp without microseconds:  1629275829

dt = _dt.datetime.now()
print("Date & Time without microseconds: ", str(dt)[0:-7]) #Date & Time without microseconds:  2021-08-18 13:07:09

Comments

-2

Current TimeStamp without microsecond component:

timestamp = list(str(datetime.timestamp(datetime.now())).split('.'))[0]

1 Comment

This doesn't provide an answer in the format that was requested.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.