如何使python的datetime对象显示小写AM和PM



这里: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_USde_DE是区域设置。

en_US = English US
de_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()

相关内容

  • 没有找到相关文章

最新更新