我希望能够将这个问题及其答案作为处理夏令时的权威指南,特别是处理实际的变更问题.
如果您有任何要添加的内容,请执行此操作
许多系统依赖于保持准确的时间,问题在于由于夏令时改变时间 - 向前或向后移动时钟.
例如,在订单获取系统中有一个业务规则取决于订单的时间 - 如果时钟发生变化,规则可能不那么明确.如何保持订单的时间?当然有无数的场景 - 这只是一个说明性的场景.
同样重要的是,如果不是这样的话:
我会对编程,操作系统,数据持久性和该问题的其他相关方面感兴趣.
一般答案很好,但我也希望看到细节,特别是如果它们只在一个平台上可用.
有没有办法在Python中以高精度测量时间---比一秒更精确?我怀疑是否有跨平台的方式来做到这一点; 我对Unix上的高精度时间感兴趣,特别是在Sun SPARC机器上运行的Solaris.
timeit似乎能够进行高精度的时间测量,但我不想测量代码片段需要多长时间,而是想直接访问时间值.
我一直在努力找到一种方法来获取自1970-01-01 00:00:00 UTC以来的时间,以秒为单位,在python中以纳秒为单位,我找不到能给我正确精度的任何东西.
我尝试过使用时间模块,但是精度只有几微秒,所以我尝试的代码是:
import time
print time.time()
Run Code Online (Sandbox Code Playgroud)
这给了我这样的结果:
1267918039.01
Run Code Online (Sandbox Code Playgroud)
但是,我需要一个看起来像这样的结果:
1267918039.331291406
Run Code Online (Sandbox Code Playgroud)
有谁知道以秒和纳秒表达UNIX时间的可能方法?我找不到设置正确精度或以正确格式获得结果的方法.感谢您的任何帮助
我正在尝试做一些非常简单的事情,将datetime
对象将来三天转换为Unix UTC时间戳:
import datetime, time
then = datetime.datetime.now() + datetime.timedelta(days=3)
# Method 1
print then.strftime("%s")
# Method 2
print time.mktime(then.timetuple())
# Method 3
print time.mktime(then.timetuple()) * 1000
Run Code Online (Sandbox Code Playgroud)
方法1和2给我的Unix时间,秒,毫秒不和方法3给我毫秒,没有实际精确到毫秒.
当我简单地打印时then
,我得到了datetime.datetime(2011, 11, 19, 15, 16, 8, 278271)
,所以我知道精度可用几毫秒.如何获得具有实际毫秒精度的Unix时间戳?如果它作为一个浮动返回,我必须将它变平为一个int
,这没关系.有没有我正在寻找的解决方案呢?
我有一个datetime
utc时区,例如:
utc_time = datetime.datetime.utcnow()
Run Code Online (Sandbox Code Playgroud)
还有一个pytz时区对象:
tz = timezone('America/St_Johns')
Run Code Online (Sandbox Code Playgroud)
转换utc_time
到给定时区的正确方法是什么?
我有以下方法:
# last_updated is a datetime() object, representing the last time this program ran
def time_diff(last_updated):
day_period = last_updated.replace(day=last_updated.day + 1,
hour=1,
minute=0,
second=0,
microsecond=0)
delta_time = day_period - last_updated
hours = delta_time.seconds // 3600
# make sure a period of 24hrs have passed before shuffling
if hours >= 24:
print "hello"
else:
print "do nothing"
Run Code Online (Sandbox Code Playgroud)
我想知道从那以后24小时过去了last_updated
,我怎么能这样做last_updated
呢?
time.time()方法为您提供时间戳,该时间戳基本上是自纪元(以UTC为单位)以来经过的时间.
datetime.fromtimestamp()表示如果未提供tz参数,则返回本地日期时间对象.
我知道tz信息基本上被视为utc的偏移量以获得当地时间.
如果是这种情况,则必须从平台中提取utc中的当前时间.
从底层平台提取当天的当前时间,无论是本地还是UTC?
from datetime import datetime
import time
for i in range(1000):
curr_time = datetime.now()
print(curr_time)
time.sleep(0.0001)
Run Code Online (Sandbox Code Playgroud)
我正在测试 的分辨率datetime.now()
。由于它应该以微秒为单位输出,因此我预计每次打印都会有所不同。
然而,我总是得到类似的东西。
...
2015-07-10 22:38:47.212073
2015-07-10 22:38:47.212073
2015-07-10 22:38:47.212073
2015-07-10 22:38:47.212073
2015-07-10 22:38:47.212073
2015-07-10 22:38:47.212073
2015-07-10 22:38:47.212073
2015-07-10 22:38:47.212073
2015-07-10 22:38:47.212073
2015-07-10 22:38:47.212073
2015-07-10 22:38:47.212073
2015-07-10 22:38:47.212073
2015-07-10 22:38:47.212073
2015-07-10 22:38:47.213074
2015-07-10 22:38:47.213074
2015-07-10 22:38:47.213074
2015-07-10 22:38:47.213074
2015-07-10 22:38:47.213074
2015-07-10 22:38:47.213074
2015-07-10 22:38:47.213074
2015-07-10 22:38:47.213074
2015-07-10 22:38:47.213074
2015-07-10 22:38:47.213074
2015-07-10 22:38:47.213074
...
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况?有什么方法可以获得精确到微秒的时间戳吗?实际上我不需要微秒,但能获得 0.1 毫秒的分辨率就很好了。
===更新====
我将其与使用 time.perf_counter() 进行比较,并添加到起始datetime
日期时间导入日期时间、timedelta 导入时间 …
当运行 python(Windows 或 Linux)的计算机的时钟自动更改并调用时会发生time.time()
什么?
我读过time.time()
当时钟手动更改为过去的某个值时, 的值会更小。
我正在玩Python的datetime.datetime.utcnow()方法,我注意到微秒值始终是相同的.
>>> import datetime
>>> datetime.datetime.utcnow()
datetime.datetime(2015, 11, 16, 23, 20, 46, 42286)
>>> datetime.datetime.utcnow()
datetime.datetime(2015, 11, 16, 23, 20, 55, 505286)
>>> datetime.datetime.utcnow()
datetime.datetime(2015, 11, 16, 23, 21, 1, 552286)
Run Code Online (Sandbox Code Playgroud)
注意微秒值是如何总是286.为什么会这样?我该怎么做才能解决这个问题?
更多信息:time.time()
也总是有286us.毫秒值很好.我认为这实际上是根本原因,因为我相信datetime.datetime.utcnow()会调用time.time().
这是一个简短的脚本,表明它不仅仅是运气:
import datetime, random, time
for wait_time in [random.random() for _ in range(10)]:
time.sleep(wait_time)
print("Waited {}, result {}".format(wait_time, datetime.datetime.utcnow()))
Run Code Online (Sandbox Code Playgroud)
结果:
Waited 0.6074311218736113, result 2015-11-16 23:35:24.603286
Waited 0.960317012489652, result 2015-11-16 23:35:25.563286
Waited 0.13555474339177553, result 2015-11-16 23:35:25.698286
Waited 0.6179213307667111, result 2015-11-16 23:35:26.315286
Waited 0.2872301475401443, result 2015-11-16 23:35:26.602286 …
Run Code Online (Sandbox Code Playgroud) python ×9
datetime ×6
time ×5
timezone ×3
utc ×3
dst ×2
python-3.4 ×2
posix ×1
python-2.7 ×1
python-3.x ×1
pytz ×1
save ×1
windows ×1