设计-如何处理时间戳(存储)以及何时执行计算;python
我正试图确定(因为我的应用程序正在处理来自不同来源、不同时区、不同格式等的大量数据)如何最好地存储和使用我的数据 例如,我应该将所有内容存储为UTC吗?这意味着当我获取数据时,我需要确定它当前所在的时区,如果不是UTC,则进行必要的转换以使其成为UTC。(注意,我在EST) 那么,在对数据执行计算时,我是否应该提取(比如说UTC)并进入我的时区(EST),这样在查看数据时才有意义?我应该保持UTC格式并进行所有计算吗 这些数据中有很多是时间序列,将被绘制成图表,图表将以EST格式显示 这是一个Python项目,假设我有一个数据结构:设计-如何处理时间戳(存储)以及何时执行计算;python,python,design-patterns,datetime,architecture,system-design,Python,Design Patterns,Datetime,Architecture,System Design,我正试图确定(因为我的应用程序正在处理来自不同来源、不同时区、不同格式等的大量数据)如何最好地存储和使用我的数据 例如,我应该将所有内容存储为UTC吗?这意味着当我获取数据时,我需要确定它当前所在的时区,如果不是UTC,则进行必要的转换以使其成为UTC。(注意,我在EST) 那么,在对数据执行计算时,我是否应该提取(比如说UTC)并进入我的时区(EST),这样在查看数据时才有意义?我应该保持UTC格式并进行所有计算吗 这些数据中有很多是时间序列,将被绘制成图表,图表将以EST格式显示 这是一个P
"id1": {
"interval": 60, <-- seconds, subDict['interval']
"last": "2013-01-29 02:11:11.151996+00:00" <-- UTC, subDict['last']
},
“id1”:{
“interval”:60,我认为最好的方法是将所有时间戳数据存储为UTC。读入时,立即转换为UTC;在显示之前,将UTC转换为本地时区
您甚至可能希望让您的代码将所有时间戳打印两次,一次在本地时间,第二次在UTC时间……这取决于一次需要在屏幕上显示多少数据
我非常喜欢RFC 3339时间戳格式。它对人和机器来说都是明确无误的。它最大的优点是几乎没有任何东西是可选的,所以看起来总是一样的:
2013-01-29T19:46:00.00-08:00
我更喜欢将时间戳转换为单个浮点值进行存储和计算,然后再转换回datetime格式进行显示。我不会将钱保留在浮点值中,但时间戳值在浮点值的精度范围内
使用时间浮动使许多代码变得非常简单:
if time_now() >= last_time + interval:
print("interval has elapsed")
看起来你已经这样做了,所以我不能建议有任何显著的改进
我编写了一些库函数来将时间戳解析为Python时间浮点值,并将时间浮点值转换回时间戳字符串
我建议您查看feed.date.rfc339
.BSD许可证,这样您就可以随意使用代码了
编辑:问题:这对时区有什么帮助
答:如果您存储的每个时间戳都以UTC时间作为Python时间浮点值存储(自历元起的秒数,可选小数部分),您可以直接比较它们;从一个中减去另一个以找出它们之间的间隔;等等。如果您使用RFC 3339时间戳,则每个时间戳字符串都在时间戳字符串中有时区,并且可以通过代码将其正确转换为UTC时间。如果您从浮点值转换为时间戳字符串值,则显示前,时区将与当地时间一致
另外,正如我所说,看起来他已经在做这件事了,所以我认为我不能给出任何令人惊讶的建议。在我看来,你似乎已经在以“正确的方式”做事了。用户可能希望在他们当地的时区(输入和输出)进行交互,但以UTC格式存储规范化日期是正常的,这样可以使它们明确无误并简化计算。因此,尽快将其规范化为UTC,并尽可能晚地进行本地化
有关Python和时区处理的少量信息可以在此处找到:
我目前的偏好是将日期作为unix时间戳tv_sec
值存储在后端存储中,并在处理过程中转换为Pythondatetime.datetime
对象。处理通常使用UTC时区中的datetime
对象完成,然后在输出之前转换为本地用户的时区。我d具有丰富的对象,例如datetime.datetime
有助于调试
时区是一个需要处理的麻烦问题,您可能需要根据具体情况确定是否值得为正确支持时区而付出努力
例如,假设您正在计算每天使用的带宽计数。可能会出现以下问题:
在夏令时边界上会发生什么情况?为了便于计算,您是否应该假设一天始终为24小时,或者您是否需要始终检查每天的计算结果,以确定一天在夏令时边界上的时间可能少于或多于24小时
在显示本地化时间时,是否重复某个时间是否重要?例如,如果您在localtime中显示了一个小时报告,但没有附加时区,那么用户是否会因为缺少一小时的数据或夏令时更改前后重复一小时的数据而感到困惑
就我个人而言,我使用的是Unix时间标准,它的存储非常方便,因为它的表示形式很简单,它只是一个数字序列。因为它在内部表示UTC时间,所以在存储之前,您必须确保正确地生成它(从其他时间戳转换),并根据您想要的任何时区对其进行相应的格式化
一旦在后端数据中有了通用的时间戳格式(tz-aware),就可以很容易地绘制数据,只需设置目标tz即可
例如:
import time
import datetime
import pytz
# print pre encoded date in your local time from unix epoch
example = {"id1": {
"interval": 60,
"last": 1359521160.62
}
}
#this will use your system timezone formatted
print time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(example['id1']['last']))
#this will use ISO country code to localize the timestamp
countrytz = pytz.country_timezones['BR'][0]
it = pytz.timezone(countrytz)
print it.localize(datetime.datetime.utcfromtimestamp(example['id1']['last']))
正如我所看到的,您似乎没有任何实现问题,因此我更愿意关注设计方面,而不是代码和时间戳格式。我有参与导航系统网络支持设计的经验,该导航系统在本地网络中作为分布式系统实现。该系统的性质是,我有很多数据(通常是冲突的)来自不同的来源,因此解决可能的冲突和保持数据完整性是相当棘手的。只是基于这些经验的一些想法
即使在包含许多计算机的分布式系统中,如果您不需要比一个pr更高的分辨率,时间戳数据通常也不是问题
import time
import datetime
import pytz
# print pre encoded date in your local time from unix epoch
example = {"id1": {
"interval": 60,
"last": 1359521160.62
}
}
#this will use your system timezone formatted
print time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(example['id1']['last']))
#this will use ISO country code to localize the timestamp
countrytz = pytz.country_timezones['BR'][0]
it = pytz.timezone(countrytz)
print it.localize(datetime.datetime.utcfromtimestamp(example['id1']['last']))