From bab26e7762b74acf267c7cb634665e679e7feca3 Mon Sep 17 00:00:00 2001 From: Cameron Date: Fri, 25 May 2018 19:00:55 -0700 Subject: [PATCH] datetimepicker() assumes the timezone to be that of the browser, which can pose problems in some situations. Now we can set a different timezone for the datepicker input and the UTC value will be automatically adjusted. eg. writeParms = array(type='datetime', 'timezone'=>'America/Los_Angeles') --- e107_handlers/form_handler.php | 16 ++++++++++++++-- .../js/bootstrap-datetimepicker.init.js | 14 ++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/e107_handlers/form_handler.php b/e107_handlers/form_handler.php index 23826f581..2232669ed 100644 --- a/e107_handlers/form_handler.php +++ b/e107_handlers/form_handler.php @@ -1437,7 +1437,10 @@ class e_form * on Submit returns unix timestamp or string value. * @param string $name the name of the field * @param integer $datestamp UNIX timestamp - default value of the field - * @param array or str + * @param array or str + * @param string $options['type'] date or datetime + * @param string $options['format'] strftime format eg. '%Y-%m-%d' + * @param string $options['timezone'] eg. 'America/Los_Angeles' - intended timezone of the date/time entered. (offsets UTC value) * @example $frm->datepicker('my_field',time(),'type=date'); * @example $frm->datepicker('my_field',time(),'type=datetime&inline=1'); * @example $frm->datepicker('my_field',time(),'type=date&format=yyyy-mm-dd'); @@ -1493,6 +1496,15 @@ class e_form $firstDay = vartrue($options['firstDay']) ? $options['firstDay'] : 0; $xsize = (vartrue($options['size']) && !is_numeric($options['size'])) ? $options['size'] : 'xlarge'; $disabled = vartrue($options['disabled']) ? "disabled" : ""; + $timezone = ''; + + if(!empty($options['timezone'])) // since datetimepicker does not support timezones and assumes the browser timezone is the intended timezone. + { + date_default_timezone_set($options['timezone']); + $targetOffset = date('Z'); + date_default_timezone_set(USERTIMEZONE); + $timezone = "data-date-timezone-offset='".$targetOffset."'"; + } $text = ""; @@ -1503,7 +1515,7 @@ class e_form } else { - $text .= ""; + $text .= ""; $ftype = (!empty($options['debug'])) ? 'text' : 'hidden'; $text .= ""; } diff --git a/e107_web/js/bootstrap-datetimepicker/js/bootstrap-datetimepicker.init.js b/e107_web/js/bootstrap-datetimepicker/js/bootstrap-datetimepicker.init.js index d00fb9f23..6c872e12f 100755 --- a/e107_web/js/bootstrap-datetimepicker/js/bootstrap-datetimepicker.init.js +++ b/e107_web/js/bootstrap-datetimepicker/js/bootstrap-datetimepicker.init.js @@ -75,6 +75,20 @@ var e107 = e107 || {'settings': {}, 'behaviors': {}}; newValue = $("#" + ev.target.id).val(); } + offset = parseInt($item.attr("data-date-timezone-offset")); + + if(offset) // adjust UTC value to target timezone. ie. timezone other than the one of the browser. + { + browserOffset = ev.date.getTimezoneOffset() * 60; + relativeOffset = browserOffset + offset; + + console.log("Browser Offset: " + browserOffset); + console.log('Offset: ' + offset); + console.log('Relative Offset: ' + relativeOffset); + + newValue = newValue - relativeOffset; + } + $(newTarget).val(newValue); })