This commit introduces the ability for i3pystatus clock to display the

time depending on different timezones. You can set the timezone as
described on the data linked on http://www.iana.org/time-zones.

For instance:
status.register('clock',
format=[("%a %X",'Europe/Dublin'),("%X",'Europe/Paris')]
)
This commit is contained in:
Matthieu Coudron 2014-09-06 19:18:34 +02:00
parent f3c549bb24
commit 389124e5c4

View File

@ -4,6 +4,7 @@
import os import os
import locale import locale
import datetime import datetime
import pytz
from i3pystatus import IntervalModule from i3pystatus import IntervalModule
@ -14,13 +15,13 @@ class Clock(IntervalModule):
""" """
settings = ( settings = (
("format", "list of stftime format string, `None` means to use the default, locale-dependent format. Can cycle between formats with mousewheel"), ("format", "list of tuple (stftime format string, optional timezone), `None` means to use the default, locale-dependent format. Can cycle between formats with mousewheel"),
("color", "RGB hexadecimal code color specifier, default to #ffffff, set to `i3Bar` to use i3 bar default"), ("color", "RGB hexadecimal code color specifier, default to #ffffff, set to `i3Bar` to use i3 bar default"),
) )
format = None format = None
color = "#ffffff" color = "#ffffff"
interval = 1 interval = 1
currentFormatId = 0 current_format_id = 0
def init(self): def init(self):
if self.format is None: if self.format is None:
@ -38,18 +39,37 @@ class Clock(IntervalModule):
elif isinstance(self.format, str): elif isinstance(self.format, str):
self.format = [self.format] self.format = [self.format]
self.format = self.expand_formats(self.format)
@staticmethod
def expand_formats(formats):
def expand_format(format_):
if isinstance(format_, tuple):
return (format_[0], format_[1] if len(format_) > 1 else None)
return (format_, None)
return [expand_format(format_) for format_ in formats]
def run(self): def run(self):
# Safest way is to work from utc and localize afterwards
if self.format[self.current_format_id][1]:
utc_dt = pytz.utc.localize(datetime.datetime.utcnow())
tz = pytz.timezone(self.format[self.current_format_id][1])
dt = tz.normalize(utc_dt.astimezone(tz))
else:
dt = datetime.datetime.now()
output = dt.strftime(self.format[self.current_format_id][0]),
self.output = { self.output = {
# todo find local "full_text": output,
"full_text": datetime.datetime.now().strftime(self.format[self.currentFormatId]),
"urgent": False, "urgent": False,
} }
if self.color != "i3Bar": if self.color != "i3Bar":
self.output["color"] = self.color self.output["color"] = self.color
def on_upscroll(self): def on_upscroll(self):
self.currentFormatId = (self.currentFormatId + 1)% len(self.format) self.current_format_id = (self.current_format_id + 1) % len(self.format)
def on_downscroll(self): def on_downscroll(self):
self.currentFormatId = (self.currentFormatId - 1)% len(self.format) self.current_format_id = (self.current_format_id - 1) % len(self.format)