我正在尝试更新一个字符串,该字符串应根据当前区域设置是使用AM / PM还是24小时来显示不同的时间
如果可以确定区域设置,我可以使用strftime("%I:%M %p")
或strftime("%H:%M")
更新时间字符串,具体取决于区域设置
如何以编程方式确定当前区域设置是使用AM / PM还是24小时?
或者是否有更好的方法来达到相同的目标(根据我的软件运行的区域设置显示不同的时间)?
感谢您的帮助和亲切的问候, Tord
答案 0 :(得分:1)
免责声明1:仅在具有glibc的GNU / Linux上进行了测试。在Windows,macOS,具有非GNU libc的Linux以及其他操作系统上,您的里程可能会有所不同。
免责声明2:我在musl libc的Alpine Linux上对此进行了测试,但它不起作用。在使用Docker时,您可能会遇到这种情况,因为Alpine在制作简约的容器映像方面非常受欢迎。
使用此:
import locale
locale.setlocale(locale.LC_TIME, locale.getdefaultlocale(("LC_TIME",)))
comment的@ShadowRanger引起了我的注意:
鉴于the
strftime
/strptime
docs中en_US
的“适合语言环境的时间”是用24小时制呈现的(%X
在21: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)
在这里我们可以看到两件事:
'C'
相同。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