从文本文件解析日期/时间时,如何计算夏令时?

时间:2015-11-11 21:38:54

标签: python mongodb unix-timestamp dst

我编写了一个python脚本来将原始文本解析为可用数据,但是最近的DST时间更改已经抛弃了。这是一些文本,特别是导致问题的部分:

11/1/2015   1:00:37 AM  3.14    0.00    4.18  
11/1/2015   1:30:37 AM  3.14    0.00    4.18  
11/1/2015   1:00:39 AM  3.14    0.00    4.18  
11/1/2015   1:30:39 AM  3.14    0.00    4.18  
11/1/2015   2:00:40 AM  3.14    0.00    4.18

文本文件定期更新并同步到dropbox。在脚本的第一次运行时,它使用与文件的每一行对应的文档填充mongodb集合。每个文档包含一个日期时间(为了在mongo shell中的可读性),timeStamp以及与文件中的数据相对应的其他字段。

填充集合后,每15秒运行一次循环,将文件中的行数与集合中的文档数进行比较。如果文件包含更多行,则脚本将读取文件中的最低行并将其解析为可添加到数据库的文档。它将此潜在新文档的timeStamp与集合中的最新文档

进行比较
if(newdataDate > latestDate):
    db.LiqLog.insert(newdata)
elif(newdataDate < latestDate):
    #Throw error, end script

如何让DST导致我的脚本帐户更改日志文件?我能想到的唯一方法是硬编码未来的DST时间变化并解决这些问题。这个脚本可能会在我们的实验室服务器上连续运行多年,而且由于我无法知道它需要运行多长时间,因此最好能够在不需要硬编码日期的情况下处理DST。

编辑:我发现online DST总是在3月的第二个星期日开始,到11月的第二个星期日结束。我将尝试使用此功能,并且一旦我取得进展,我将再次编辑此帖子。到目前为止,谢谢大家的帮助。

3 个答案:

答案 0 :(得分:4)

最好的办法是存储所有日期&amp;以UTC为单位的时间,也就是GMT,并将它们与其他UTC时间进行比较。如果您使用当地时间,您还应该存储时间偏移或标记,以表明日光开关是否已经发生,因为某些当地时间是不明确的,例如早上1:30,钟表在秋季回归,但它变得非常混乱。

在GMT中操纵时间的示例:

import time, calendar
seconds = int(time.time())
print(seconds)
gmtstruct = time.gmtime(seconds)
timeformat = "%Y-%m-%d %H:%M:%S"
timestr = time.strftime(timeformat, gmtstruct)
print(timestr + " +0000")
readstruct = time.strptime(timestr, timeformat)
readseconds = calendar.timegm(readstruct)
print(readseconds)

输出:

1447279828
2015-11-11 22:10:28 +0000
1447279828

我是在当地时间下午5:10(美国东部时间)运行的,因此GMT时间格式为22:10。我添加了“+0000”表示该区域的未来用户的时区是GMT。

答案 1 :(得分:0)

这非常棘手,因为您不是存储日期时间对象,而是存储平面文本。您必须以某种方式将时区数据存储在平面文件中。我没有任何其他可想到的方法来解释DST。

即使这样,也有一些极端情况,你无法弄清楚哪一条记录在另一条记录之前。例如:

11/1/2015   1:30:39 AM  3.14    0.00    4.18
11/1/2015   1:59:59 AM  3.14    0.00    4.18  

假设我们在凌晨2点(即凌晨1:59:59 - >凌晨1点00:00)获得了一个小时,就我所知,无法知道哪条记录最先出现。 Pytz适用于处理时区数据,无论您有什么价值。

答案 2 :(得分:0)

更简单的答案是将脚本更改为:

if(newdataDate > latestDate):
    db.LiqLog.insert(newdata)
elif(newdataDate < latestDate):
    print("Warning: DST switch detected")
    db.LiqLog.insert(newdata)

是否有任何其他错误情况可能导致文件中的新日期早于上一个日期?

为什么你需要检查日期?如果已向文件写入额外的行,是否总是要插入新数据?