- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
好的,首先让我说我的时区是 CET/CEST。它从 CEST 变为 CET(从 DST(即 GMT+2)返回到正常(即 GMT+1))的确切时刻始终是 10 月的最后一个星期日凌晨 3 点。 2010 年是 10 月 31 日凌晨 3 点。
现在请注意以下几点:
>>> import datetime
>>> import pytz.reference
>>> local_tnz = pytz.reference.LocalTimezone()
>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 31, 2, 12, 30))
datetime.timedelta(0, 3600)
如上所述,这是错误的。
>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 30, 2, 12, 30))
datetime.timedelta(0, 7200)
>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 31, 2, 12, 30))
datetime.timedelta(0, 7200)
现在突然正确了:/
我知道已经有几个问题,但给出的解决方案始终是“使用本地化”,但我的问题是 LocalTimezone 不提供该方法。
事实上,我有几个以毫秒为单位的时间戳,我需要本地时区的 utcoffset(不仅是我的,而是任何使用该程序的人)。其中之一是我的时区中的 1288483950000 或 Sun Oct 31 2010 02:12:30 GMT+0200 (CEST)。
目前我执行以下操作来获取日期时间对象:
datetime.datetime.fromtimestamp(int(int(millis)/1E3))
这可以在几分钟内获得 utcoffset:
-int(local_tnz.utcoffset(date).total_seconds()/60)
不幸的是,这在很多情况下都是错误的:(。
有什么想法吗?
注意:我使用的是 python3.2.4,在这种情况下并不重要。
编辑:
感谢@JamesHolderness,找到了解决方案:
def datetimeFromMillis(millis):
return pytz.utc.localize(datetime.datetime.utcfromtimestamp(int(int(millis)/1E3)))
def getTimezoneOffset(date):
return -int(date.astimezone(local_tz).utcoffset().total_seconds()/60)
local_tz 等于 tzlocal 模块中的 tzlocal.get_localzone()。
最佳答案
根据Wikipedia ,夏令时的转换发生在 01:00 UTC。
在 00:12 UTC 时,您仍处于中欧夏令时(即 UTC+02:00),因此本地时间为 02:12。
在 01:12 UTC,您又回到标准的欧洲中部时间(即 UTC+01:00),因此本地时间又是 02:12。
从夏令时改回标准时间时,本地时间会从 02:59 变回 02:00,并且小时会重复。因此,当询问 02:12(本地时间)的 UTC 偏移量时,答案可能是 +01:00 或 +02:00 - 这取决于您所谈论的 02:12 版本。
在进一步调查 pytz 库时,我认为您的问题可能是您不应该使用 pytz.reference 实现,它可能无法很好地处理这些歧义。引用源代码中的注释:
Reference tzinfo implementations from the Python docs. Used for testing against as they are only correct for the years 1987 to 2006. Do not use these for real code.
在 pytz 中处理模棱两可的时间
你应该做的是为适当的时区构造一个 timezone 对象:
import pytz
cet = pytz.timezone('CET')
然后您可以使用 utcoffset 方法来计算该时区中日期/时间的 UTC 偏移量。
dt = datetime.datetime(2010, 10, 31, 2, 12, 30)
offset = cet.utcoffset(dt)
请注意,上面的示例将抛出 AmbiguousTimeError 异常,因为它无法判断您指的是 02:12:30 的两个版本中的哪一个。幸运的是,pytz 会让你通过设置 is_dst 参数来指定你想要 dst 版本还是标准版本。例如:
offset = cet.utcoffset(dt, is_dst = True)
请注意,在所有对 utcoffset 的调用中设置此参数并没有什么害处,即使时间不会有歧义。根据文档,它仅在 DST 过渡模糊期使用以解决这种模糊性。
如何处理时间戳
至于处理时间戳,最好尽可能长时间地将它们存储为 UTC 值,否则最终可能会丢弃有值(value)的信息。所以首先使用 datetime.utcfromtimestamp 方法转换为 UTC 日期时间。
dt = datetime.datetime.utcfromtimestamp(1288483950)
然后使用 pytz 将时间本地化为 UTC,因此时区附加到 datetime 对象。
dt = pytz.utc.localize(dt)
最后,您可以将该 UTC 日期时间转换为您的本地时区,并获取时区偏移量,如下所示:
offset = dt.astimezone(cet).utcoffset()
请注意,这组计算将为 1288483950 和 1288487550 生成正确的偏移量,即使这两个时间戳都由 CET 时区中的 02:12:30 表示。
确定本地时区
如果您需要使用计算机的本地时区而不是固定时区,则不能直接从 pytz 执行此操作。您也不能只使用 time.tzname 中的时区名称构造一个 pytz.timezone 对象,因为 pytz 并不总是能够识别名称。
解决方案是使用 tzlocal module - 它的唯一目的是在 pytz 中提供这个缺失的功能。你可以这样使用它:
import tzlocal
local_tz = tzlocal.get_localzone()
get_localzone() 函数返回一个 pytz.timezone 对象,因此您应该能够在我使用过 的所有地方使用该值上面示例中的 cet 变量。
关于python - 使用本地时区在 Python 中获取正确的时区偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17733139/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!