Use Python to find out if a timezone currently in daylight savings time
本问题已经有最佳答案,请猛点这里访问。
我们有一台在GMT时间运行的服务器。 我需要编写一个Python脚本来确定它是否是加利福尼亚州洛杉矶的当前(在此第二个)夏令时(DST)。 我怎么能做到这一点? 我看了一下pytz和时间,但我无法弄明白。 我意识到我可以创建一些逻辑,比如将LA中的当前时间与GMT时间进行比较,但如果我可以使用标准库,那将会更加清晰。
谢谢
编辑:这是我设置时区的一些示例代码:
1 2 3 4 5 6 | from pytz import timezone import pytz from datetime import datetime, timedelta tz = timezone('America/Los_Angeles') // Instantiate a datetime object using tz? |
编辑:这是一段可行的代码片段。 它不优雅,这就是为什么我要问是否有一个图书馆或为此而制作的东西。 也许像is_dst()函数。
1 2 3 4 5 6 7 8 9 | utc = timezone("UTC") now = utc.localize(datetime.utcnow()) los_angeles_tz = timezone('America/Los_Angeles') los_angeles_time = now.astimezone(los_angeles_tz) delta = los_angeles_time.utcoffset() dstDelta = timedelta(hours=-8) is_dst = (delta == dstDelta) |
1 2 3 4 5 6 7 | import pytz from datetime import datetime, timedelta def is_dst(zonename): tz = pytz.timezone(zonename) now = pytz.utc.localize(datetime.utcnow()) return now.astimezone(tz).dst() != timedelta(0) |
用法:
1 2 3 4 5 | >>> is_dst("America/Los_Angeles") False >>> is_dst("America/Sao_Paulo") True |
1 2 3 4 | from datetime import datetime import pytz isdst_now_in = lambda zonename: bool(datetime.now(pytz.timezone(zonename)).dst()) |
例:
1 2 3 4 | >>> isdst_now_in("America/Los_Angeles") # 2014-10-27 12:32:07 PDT-0700 True >>> isdst_now_in("Australia/Melbourne") # 2014-10-28 06:32:07 AEDT+1100 True |
这是Unix上使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import os import time from contextlib import contextmanager @contextmanager def local_timezone(zonename): #NOTE: it manipulates global state oldname = os.environ.get('TZ') try: os.environ['TZ'] = zonename time.tzset() yield finally: if oldname is None: del os.environ['TZ'] else: os.environ['TZ'] = oldname time.tzset() def time_isdst_now_in(zonename): with local_timezone(zonename): return time.localtime().tm_isdst > 0 |
用法是一样的:
1 2 | >>> time_isdst_now_in('Europe/London') # 2014-04-17 18:42:11 BST+0100 True |
注意:由于某些边缘情况中的问题,未使用