首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python dateutils根据iCalendar格式打印递归规则(参见RFC5545)

Python dateutils根据iCalendar格式打印递归规则(参见RFC5545)
EN

Stack Overflow用户
提问于 2012-09-08 22:34:43
回答 3查看 2K关注 0票数 9

我正在尝试将循环规则打印为由iCalendar格式(参见RFC 5545)指定的字符串。我正在使用python dateutils,特别是dateutil.rrule来创建递归规则,我想将其打印为如下所示的字符串:

代码语言:javascript
复制
    "RRULE:FREQ=DAILY;COUNT=5"

谁能告诉我有什么方法可以做到这一点吗?

我想我使用的是labix dateutils btw。

非常感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-09 00:25:37

python-dateutil包中没有执行此操作的方法或函数。请参阅此错误以获取可能有帮助的补丁:https://bugs.launchpad.net/dateutil/+bug/943512

票数 7
EN

Stack Overflow用户

发布于 2016-12-03 01:48:40

尽管这篇文章是在这个问题提出四年后写的,但dateutil现在已经有了一个__str__方法(请参阅source code),它允许人们以这样的形式print它的对象:

代码语言:javascript
复制
In [1]: from dateutil.rrule import *

In [2]: my_rrule = rrule(DAILY, count=5)

In [3]: print(my_rrule)
DTSTART:20161202T184513
FREQ=DAILY;COUNT=5
票数 1
EN

Stack Overflow用户

发布于 2016-11-04 17:04:26

这是rrule的一个子类,它结合了两个建议的python-dateutil补丁,支持rrule输出。注意,补丁没有被接受可能有很好的理由,我只针对最简单的情况进行了测试。不处理折行。

请参阅bug跟踪器进行讨论:https://bugs.launchpad.net/dateutil/+bug/943512

https://bugs.launchpad.net/dateutil/+bug/943509

代码语言:javascript
复制
FREQNAMES = ['YEARLY', 'MONTHLY', 'WEEKLY', 'DAILY', 'HOURLY', 'MINUTELY', 'SECONDLY']


class ConvertibleRRule(rrule.rrule):
    # Subclass of the `rrule class that provides a sensible __str__()
    # method, outputting ical formatted rrules.
    # Combined from the patches in these dateutil issues:
    #  https://bugs.launchpad.net/dateutil/+bug/943512
    #  https://bugs.launchpad.net/dateutil/+bug/943509
    _bysecond_internal = False
    _byminute_internal = False
    _byhour = False
    _bymonth_internal = False
    _bymonthday_internal = False
    _byweekday_internal = False

    def __init__(self, freq, dtstart=None,
                 interval=1, wkst=None, count=None, until=None, bysetpos=None,
                 bymonth=None, bymonthday=None, byyearday=None, byeaster=None,
                 byweekno=None, byweekday=None,
                 byhour=None, byminute=None, bysecond=None,
                 cache=False):
        super(ConvertibleRRule, self).__init__(
            freq, dtstart=dtstart,
            interval=interval, wkst=wkst, count=count, until=until, bysetpos=bysetpos,
            bymonth=bymonth, bymonthday=bymonthday, byyearday=byyearday, byeaster=byeaster,
            byweekno=byweekno, byweekday=byweekday,
            byhour=byhour, byminute=byminute, bysecond=bysecond,
            cache=cache)

        if (byweekno is None and byyearday is None and bymonthday is None and
                    byweekday is None and byeaster is None):
            if freq == rrule.YEARLY:
                if not bymonth:
                    self._bymonth_internal = True
                self._bymonthday_internal = True
            elif freq == rrule.MONTHLY:
                self._bymonthday_internal = True
            elif freq == rrule.WEEKLY:
                self._byweekday_internal = True

        # byhour
        if byhour is None:
            if freq < rrule.HOURLY:
                self._byhour_internal = True

        # byminute
        if byminute is None:
            if freq < rrule.MINUTELY:
                self._byminute_internal = True

        # bysecond
        if bysecond is None:
            if freq < rrule.SECONDLY:
                self._bysecond_internal = True

    freq = property(lambda s: s._freq)
    dtstart = property(lambda s: s._dtstart)
    interval = property(lambda s: s._interval)

    @property
    def wkst(self):
        if self._wkst == rrule.calendar.firstweekday():
            return None
        return rrule.weekday(self._wkst)

    count = property(lambda s: s._count)
    until = property(lambda s: s._until)
    bysetpos = property(lambda s: s._bysetpos)

    @property
    def bymonth(self):
        if self._bymonth_internal:
            return None
        return self._bymonth

    @property
    def bymonthday(self):
        if self._bymonthday_internal:
            return None
        return self._bymonthday + self._bynmonthday

    byyearday = property(lambda s: s._byyearday)
    byeaster = property(lambda s: s._byeaster)
    byweekno = property(lambda s: s._byweekno)

    @property
    def byweekday(self):
        if self._byweekday_internal:
            return None
        bynweekday, byweekday = (), ()
        if self._bynweekday:
            bynweekday = tuple(rrule.weekday(d, n) for d, n in self._bynweekday)
        if self._byweekday:
            byweekday = tuple(rrule.weekday(d) for d in self._byweekday)
        return bynweekday + byweekday

    @property
    def byhour(self):
        if self._byhour_internal:
            return None
        return self._byhour

    @property
    def byminute(self):
        if self._byminute_internal:
            return None
        return self._byminute

    @property
    def bysecond(self):
        if self._bysecond_internal:
            return None
        return self._bysecond

    def __str__(self):
        parts = ['FREQ=' + FREQNAMES[self.freq]]

        if self.interval != 1:
            parts.append('INTERVAL=' + str(self.interval))
        if self.wkst:
            parts.append('WKST=' + str(self.wkst))
        if self.count:
            parts.append('COUNT=' + str(self.count))

        for name, value in [
            ('BYSETPOS', self.bysetpos),
            ('BYMONTH', self.bymonth),
            ('BYMONTHDAY', self.bymonthday),
            ('BYYEARDAY', self.byyearday),
            ('BYWEEKNO', self.byweekno),
            ('BYWEEKDAY', self.byweekday),
            ('BYHOUR', self.byhour),
            ('BYMINUTE', self.byminute),
            ('BYSECOND', self.bysecond),
        ]:
            if value:
                parts.append(name + '=' + ','.join(str(v) for v in value))

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

https://stackoverflow.com/questions/12331652

复制
相关文章

相似问题

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