首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JSON的Python日期时间

使用JSON的Python日期时间
EN

Stack Overflow用户
提问于 2016-04-24 00:42:00
回答 1查看 580关注 0票数 0

我有一个Python2.7API,它查询SQL并提供一个JSON字典列表,然后在引导/Django站点中使用这些字典。

DB中的日期是'2017-04-20 00:00:00'格式的字符串,但有时源数据的时间为十进制,这会给strptime带来麻烦,所以我只保留字符串的前10个字符,从而删除秒。

代码语言:javascript
复制
import datetime

dict_list = response['my_list_of_dicts']
for dt_to_cmpr in dict_list:
    dt_to_cmpr['date_key'] = dt_to_cmpr['date_key'][:10]

在比较日期范围之前,日期必须是日期时间而不是字符串。(注意:对于生产,我计划考虑一些例外情况,例如null值。)

代码语言:javascript
复制
    dt_to_cmpr['date_key'] = datetime.datetime.strptime(dt_to_cmpr['date_key'], 
        '%Y-%m-%d')

我想知道关于字典的事情,从今天开始,date_key大概不会超过90天。(即时间框架中的总数,或每个字典的price_key之和)。

代码语言:javascript
复制
under_days = datetime.timedelta(days=-1)
over_days = datetime.timedelta(days=91)
now = datetime.datetime.now()

ttl_within_90days = sum(1 for d in response['my_list_of_dicts'] if (under_days <
    (d.get('date_key')-now) < over_days))

一个问题是,现在我已经转换了我的约会对象,而不是JSON serializable。所以,现在我得把它们再放回一根绳子里

代码语言:javascript
复制
for dt_to_cmpr in dict_list:
    dt_to_cmpr['date_key'] = dt_to_cmpr['date_key'].strftime("%Y-%m-%d")

为了简单起见,我清理了上面的内容,但这一切都应该是可行的。当它到达Django时,视图将再次将它们都隐藏回日期,以便在模板中使用。

我可以让Python把我的日期字符串当作90天比较的时间来处理,但不要把它们放在一边。或者让JSON使用Python时间?每个页面加载的迭代次数都很慢,不可能是最好的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-24 01:10:07

主要问题是存储日期时间的方式。您应该将它们作为实际的日期时间存储在数据库中,而不是字符串中。不能对字符串字段执行日期查询。相反,您必须使用低效的方法来查询所有记录,然后在python中过滤所有记录。创建数据库数据类型是有原因的,请使用它们。

没有理由将日期时间转换为字符串,除非在需要将其格式化为json或html的最后时刻,唯一需要这样做的代码是Django应用程序。这意味着:

  • Django应用程序几乎完全应该使用datetimes。它只在需要呈现出html或json时才会隐藏到字符串中。
  • 您的API应该只使用python。
  • 您的数据库也应该只使用日期时间。

如果您不控制数据库,最好的情况是2次转换

  1. 当从数据库中提取数据时,string -> datetime
  2. 序列化为html或json时的datetime -> string

如果您可以修复数据库,那么您只需要进行第二次转换。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36818043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档