从Python日期/时间获取"下午2:35"而不是"02:35 PM"?

ano*_*ard 28 python formatting time datetime

我对Python仍然有点慢,所以除了文档中明显的内容之外,我还没有弄明白这一点等等.

我曾经使用过Django,他们通过模板标签添加了一些日期时间格式化选项,但是在常规python代码中如何才能获得12 小时不带前导零的小时

有一种直截了当的方法吗?我正在查看"strftime()"的2.5和2.6文档,并且在这种情况下似乎没有格式化选项.

我应该使用其他东西吗?

随意添加任何其他时间格式提示,这些提示在文档中并不明显.=)

Mik*_*one 20

没有内置的东西datetime可以做到.你需要使用类似的东西:

datetime.time(1).strftime('%I:%M%p').lstrip('0')
Run Code Online (Sandbox Code Playgroud)

附录

正如@naktinis指出的那样,这是针对这个特定strftime参数的使用量身定制的.不幸的是,如果内容没有通用的解决方案strftime参数不明或不确定(如外部参数),因为它变成了"做我的意思是,不是我说什么"的问题.

因此,鉴于您必须知道strftime参数中的内容,在更复杂的情况下,您可以将其解析为部分:

tval = datetime.time(1)
tval_str = (tval.strftime('%A, %B ') + tval.strftime('%d').lstrip('0') 
    + tval.strftime(' %Y, ') + tval.strftime('%I:%M').lstrip('0') 
    + tval.strftime('%p').lower())
Run Code Online (Sandbox Code Playgroud)

或与re模块:

tval = datetime.time(1)
tval_str = re.sub(r"^0|(?<=\s)0", "", 
    re.sub(r"(?<=[0-9])[AP]M", lambda m: m.group().lower(), 
    tval.strftime('%A, %B %d %Y, %I:%M%p')))
Run Code Online (Sandbox Code Playgroud)

也就是说,请记住,如果该"%p"术语为您提供大写字母,则可能是因为用户将其区域设置设置为以这种方式工作,并且通过更改大小写,您将覆盖用户首选项,这有时会导致错误报告.此外,用户可能想要的东西,其他的不是"AM"或"PM",如"AM"和"PM".另请注意,这些对于不同的语言环境是不同的(例如,en_USlocale给出AM或者PM%p,但是de_DE给出am或者pm)并且您可能没有在您假设的编码中获得字符.

strftime行为文档:

由于格式取决于当前区域设置,因此在对输出值进行假设时应小心.字段顺序会有所不同(例如,"月/日/年"与"日/月/年"),输出可能包含使用区域设置的默认编码编码的Unicode字符(例如,如果当前区域设置为js_JP,则为默认值编码可以是中的任一项eucJP,SJISutf-8;使用locale.getlocale()以确定当前区域的编码).

因此,简而言之,如果您认为需要覆盖区域设置,请确保您有充足的理由,因此您不必最终创建新的错误.

  • 这并没有按要求处理小写的"pm" (2认同)
  • 这可以适用于特定问题,但不能作为一般解决方案.你不想在"1月"或"星期一"调用`.lower()`. (2认同)

use*_*450 14

这个问题已经得到了解答,但是技术上可以直接从Python日期.strftime("%-I:%M%P")时间到使用glibc的linux平台上的"2:35 pm" 因为Python strftime()使用了c库strftime().

>>> import datetime
>>> now = datetime.datetime.now()
datetime.datetime(2012, 9, 18, 15, 0, 30, 385186)
>>> now.strftime("%-I:%M%P")
'3:00pm'
>>> datetime.time(14, 35).strftime("%-I:%M%P")
'2:35pm'
Run Code Online (Sandbox Code Playgroud)

请参阅strftime glibc关于" - "的说明.

  • 这是正确的答案.对于任何人这样做的说明:strptime()(反向)不需要 - ,它已经处理了填充和非填充数字,如果你给它%-I,它实际上会抱怨,所以如果你也有以相同格式的strptime(),不要使用%-I存储和重用相同的格式字符串,使用%I (3认同)

ano*_*ard 7

虽然我不喜欢Mike DeSimone的回答,但出于投票目的,我认为这可能是值得的贡献......

Django项目在django/utils/dateformat.py(trunk)中包含一个"PHP兼容"日期格式化类.它像这样使用(shell示例):

>>> import datetime
>>> from django.utils.dateformat import DateFormat
>>> d = datetime.datetime.now()
>>> df =  DateFormat(d)
>>> df.format('g:ia') # Format for Hour-no-leading-0, minutes, lowercase 'AM/PM'
u'9:10a.m.'
Run Code Online (Sandbox Code Playgroud)

它符合这里的要求,可能值得包含在您的项目中.有了这个,我会说你应该验证许可证允许使用......任何澄清的评论都是受欢迎的.


Tac*_*tex 5

Pythonstrftime()只保证支持C89的格式代码(参见列表)。

\n\n

有用的附加格式代码由其他标准定义(请参阅Linux 手册页strftime())。对于这个问题,\n相关的附加代码是:

\n\n
    \n
  • %l\xe2\x80\x94 十进制数形式的小时(12 小时制)(范围 1 到 12)。
  • \n
  • %P\xe2\x80\x94 类似%p但小写:“am”或“pm”或当前语言环境的相应字符串。
  • \n
\n\n

我喜欢使用包装函数strftime()来实现附加代码:

\n\n
def extendedStrftime(dt, format):\n\n    day  = dt.strftime(\'%d\').lstrip(\'0\')\n    hour = dt.strftime(\'%I\').lstrip(\'0\')\n    ampm = dt.strftime(\'%p\').lower()\n\n    format = format.replace(\'%e\', day)\n    format = format.replace(\'%l\', hour)\n    format = format.replace(\'%P\', ampm)\n\n    return dt.strftime(format)\n
Run Code Online (Sandbox Code Playgroud)\n\n

要获得格式为“2:35pm”的输出:

\n\n
extendedStrftime(dt, \'%l:%M%P\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

想要格式化不带前导零的日期也很常见,这可以使用附加代码来完成%e

\n\n
extendedStrftime(dt, \'%e %b %Y\')  # "1 Jan 2015"\n
Run Code Online (Sandbox Code Playgroud)\n