From 8e96b735aec554b665de3d58c6871fd06a3992eb Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Tue, 29 Mar 2022 10:55:53 +0200 Subject: [PATCH] Improve date handling --- examples/reference/widgets/DateSlider.ipynb | 7 ++++--- panel/widgets/slider.py | 19 ++++++++++++++++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/examples/reference/widgets/DateSlider.ipynb b/examples/reference/widgets/DateSlider.ipynb index 41c17e9639..6dadc78bb6 100644 --- a/examples/reference/widgets/DateSlider.ipynb +++ b/examples/reference/widgets/DateSlider.ipynb @@ -26,9 +26,10 @@ "\n", "##### Core\n", "\n", - "* **``start``** (datetime): The range's lower bound\n", - "* **``end``** (datetime): The range's upper bound\n", - "* **``value``** (datetime): The selected value as a datetime type\n", + "* **``as_datetime``**: Whether to return value as a date (default) or datetime\n", + "* **``start``** (date or datetime): The range's lower bound\n", + "* **``end``** (date or datetime): The range's upper bound\n", + "* **``value``** (date or datetime): The selected value as a datetime type\n", "* **``value_throttled``** (datetime): The selected value as a datetime type throttled until mouseup\n", "\n", "##### Display\n", diff --git a/panel/widgets/slider.py b/panel/widgets/slider.py index 9e4ed4f61c..eea790c145 100644 --- a/panel/widgets/slider.py +++ b/panel/widgets/slider.py @@ -164,6 +164,9 @@ def _process_property_change(self, msg): class DateSlider(_SliderBase): + as_datetime = param.Boolean(default=False, doc=""" + Whether to store the date as a datetime.""") + value = param.Date(default=None) value_throttled = param.Date(default=None, constant=True) @@ -172,7 +175,7 @@ class DateSlider(_SliderBase): end = param.Date(default=None) - _rename = {'name': 'title'} + _rename = {'name': 'title', 'as_datetime': None} _source_transforms = {'value': None, 'value_throttled': None, 'start': None, 'end': None} @@ -183,12 +186,22 @@ def __init__(self, **params): params['value'] = params.get('start', self.start) super().__init__(**params) + def _process_param_change(self, msg): + msg = super()._process_param_change(msg) + if 'value' in msg: + value = msg['value'] + if isinstance(value, dt.datetime): + value = value.replace(tzinfo=dt.timezone.utc).timestamp() * 1000 + msg['value'] = value + return msg + def _process_property_change(self, msg): msg = super()._process_property_change(msg) + transform = value_as_datetime if self.as_datetime else value_as_date if 'value' in msg: - msg['value'] = value_as_date(msg['value']) + msg['value'] = transform(msg['value']) if 'value_throttled' in msg: - msg['value_throttled'] = value_as_date(msg['value_throttled']) + msg['value_throttled'] = transform(msg['value_throttled']) return msg