2012-09-08 28 views
9

मैं iCalendar प्रारूप द्वारा निर्दिष्ट एक स्ट्रिंग के रूप में पुनरावृत्ति नियम मुद्रित करने का प्रयास कर रहा हूं (RFC 5545 देखें)। इम अजगर dateutils का उपयोग कर, विशेष रूप से dateutil.rrule में पुनरावृत्ति नियम बनाने के लिए और मैं की तरह एक स्ट्रिंग के रूप में प्रिंट करना चाहते:पायथन डेट्यूटल्स iCalendar प्रारूप के अनुसार पुनरावृत्ति नियम प्रिंट करें (आरएफसी 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/आरएफसी/rfc2445.html # सेकंड-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 देखें) है जो एक के लिए अनुमति देता है:

चर्चा के लिए बग ट्रैकर देखें 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 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^