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,SJIS或utf-8;使用locale.getlocale()以确定当前区域的编码).
因此,简而言之,如果您认为需要覆盖区域设置,请确保您有充足的理由,因此您不必最终创建新的错误.
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)
虽然我不喜欢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)
它符合这里的要求,可能值得包含在您的项目中.有了这个,我会说你应该验证许可证允许使用......任何澄清的评论都是受欢迎的.
Pythonstrftime()只保证支持C89的格式代码(参见列表)。
有用的附加格式代码由其他标准定义(请参阅Linux 手册页strftime())。对于这个问题,\n相关的附加代码是:
%l\xe2\x80\x94 十进制数形式的小时(12 小时制)(范围 1 到 12)。%P\xe2\x80\x94 类似%p但小写:“am”或“pm”或当前语言环境的相应字符串。我喜欢使用包装函数strftime()来实现附加代码:
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)\nRun Code Online (Sandbox Code Playgroud)\n\n要获得格式为“2:35pm”的输出:
\n\nextendedStrftime(dt, \'%l:%M%P\')\nRun Code Online (Sandbox Code Playgroud)\n\n想要格式化不带前导零的日期也很常见,这可以使用附加代码来完成%e:
extendedStrftime(dt, \'%e %b %Y\') # "1 Jan 2015"\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
11244 次 |
| 最近记录: |