首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ical4j。RFC5545。计算事件发生,持续时间攻击

Ical4j。RFC5545。计算事件发生,持续时间攻击
EN

Stack Overflow用户
提问于 2017-07-21 00:27:35
回答 1查看 432关注 0票数 1

我查看https://github.com/ical4j/ical4j库。此时,我需要计算事件发生情况。要计算的有用示例是这里。我试图改变start dateend date。在最初的start date20101113 -2010年11月,星期六(它的地图模式见BYDAY=...SA)。我不想在乎是否开始比赛。因此,我使用了start date和值20101112 -201011月,星期五(它没有在任何一天的模式,见BYDAY=MO,TU,SA)

代码语言:javascript
复制
    VEvent event = new ContentBuilder().vevent {
        dtstart('20101112', parameters: parameters() {value('DATE')})
        dtend('20101113', parameters: parameters() {value('DATE')})
        rrule('FREQ=WEEKLY;WKST=MO;INTERVAL=3;BYDAY=MO,TU,SA')
    }
    def dates = event.calculateRecurrenceSet(new Period('20101101T000000/20110101T000000'))
    println dates

结果是

20101112T0000Z/20101113T0000Z,20101113T0000Z/P1D,20101129T0000Z/P1D,20101130T0000Z/P1D,20101204T0000Z/P1D,20101220T0000Z/P1D,20101221T0000Z/P1D,20101225T0000Z/P1D

几乎和预期的一样(结果中的第一个周期除外,20101112T000000Z/20101113T000000Z是多余的)。所以我继续研究如何排除一个。在调试模式下,我看到

代码语言:javascript
复制
result = {PeriodList@1497}  size = 8
0 = {Period@2240} "20101112T000000Z/20101113T000000Z"
  duration = null
  rangeStart = {DateTime@2243} "20101112T000000Z"
  rangeEnd = {DateTime@2244} "20101113T000000Z"
1 = {Period@2264} "20101113T000000Z/P1D"
  duration = {Dur@2284} "P1D"
  rangeStart = {DateTime@2285} "20101113T000000Z"
  rangeEnd = {DateTime@2286} "20101114T000000Z"
2 = {Period@2265} "20101129T000000Z/P1D"
  duration = {Dur@2284} "P1D"
  rangeStart = {DateTime@2290} "20101129T000000Z"
  rangeEnd = {DateTime@2291} "20101130T000000Z"
3 = {Period@2266} "20101130T000000Z/P1D"
  duration = {Dur@2284} "P1D"
  rangeStart = {DateTime@2295} "20101130T000000Z"
  rangeEnd = {DateTime@2296} "20101201T000000Z"
4 = {Period@2267} "20101204T000000Z/P1D"
  duration = {Dur@2284} "P1D"
  rangeStart = {DateTime@2300} "20101204T000000Z"
  rangeEnd = {DateTime@2301} "20101205T000000Z"
5 = {Period@2268} "20101220T000000Z/P1D"
  duration = {Dur@2284} "P1D"
  rangeStart = {DateTime@2315} "20101220T000000Z"
  rangeEnd = {DateTime@2316} "20101221T000000Z"
6 = {Period@2269} "20101221T000000Z/P1D"
  duration = {Dur@2284} "P1D"
  rangeStart = {DateTime@2310} "20101221T000000Z"
  rangeEnd = {DateTime@2311} "20101222T000000Z"
7 = {Period@2270} "20101225T000000Z/P1D"
  duration = {Dur@2284} "P1D"
  rangeStart = {DateTime@2305} "20101225T000000Z"
  rangeEnd = {DateTime@2306} "20101226T000000Z"

尤里卡!我已经找到了在生成集中检测冗余日期的标记(损坏的周期具有空持续时间)。我继续使用空值处理它的过滤周期。但是过滤器没有过滤任何东西。继续检查..。

代码语言:javascript
复制
package net.fortuna.ical4j.model;
...
public class Period extends DateRange implements Comparable<Period> {

    private static final long serialVersionUID = 7321090422911676490L;

    private Dur duration;
    ...
    public final Dur getDuration() {
        if (duration == null) {
            return new Dur(getStart(), getEnd());
        }
        return duration;
    }
    ...

如您所见,类Periodprivate Dur durationpublic final Dur getDuration()。如果没有办法我就无法访问duration ..。

问题是

我该怎么办?

  1. 使用反射黑客获得持续时间-丑陋的解决方案。
  2. 下载库源以更改Period类并重新构建库-遵循错误的支持新库版本。
  3. 要求ical4j开发人员扩展Period外观--需要时间进行更改和发布。
  4. toString上使用持续时间攻击(这是不可靠的解决方案)。
EN

回答 1

Stack Overflow用户

发布于 2017-07-26 05:30:28

我养大了问题。如果他们考虑这个问题,我会补充细节.

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

https://stackoverflow.com/questions/45227132

复制
相关文章

相似问题

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