没有零填充的 Python 日期时间格式
- 2025-03-10 08:49:00
- admin 原创
- 36
问题描述:
是否存在一种用于打印 Python 日期时间的格式,不会在日期和时间上使用零填充?
我现在使用的格式:
mydatetime.strftime('%m/%d/%Y %I:%M%p')
结果: 2012 年 2 月 29 日下午 5:03
期望时间: 2012 年 2 月 29 日下午 5:03
什么格式可以将月份表示为“2”而不是“02”,将时间表示为“5:03PM”而不是“05:03PM”
解决方案 1:
避免上述“全或无”前导零的另一种方法是在字段类型前面放置一个减号:
mydatetime.strftime('%-m/%d/%Y %-I:%M%p')
然后是:‘2015 年 4 月 10 日凌晨 3 点’
变为:‘4/10/2015 3:00AM’
如果需要的话,您可以选择在日期前面放置一个减号。
编辑:减号功能源自 GNU C 库(“glibc”),如Linux strftime 手册页中的“Glibc 注释”中所述
解决方案 2:
新的字符串格式化系统提供了 的替代方案strftime
。它非常易读——事实上,strftime
从这个角度来看,它可能比 更可取。更不用说它不使用零填充的事实了:
>>> '{d.month}/{d.day}/{d.year}'.format(d=datetime.datetime.now())
'3/1/2012'
由于您可能希望在分钟字段中添加零,因此您可以这样做:
>>> '{d.month}/{d.day}/{d.year} {d.hour}:{d.minute:02}'.format(d=now)
'3/1/2012 20:00'
如果您想要“常规”时间而不是“军事”时间,您仍然可以使用标准strftime
说明符。为了方便起见,我们strftime
确实提供了一个 12 小时时间的代码,其中填充了空格而不是前导零:
'{d.month}/{d.day}/{d.year} {d:%l}:{d.minute:02}{d:%p}'.format(d=now)
'4/4/2014 6:00PM'
可惜,这变得可读性较差。正如 @mlissner 指出的那样,strftime
在某些(所有?)平台上,对于 1900 年之前的日期,它将失败。
解决方案 3:
可用的格式化选项datetime.strftime()
将全部使用零填充。当然,您可以自行制定格式化函数,但在这种情况下,最简单的解决方案可能是对结果进行后处理datetime.strftime()
:
s = mydatetime.strftime('%m/%d/%Y %I:%M%p').lstrip("0").replace(" 0", " ")
解决方案 4:
接受的答案不是一个正确的解决方案(IMHO)正确的记录方法:
在 Linux 中,“#” 被替换为“-”:
%-d,%-H,%-I,%-j,%-m,%-M,%-S,%-U,%-w,%-W,%-y,%-Y
在 Windows 中“-”被替换为“#”:
%#d,%#H,%#I,%#j,%#m,%#M,%#S,%#U,%#w,%#W,%#y,%#Y
#Linux
mydatetime.strftime('%-m/%d/%Y %-I:%M%p')
# Windows
mydatetime.strftime('%#m/%d/%Y %#I:%M%p')
来源:https://msdn.microsoft.com/en-us/library/fe06s4ak.aspx
正如 Sagneta 所述:Windows 上的 # hash 技巧仅适用于本机 python 可执行文件。这对基于 cygwin 的 python 实现不起作用。
解决方案 5:
Chris Freeman 对 Linux 给出了很好的回答。
在 Windows 上,它是:
mydate.strftime('%#m/%#d/%Y')
解决方案 6:
另一个选择:
yourdatetime.strftime('%-m/%-d/%Y %-I:%M%p')
解决方案 7:
正如其他几个人提到的那样,要忽略 Windows 上的前导零,您必须使用%#d
而不是%-d
。
对于那些喜欢编写干净的跨平台 Python 代码,而不想在业务逻辑中看到平台切换的人来说,这里有一个Python3
帮助程序,可以让你为 Windows、Linux 和其他平台(测试过的 Linux、Windows 和 FreeBSD)使用一个格式字符串:
import os
from datetime import datetime
def dateToStr(d: datetime, fmt: str) -> str:
return d.strftime(fmt.replace('%-', '%#') if os.name == 'nt' else fmt)
dateToStr(datetime.now(), '%-m/%-d/%-Y')
顺便说一句,这是 Python 中的另一个功能Whaaaaaaaat?
。我不明白为什么他们没有为所有平台创建标准格式集并添加可选的“use_native”标志以使用本机平台功能。猜测这是一个早期的设计决定,必须保留以支持遗留系统。
解决方案 8:
“%l”(小写的 L)用于表示小时(而不是“%I”)。我只是从另一个答案中知道这一点
Python strftime - 没有前导 0 的日期?
但不幸的是,他们没有日期/时间的其他元素的代码。
解决方案 9:
我用的是这个:
D = str(datetime.now().day)
MM = str(datetime.now().month)
YYYY = str(datetime.now().year)
今天将返回:2021 年 12 月 2 日
解决方案 10:
在官方文档格式化部分:
与 strptime() 方法一起使用时,格式 %d、%m、%H、%I、%M、%S、%J、%U、%W 和 %V 的前导零是可选的。格式 %y 需要前导零。
因此,使用%d
来解析数字中的天数将自动解析07
& 7
。
解决方案 11:
我第一次遇到这个问题,因为我以前大部分开发工作都是在 Linux 上完成的。这是我在 Python 3.8+ 上实现的简单跨平台方法的解决方案
from typing import AnyStr
import os
def unistrfmt(fmt: AnyStr) -> AnyStr:
return fmt.replace(('%#', '%-')[os.name == 'nt'], ('%-', '%#')[os.name == 'nt'])
# Examples:
from datetime import date
date.today().strftime(unistrfmt("%Y.%m.%-d"))
# '2024.02.1'
os.name
#'nt'
unistrfmt("%Y.%m.%-d")
# '%Y.%m.%#d'
unistrfmt("%Y.%m.%#d")
# '%Y.%m.%#d'
解决方案 12:
在格式描述符前面添加 # 以删除零填充:
mydatetime.strftime('%#m/%d/%Y %#I:%M%p')