V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
xiaoyong
V2EX  ›  问与答

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

  •  
  •   xiaoyong · 2014-11-20 09:48:59 +08:00 · 3001 次点击
    这是一个创建于 3650 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如果是连续的时间,还好计算。后几种复杂的,想了好几天查了相关的资料,一直没有解决。希望各位提供个思路。多谢。
    10 条回复    2014-11-21 19:08:53 +08:00
    Lycnir
        1
    Lycnir  
       2014-11-20 10:30:29 +08:00   ❤️ 1
    你可以参考 dateutil 库
    xiaoyong
        2
    xiaoyong  
    OP
       2014-11-20 11:39:30 +08:00
    @Lycnir 你好,看了下你说的dateutil库,但是还没有解决。具体点说:例如选择“每周举行”一个开始时间和一个结束时间,中间又选择了“周三”“周五”两天,如果查询条件是“最近3天”怎么存储前面选择日期和时间才可以从数据库查询出来。目前使用的mysql。
    rrfeng
        3
    rrfeng  
       2014-11-20 11:45:05 +08:00
    『最近』功能我觉得是计算好了日期存储的。

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

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

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

    浅见,莫喷。
    Lycnir
        7
    Lycnir  
       2014-11-20 15:50:09 +08:00   ❤️ 1
    @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
        8
    xiaoyong  
    OP
       2014-11-21 19:06:03 +08:00
    @shakoon 这个方法我想过,但是如果选择的活动开始时间至结束时间比较长并且选择周一、二、三、四、五、六(不选日)的话,存储的数据条数会成倍数级别增加。
    xiaoyong
        9
    xiaoyong  
    OP
       2014-11-21 19:07:07 +08:00
    @rrfeng 也算是一种思路。谢
    xiaoyong
        10
    xiaoyong  
    OP
       2014-11-21 19:08:53 +08:00
    @Lycnir 谢谢。我决定使用你这种方法试试。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2374 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 16:00 · PVG 00:00 · LAX 08:00 · JFK 11:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.