1414 'icon' : ICON_ERROR ,
1515}]
1616
17+ SHIFT_UNIT_MAP = {
18+ 'ms' : 'microsecond' ,
19+ 's' : 'second' ,
20+ 'm' : 'minute' ,
21+ 'h' : 'hour' ,
22+ 'd' : 'day' ,
23+ 'w' : 'weeks' ,
24+ 'M' : 'month' ,
25+ 'q' : 'quarters' ,
26+ 'y' : 'year' ,
27+ }
28+
1729FORMAT_LIST = (
1830 (ICON_NOTE , True , 'X' , 'Timestamp(s)' ),
1931 (ICON_NOTE , True , 'x' , 'Timestamp(us)' ),
2638 ),
2739 ( # https://www.w3.org/TR/NOTE-datetime
2840 ICON_CLOCK , False , 'YYYY-MM-DDTHH:mm:ssZZ' ,
29- 'W3C Format'
41+ 'ISO 8601/ W3C Format'
3042 ),
3143 (ICON_CLOCK , False , arrow .FORMAT_RFC850 , 'RFC850 Format' ),
44+ (ICON_CLOCK , False , arrow .FORMAT_RFC3339 , 'RFC3339 Format' ),
3245 # FORMAT_RFC3339
3346)
3447
3548RE_TIMEZONE = '^[+-][0-9]{2}$'
36- RE_SHIFT = '^[+-][0-9]+[smhdmy ]$'
49+ RE_SHIFT = '^[+-][0-9]+[smhdwmy ]$'
3750
3851
3952class Time (object ):
@@ -72,7 +85,7 @@ def do_parser(self):
7285 if not self ._parser_extend_info ():
7386 break
7487
75- return self ._parser_datetime ()
88+ self ._parser_datetime ()
7689
7790 def _parser_extend_info (self ):
7891 """parser timezone, shift"""
@@ -88,17 +101,23 @@ def _parser_extend_info(self):
88101 if info .upper () == 'UTC' or info == '+00' or info == '-00' :
89102 self .query = query
90103 self .zone = 'UTC'
91- self .wf .logger .debug ('found zone info:' .format (self .zone ))
104+ self .wf .logger .debug ('found zone info:{} ' .format (self .zone ))
92105 return True
93106
94107 r = re .match (RE_TIMEZONE , info )
95108 if r :
96109 self .query = query
97110 self .zone = info
98- self .wf .logger .debug ('found zone info:' .format (self .zone ))
111+ self .wf .logger .debug ('found zone info:{} ' .format (self .zone ))
99112 return True
100113
101114 # time shift TODO
115+ r = re .match (RE_SHIFT , info )
116+ if r :
117+ self .query = query
118+ self .shift = info
119+ self .wf .logger .debug ('found shift info:{}' .format (self .shift ))
120+ return True
102121
103122 return False
104123
@@ -113,17 +132,30 @@ def _parser_datetime(self):
113132 return True
114133
115134 except arrow .ParserError :
116- self .wf .logger .debug (
117- 'parser datetime error,query string:{}' .format (self .query )
118- )
135+ pass
119136
120137 if self .query == 'now' or self .query == '' :
121138 self .now = True
122139 self .time = arrow .now ()
123140 return True
124141
142+ self .wf .logger .debug (
143+ 'parser datetime error,query string:{}' .format (self .query )
144+ )
125145 return False
126146
147+ def _apply_shift (self ):
148+ if self .time is None or self .shift is None :
149+ return
150+
151+ index = len (self .shift ) - 1
152+ unit = self .shift [index ]
153+ number = int (self .shift [:index ])
154+ kwargs = {
155+ SHIFT_UNIT_MAP [unit ]: number ,
156+ }
157+ self .time = self .time .shift (** kwargs )
158+
127159 def get_feedback (self ):
128160 if self .time is None :
129161 return DEFAULT_FEEDBACK
@@ -135,20 +167,26 @@ def get_feedback(self):
135167
136168 f = list ()
137169 for icon , force_utc , fmt , desc_format in FORMAT_LIST :
170+ # time shift
171+ if self .shift :
172+ desc_shift = '{}, ' .format (self .shift )
173+ else :
174+ desc_shift = ''
138175
176+ # time znone
139177 if force_utc :
140178 self .time = self .time .to ('UTC' )
141- desc_zone = 'UTC, '
179+ desc_zone = 'UTC'
142180 elif self .zone and not force_utc :
143181 self .time = self .time .to (self .zone )
144- desc_zone = '{}, ' . format ( self .zone )
182+ desc_zone = self .zone
145183 else :
146184 self .time = self .time .to ('local' )
147- desc_zone = 'Local, '
185+ desc_zone = 'Local'
148186
149187 value = self .time .format (fmt )
150- subtitle = '{}{}{}' .format (
151- desc_now , desc_zone , desc_format
188+ subtitle = '{}{}[{}] {}' .format (
189+ desc_now , desc_shift , desc_zone , desc_format
152190 )
153191 f .append ({
154192 'title' : value ,
0 commit comments