2012-09-08 3 views
9

iCalendar 형식 (RFC 5545 참조)에 지정된 문자열로 반복 규칙을 인쇄하려고합니다. 임 재발 규칙을 만들 특히 dateutil.rrule에서, 파이썬 dateutils을 사용하고 내가 좋아하는 캐릭터 라인으로이를 인쇄하려면이 달성 할 수있는 방법이 있다면Python dateutils는 iCalendar 형식 (RFC 5545 참조)에 따라 반복 규칙을 인쇄합니다.

"RRULE:FREQ=DAILY;COUNT=5" 

사람이 말해 줄래?

나는 labix dateutils btw를 사용하고 있다고 생각합니다.

감사합니다.

답변

7

이렇게하려면 python-dateutil 패키지에 방법이나 기능이 없습니다. 도움이 될만한 패치는 다음 버그를 참조하십시오 : https://bugs.launchpad.net/dateutil/+bug/943512.

+0

줄 바꿈 http : // www에주의해야합니다. .apps.ietf.org/rfc/rfc2445.html # sec-4.1 – oberron

0

다음은 rrule 출력을 가능하게하는 두 개의 python-dateutil 패치가 포함 된 rrule의 하위 클래스입니다. 패치가 승인되지 않은 좋은 이유가있을 수 있으며 가장 간단한 경우에만 테스트했습니다. 선 접기가 처리되지 않습니다. 질문은 질문 후이 비록 https://bugs.launchpad.net/dateutil/+bug/943512
https://bugs.launchpad.net/dateutil/+bug/943509

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

이 지금 쯤은 dateutil__str__ 방법 (source code 참조)가 4 년 기록 하나가 있습니다 :

토론에 대한 버그 추적기를 참조하십시오 print 해당 형식의 개체 :

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 
관련 문제