关于日期计算,豆瓣同城活动发布时的“活动时间”如果选择“连续多天”和“每周举行”甚至“自定义”时,在活动列表页是怎么根据查询的条件“周末”“最近一周”等计算的。

2014-11-20 09:48:59 +08:00
 xiaoyong
如果是连续的时间,还好计算。后几种复杂的,想了好几天查了相关的资料,一直没有解决。希望各位提供个思路。多谢。
3016 次点击
所在节点    问与答
10 条回复
Lycnir
2014-11-20 10:30:29 +08:00
你可以参考 dateutil 库
xiaoyong
2014-11-20 11:39:30 +08:00
@Lycnir 你好,看了下你说的dateutil库,但是还没有解决。具体点说:例如选择“每周举行”一个开始时间和一个结束时间,中间又选择了“周三”“周五”两天,如果查询条件是“最近3天”怎么存储前面选择日期和时间才可以从数据库查询出来。目前使用的mysql。
rrfeng
2014-11-20 11:45:05 +08:00
『最近』功能我觉得是计算好了日期存储的。

比如存储最近100 天的所有活动,然后查询。肯定不是直接按原始条件计算,多费劲啊
xiaoyong
2014-11-20 12:24:10 +08:00
@rrfeng 每一个活动应该都是单独存储的原始的时间戳+其他条件。否则,计算时无法完成。而且查询条件有多种“明天”“最近3天”“一周内”“周末”等等多种,都需要有自己的计算方法。
shakoon
2014-11-20 12:57:15 +08:00
最简单的办法,在保存时直接计算出该活动的每一个具体日期,存入另一个字段,列表展示所有活动时用这个新字段来做筛选条件
rrfeng
2014-11-20 12:59:21 +08:00
@xiaoyong
如果我做的话,会采用这么一种方案。

1. 存储创建时间和时间定义规则。
2. 单独一个表存储『100 天内的所有活动』。在活动创建时,和每天定时更新。根据所有活动的 1 计算结果并储存。

这样的好处是,查询时非常快,不需要重复计算。
比如我查了 3 天内,再查 5 天内,无论何种算法你都需要遍历 2 次活动并计算活动时间。

浅见,莫喷。
Lycnir
2014-11-20 15:50:09 +08:00
@xiaoyong
表设计的话: 1个活动有起始时间和结束时间,建议存储时间戳
1. 比如我建了个活动: 20号~25号,周三周五8:00~10:00,那么你可以先用dateutil.rrule列出这期间的周三周五的日期只有1个datetime.datetime(2014,11,21,0,0,0),然后加上时间存储.
2. 然后查询的"最近3天",你可能需要获取3天前0点的时间戳和3天后0点的时间戳,符合相应的条件列出来应该就行了
xiaoyong
2014-11-21 19:06:03 +08:00
@shakoon 这个方法我想过,但是如果选择的活动开始时间至结束时间比较长并且选择周一、二、三、四、五、六(不选日)的话,存储的数据条数会成倍数级别增加。
xiaoyong
2014-11-21 19:07:07 +08:00
@rrfeng 也算是一种思路。谢
xiaoyong
2014-11-21 19:08:53 +08:00
@Lycnir 谢谢。我决定使用你这种方法试试。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/147923

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX