如何检查当前区域设置是使用AM / PM还是24小时?

时间:2017-01-26 02:15:01

标签: python python-3.x datetime locale

我正在尝试更新一个字符串,该字符串应根据当前区域设置是使用AM / PM还是24小时来显示不同的时间

如果可以确定区域设置,我可以使用strftime("%I:%M %p")strftime("%H:%M")更新时间字符串,具体取决于区域设置

如何以编程方式确定当前区域设置是使用AM / PM还是24小时?

或者是否有更好的方法来达到相同的目标(根据我的软件运行的区域设置显示不同的时间)?

感谢您的帮助和亲切的问候, Tord

3 个答案:

答案 0 :(得分:1)

免责声明1:仅在具有glibc的GNU / Linux上进行了测试。在Windows,macOS,具有非GNU libc的Linux以及其他操作系统上,您的里程可能会有所不同。

免责声明2:我在musl libc的Alpine Linux上对此进行了测试,但它不起作用。在使用Docker时,您可能会遇到这种情况,因为Alpine在制作简约的容器映像方面非常受欢迎。


tl; dr

使用此:

import locale

locale.setlocale(locale.LC_TIME, locale.getdefaultlocale(("LC_TIME",)))

问题

comment@ShadowRanger引起了我的注意:

鉴于the strftime/strptime docsen_US的“适合语言环境的时间”是用24小时制呈现的(%X21:30:00语言环境下产生en_US) ,我怀疑Python语言环境信息是否表明本地标准是12或24小时制。美国的12小时制几乎是100%,但是语言环境的时间表示是24小时。

让我们尝试找出这里发生了什么。

locale.getdefaultlocale()函数的文档为我们提供了提示:

根据POSIX,未调用setlocale(LC_ALL, '')的程序使用可移植的'C'语言环境运行。

CPython默认使用'C'语言环境,其时间表示似乎是24小时:

$ LC_TIME=C date
Tue Oct 27 13:06:54 UTC 2020
$ LC_TIME=en_US.UTF-8 date
Tue Oct 27 01:06:54 PM UTC 2020
$ TZ=UTC LC_TIME=de_DE.UTF-8 date
Di 27. Okt 13:06:54 UTC 2020

让我们确认一下:

$ LC_TIME=en_US.UTF-8 python3
>>> import locale
>>> import time
>>> locale.getlocale(locale.LC_TIME)
(None, None)
>>> time.strftime("%p")
'PM'
>>> time.strftime("%X")
'13:03:34'
>>> locale.setlocale(locale.LC_TIME, 'C')
'C'
>>> locale.getlocale(locale.LC_TIME)
(None, None)

在这里我们可以看到两件事:

  1. 未设置默认语言环境与将其设置为'C'相同。
  2. 未在Python中显式使用LC_TIME环境变量就不会产生任何效果。

我想知道如果%p不使用%X时为什么设置了它? ?️

解决方案

要使程序符合我们的语言环境偏好,我们需要调用locale.setlocale()并为其提供LC_TIME

$ LC_TIME=en_US.UTF-8 python3
>>> import locale
>>> import time
>>> locale.setlocale(locale.LC_TIME, locale.getdefaultlocale(('LC_TIME',)))
'en_US.UTF-8'
>>> time.strftime("%p")
'PM'
>>> time.strftime("%X")
'01:03:59 PM'
$ LC_TIME=de_DE.UTF-8 python3
>>> import locale
>>> import time
>>> locale.setlocale(locale.LC_TIME, locale.getdefaultlocale(('LC_TIME',)))
'de_DE.UTF-8'
>>> time.strftime("%p")
''
>>> time.strftime("%X")
'13:06:13'

答案 1 :(得分:0)

Tord,行为很奇怪,但这适用于Windows 7.请注意,在设置语言环境之前,时间显示为24小时。设置区域设置后,使用12小时AM / PM设置显示。这是我笔记本电脑的正确设置。

Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import locale
>>> import time
>>> cur_locale = locale.getlocale() # current locale setting
>>> cur_locale
('English_United States', '1252')
>>> time.strftime("%X") # %X - Locale’s appropriate time representation
'20:01:47'
>>> locale.setlocale(locale.LC_TIME, cur_locale)
'English_United States.1252'
>>> time.strftime("%X") # %X - Locale’s appropriate time representation
'8:02:11 PM'
>>> 

答案 2 :(得分:0)

time.strftime()函数与%p参数一起使用将为当前语言环境中的AM / PM提供等效项,对于不使用AM / PM的语言环境,将返回空字符串。我用以下方式使用它:

time_format_string = "%H:%M"  # Ex: Sweden
if time.strftime("%p"):  # Checking if the string contains something
    time_format_string = "%I:%M %p"  # Ex: US
time_of_day_string = time.strftime(time_format_string)
print(time_of_day_string)

我已经尝试过这两个语言环境(一个用于,另一个没有AM / PM)

参考: https://docs.python.org/3.6/library/time.html#time.strftime