这里:https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior它说%p
显示AM/PM。它显示了这个
AM, PM (en_US);
am, pm (de_DE)
我不确定de_DE
是什么,但是当我使用Django Rest框架做%p
时,它以大写字母显示AM和PM。如何更改它,使am和pm以小写显示?
这是我的DRF settings.py
代码,我编辑日期时间格式(可能没有用):
#added REST_FRAMEWORK
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
),
'DATETIME_FORMAT': "%b %d at %I:%M %p"
}
尝试将'%p'更改为'%p'。是否支持'%P'取决于平台C库提供的'strftime'函数。
我很确定你不能。%p
格式代码是特定于语言环境的"子午线前"(上午)或"子午线后"(下午)的国家表示,视情况而定"。de_DE
是通用的德国语言环境,它定义了国家表示,它恰好是小写的。en_US
语言环境用大写来定义它。使用strftime
等函数的部分原因是它们会为您处理本地化细节。
文档明确提到确切的值完全是特定于语言环境的:
由于格式取决于当前语言环境,因此在对输出值进行假设时应小心。字段顺序会有所不同(例如,"月/日/年"与"日/月/年"),并且输出可能包含使用区域设置的默认编码编码的Unicode字符(例如,如果当前区域设置为ja_JP,则默认编码可以是eucJP、SJIS或utf-8中的任何一种;使用locale.getlocale()来确定当前语言环境的编码)。
en_US
和de_DE
是区域设置。
en_US
= English USde_DE
= German German
在en_US
语言环境中,AM/PM是大写的,而在de_DE
语言环境中,AM/PM是小写的。
您可以使用locale.setlocale(locale.LC_ALL, 'de_DE')
在使用时间格式时更改区域设置,然后在使用时间格式后将其恢复。
为了避免其他日期字段以错误顺序显示的问题,例如'day,month,year'而不是美国首选的'month,day,year',当您使用时间格式选项时,请确保指定了所有字段,而不是标准的短/长时间格式,因为这些格式总是根据区域设置而定。示例,%x
:
%x Locale’s appropriate date representation. 08/16/88 (None);
08/16/1988 (en_US);
16.08.1988 (de_DE)
然而,这样做不是一个好主意,因为月份(例如)将出现在该语言的名称中。所以"May"会以"Mei"的形式出现(包括长、短两种形式)。
肮脏的解决方法是在生成时间字符串后进行搜索并替换:
>>> datetime.strftime(datetime.today(), '%c %p').replace('AM', 'am').replace('PM', 'pm')
'08/10/16 10:37:49 am'
>>> datetime.strftime(datetime.today(), '%c %p').replace(' AM', ' am').replace(' PM', ' pm')
'08/10/16 10:39:19 am'
同样,不建议,因为这会干扰'AM'和'PM'出现的时区部分- 'AMT', 'PMDT', 'GAMT'。如果你没有显示这个或者其他字母,比如month,那么应该没问题。
从你所链接的文档:
因为格式取决于当前的语言环境,所以应该小心在对输出值进行假设时。现场订单将变化(例如,"月/日/年"与"日/月/年"),并且输出可能包含使用区域设置编码的Unicode字符默认编码(例如,如果当前语言环境是js_JP,则默认编码可以是eucJP、SJIS或utf-8中的任何一种;使用locale.getlocale()来确定当前语言环境的编码)。
所以,我不认为你可以用一个简单的格式化选项而不覆盖区域设置,如果你最终覆盖他们的区域设置,可能会激怒用户。
两个建议:
- 使用其他格式化库,比如Django的DateFormat ('a'会给你小写的am/pm)
- 如果你使用的是使用glibc的Linux,那么你可以使用"%P"作为Python的strftime()后端由C-lib的strftime()
另一个选项,虽然有点笨拙,是只存储"AM/PM"将时间戳的一部分赋给另一个变量,然后简单地执行:
my_ampm = now.strftime("%p").lower()