diff --git a/include/class.forms.php b/include/class.forms.php
index bc3a21b142704c70558a0f101e523f621853754b..c097dd995ab0f8e48336215bb6acf578e0dfb440 100644
--- a/include/class.forms.php
+++ b/include/class.forms.php
@@ -1773,6 +1773,17 @@ class DatetimeField extends FormField {
         return Format::parseDateTime($value ?: $this->value);
     }
 
+    // Get effective timezone for the field
+    function getTimeZone() {
+        global $cfg;
+
+        $config = $this->getConfiguration();
+        $timezone = new DateTimeZone($config['timezone'] ?:
+                $cfg->getTimezone());
+
+        return $timezone;
+    }
+
     function getMinDateTime() {
 
         if (!isset($this->min)) {
@@ -1818,6 +1829,12 @@ class DatetimeField extends FormField {
         if ($config['gmt'])
             return $this->format((int) $datetime->format('U'));
 
+        // Force timezone if field has one.
+        if ($config['timezone']) {
+            $timezone = new DateTimezone($config['timezone']);
+            $datetime->setTimezone($timezone);
+        }
+
         $value = $this->format($datetime->format('U'),
                 $datetime->getTimezone()->getName());
 
@@ -1883,18 +1900,28 @@ class DatetimeField extends FormField {
                 'id'=>1, 'label'=>__('Time'), 'required'=>false, 'default'=>false,
                 'configuration'=>array(
                     'desc'=>__('Show time selection with date picker')))),
+            'timezone' => new TimezoneField(array(
+                'id'=>2, 'label'=>__('Timezone'), 'required'=>false,
+                'hint'=>__('Timezone of the date time selection'),
+                'configuration' => array('autodetect'=>false,
+                    'prompt' => __("User's timezone")),
+               'visibility' => new VisibilityConstraint(
+                    new Q(array('time__eq'=> true)),
+                    VisibilityConstraint::HIDDEN
+                ),
+                )),
             'gmt' => new BooleanField(array(
-                'id'=>2, 'label'=>__('Timezone Aware'), 'required'=>false,
+                'id'=>3, 'label'=>__('Timezone Aware'), 'required'=>false,
                 'configuration'=>array(
                     'desc'=>__("Show date/time relative to user's timezone")))),
             'min' => new DatetimeField(array(
-                'id'=>3, 'label'=>__('Earliest'), 'required'=>false,
+                'id'=>4, 'label'=>__('Earliest'), 'required'=>false,
                 'hint'=>__('Earliest date selectable'))),
             'max' => new DatetimeField(array(
-                'id'=>4, 'label'=>__('Latest'), 'required'=>false,
+                'id'=>5, 'label'=>__('Latest'), 'required'=>false,
                 'default'=>null, 'hint'=>__('Latest date selectable'))),
             'future' => new BooleanField(array(
-                'id'=>5, 'label'=>__('Allow Future Dates'), 'required'=>false,
+                'id'=>6, 'label'=>__('Allow Future Dates'), 'required'=>false,
                 'default'=>true, 'configuration'=>array(
                     'desc'=>__('Allow entries into the future' /* Used in the date field */)),
             )),
@@ -3683,13 +3710,14 @@ class CheckboxWidget extends Widget {
 }
 
 class DatetimePickerWidget extends Widget {
+
     function render($options=array()) {
         global $cfg;
 
         $config = $this->field->getConfiguration();
+        $timezone = $this->field->getTimezone();
         if ($this->value) {
 
-            $timezone = null;
             if (is_int($this->value))
                 // Assuming UTC timezone.
                 $datetime = DateTime::createFromFormat('U', $this->value);
@@ -3699,14 +3727,12 @@ class DatetimePickerWidget extends Widget {
 
             if ($config['time']) {
                 // Convert to user's timezone for update.
-                $timezone = new DateTimeZone($cfg->getTimezone());
                 $datetime->setTimezone($timezone);
             }
 
             $this->value = Format::date($datetime->getTimestamp(), false,
                     false, $timezone ? $timezone->getName() : 'UTC');
         } else {
-            $timezone = new DateTimeZone($cfg->getTimezone());
             $datetime = new DateTime('now');
             $datetime->setTimezone($timezone);
         }
@@ -3741,7 +3767,10 @@ class DatetimePickerWidget extends Widget {
             // TODO: Add time picker -- requires time picker or selection with
             //       Misc::timeDropdown
             echo ' ' . Misc::timeDropdown($hr, $min, $this->name . ':time');
-            echo sprintf('&nbsp;<span class="faded">(%s)</span>',
+            echo sprintf('&nbsp;<span class="faded">(<a href="#"
+                        data-placement="top" data-toggle="tooltip"
+                        title="%s">%s</a>)</span>',
+                    $datetime->getTimezone()->getName(),
                     $datetime->format('T'));
         }
     }
@@ -3756,13 +3785,13 @@ class DatetimePickerWidget extends Widget {
 
         if ($value = parent::getValue()) {
             // Effective timezone for the selection
-            $tz = new DateTimeZone($cfg->getTimezone());
+            $timezone = $this->field->getTimezone();
             // See if we have time
             $data = $this->field->getSource();
             if ($value && isset($data[$this->name . ':time']))
                 $value .=' '.$data[$this->name . ':time'];
 
-            $dt = new DateTime($value, $tz);
+            $dt = new DateTime($value, $timezone);
             $value = $dt->format('Y-m-d H:i:s T');
         }