Spanky
Spanky

Reputation: 121

Python strftime %A fixed length

I am using the following date format:

d.strftime("%A, %d %B %Y %H:%m")

and since the length of the weekday (%A) changes, I would like to always print the weekday with 10 characters, pad spaces to the left, and align it right.

Something like

d.strftime("10%A, %d %B %Y %H:%m")

What is the simplest way?

Upvotes: 3

Views: 1433

Answers (3)

Michael come lately
Michael come lately

Reputation: 9323

This is roughly equivalent to jfs's answer, but you can use .format() to make it slightly shorter:

s = '{:>10}, {:%d %B %Y %H:%m}'.format(d.strftime('%A'), d)

or if you're putting more than just the date into the string:

args = {
    'weekday': d.strftime('%A'),
    'date': d,
    'foo': some_other_stuff(),
    'bar': 17.5422,
}
s = '{weekday:>10}, {date:%d %B %Y %H:%m} {foo} {bar:>3.2f}'.format(**args)

Upvotes: 0

jfs
jfs

Reputation: 414129

str.rjust(10) does exactly that:

s = d.strftime('%A').rjust(10) + d.strftime(', %d %B %Y %H:%M')

It is likely that you want %M (minutes), not %m (months) in your format string as @Ahmad pointed out.

In Python 3.6+, to get a more concise version, one can abuse nested f-strings:

>>> f"{f'{d:%A}':>10}, {d:%d %B %Y %H:%M}"
'    Friday, 15 December 2017 21:31'

Prefer standard time formats such as rfc 3339:

>>> from datetime import datetime
>>> datetime.utcnow().isoformat() + 'Z'
'2016-02-05T14:00:43.089828Z'

Or rfc 2822:

>>> from email.utils import formatdate
>>> formatdate(usegmt=True)                                          
'Fri, 05 Feb 2016 14:00:51 GMT'

instead.

Upvotes: 2

JMzance
JMzance

Reputation: 1746

How about this:

d.strftime("%A") + " " * (10 - len(d.strftime("%A")) + "," + d.strftime("%d %B %Y %H:%m")

Jack

Upvotes: 0

Related Questions