Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 向重复事件添加持续时间';s开始时间,以便它';s端总是在同一时间(即下午2点到4点)_Javascript_Date_Datetime - Fatal编程技术网

Javascript 向重复事件添加持续时间';s开始时间,以便它';s端总是在同一时间(即下午2点到4点)

Javascript 向重复事件添加持续时间';s开始时间,以便它';s端总是在同一时间(即下午2点到4点),javascript,date,datetime,Javascript,Date,Datetime,我有一堆rrules(在中实现),它们为我提供了一系列事件开始时间(请参阅)rulle.js或endtime。。。所以它可以告诉我第一百万次重复事件开始的确切日期,而不是它结束的确切日期。事实证明,我真的想知道一个活动何时结束,所以我必须发挥创意。在我看来,我有两个选择 DB端:存储一个rrule字符串+一个事件duration 客户端:从rrule字符串重建事件开始日期数组。只有开始时间是已知的,而结束时间将通过将持续时间作为偏移量添加到数组中的每个开始时间来计算 DB端:存储修改后的rrul

我有一堆rrules(在中实现),它们为我提供了一系列事件开始时间(请参阅)
rulle.js
endtime
。。。所以它可以告诉我第一百万次重复事件开始的确切日期,而不是它结束的确切日期。事实证明,我真的想知道一个活动何时结束,所以我必须发挥创意。在我看来,我有两个选择

  • DB端:存储一个rrule字符串+一个事件
    duration

    客户端:从rrule字符串重建事件开始日期数组。只有
    开始时间
    是已知的,而
    结束时间
    将通过将持续时间作为偏移量添加到数组中的每个开始时间来计算

  • DB端:存储修改后的rrule字符串,该字符串编码
    endtime

    客户端:一个特殊的包装函数读取修改后的rrule字符串,并将其重建为两个日期数组;一个表示事件开始时间,另一个表示事件结束时间

  • 选项1似乎更容易,但我怀疑它会遇到夏令时的问题。例如,假设我每周二下午6点到周三凌晨2点有一个活动。在这种情况下,我会在我的数据库中存储一个8小时的持续时间,与那个字符串化的文件一起。现在让我们快速地向前看未来的任何一个下午6点。我的活动是否总是在周三凌晨2点结束(或者8小时的持续时间有时使我的活动在凌晨1点或3点结束)我如何让它总是在凌晨2点结束?

    。。。如果你知道答案,那就别在这里读了

    我看到其他人如何处理持续时间偏移 根据Kip的说法,抵消约会时间的聪明方法是使用一个奇特的库,比如moment.js

    他强调了这一点,通过展示使用非花哨的日期-时间库(展示了一个天真的分钟偏移函数是如何由于夏令时而失败的)来说明事情是多么容易出错

    但奇怪的事情发生在我身上。上述功能应在11月2日晚上11点输出<代码>这是错误的答案,也就是说,由于夏令时,该功能应失败。当我运行它时,它实际上输出了11月3日凌晨12点的正确时间(注:我在芝加哥/中部时间)

    当我将他的naive函数的输出与moment.js和luxon.js的输出进行比较时,我得到了与您在本文中看到的相同的答案

    挠头 更重要的是,如果使用luxon或moment,当你在
    2014-11-02
    中添加一天的分钟数时,你会得到
    2014-11-03T00:00:00.000Z
    ,但如果你直接在
    2014-11-02
    中添加一天,你就可以得到
    2014-11-03T01:00:00.000Z
    -休息一小时

    那么,我最好还是选择第二种方案

    现在让我们快进到未来任何一个周二下午6点。我的活动是否总是在周三凌晨2点结束(或者8小时的持续时间有时使我的活动在凌晨1点或3点结束)?我如何让它总是在凌晨2点结束

    标准Javascript日期对象自动为您处理夏令时转换。即使你在夏令时前一天的下午6点为约会加上8小时,新的约会仍将在第二天凌晨2点结束

    顺便说一句,我在中实现了持续时间支持,因为它支持标准javascript
    Date
    以及
    moment
    /
    luxon
    dates,所以您可以使用任意一个库测试具有持续时间的重复事件,并查看它们是否都产生相同的结果

    这个例子可以是

    从'@rschedule/rschedule'导入{Schedule};
    从'@rschedule/StandardDateAdapter'导入{StandardDateAdapter};
    //这个例子也适用于'moment'、'moment timezone'和'luxon'`
    //(假设您导入了正确的日期适配器--请参阅rSchedule文档)
    施工进度表=新进度表({
    罗尔斯:[
    {
    开始日期:新日期(2019,9,10,18),
    频率:“每日”,
    持续时间:1000*60*60*8,
    计数:30
    }
    ],
    dateAdapter:StandardDateAdapter,
    });
    schedule.events().toArray().forEach(适配器=>{
    console.log(
    {
    开始:adapter.date.toLocalString(),
    end:adapter.end.toLocaleString(),
    }
    )
    })
    
    事实上我想知道一件事什么时候结束

    要了解此事件何时结束,您可以执行以下操作:

    const iterator=schedule.executions({reverse:true})
    const{end}=iterator.next().value
    

    这个技巧只适用于实际有结束日期的事件(因此不是无限次出现的事件)。

    我在大约十年前写下了您所指的原始答案。七年后,我进行了编辑,将新日期(2014年10月2日)更改为新日期('2014-11-02')。我认为这会更容易阅读(因为您不必解释该版本的构造函数中的月份从0开始,而不是从1开始)。但是,以这种方式格式化会导致将其解析为UTC。我已经回去修复了这个问题(谢谢你指出)

    要了解你问题中的“搔头”部分:

    更重要的是,如果使用luxon或moment,当您在
    2014-11-02
    中添加一天的分钟数时,您会得到
    2014-11-03T00:00:00.000Z

    时间戳末尾的
    Z
    表示它是UTC,UTC不遵守夏令时。因此,如果您从
    2014-11-02T00:00:00.000Z
    开始,再加上24小时,您将得到
    2014-11-03T00:00:00.000Z
    。当您添加小时/分/秒时,就不必担心夏令时了

    但是如果你直接在
    2014-11-02
    上加上一天,你会得到
    2014-11-03T01:00:00.000Z
    ——休息一小时

    在这种情况下,您是从
    2014-11-02T00:00:00.000Z
    开始的,但是当您告诉图书馆增加一天,并且您没有指定时区时,图书馆假设您处于loca中
    function addMinutes(date, minutes) {
        return new Date(date.getTime() + minutes*60000);
    }
    addMinutes(new Date('2014-11-02'), 60*24) //In USA, prints 11pm on Nov 2, not 12am Nov 3!