diff --git a/extension/Classes/Core/Helper/DateTime.php b/extension/Classes/Core/Helper/DateTime.php
new file mode 100644
index 0000000000000000000000000000000000000000..97c241d011102894b2a7cbc8bb9a5daaec8d3d20
--- /dev/null
+++ b/extension/Classes/Core/Helper/DateTime.php
@@ -0,0 +1,446 @@
+<?php
+
+namespace IMATHUZH\Qfq\Core\Helper;
+
+use IMATHUZH\Qfq\Core\AbstractBuildForm;
+use IMATHUZH\Qfq\Core\Store\Store;
+
+/**
+ *
+ */
+class DateTime {
+
+    /**
+     * Builds HTML 'input' element.
+     * Format: <input name="$htmlFormElementName" <type="date" [autocomplete="autocomplete"] [autofocus="autofocus"]
+     *           [maxlength="$maxLength"] [placeholder="$placeholder"] [size="$size"] [min="$min"] [max="$max"]
+     *           [pattern="$pattern"] [required="required"] [disabled="disabled"] value="$value">
+     *
+     * @param array $formElement
+     * @param string $htmlFormElementName
+     * @param string $value
+     * @param array $json
+     * @param array $formSpec
+     * @param Store $store
+     * @param string $mode FORM_LOAD | FORM_UPDATE | FORM_SAVE
+     *
+     * @return string
+     * @throws \CodeException
+     * @throws \UserFormException
+     * @throws \UserReportException
+     */
+    public function buildDateTime(array $formElement, $htmlFormElementName, $value, array &$json, array $formSpec, Store $store, $mode = FORM_LOAD, $wrappedClass = ''): string {
+        $attribute = '';
+        $placeholder = '';
+        $datetimeKeys = array(
+            FE_DATE_LOCALE,
+            FE_DATE_DAYS_OF_WEEK_ENABLED,
+            FE_DATE_FORMAT,
+            FE_DATE_VIEWMODE_DEFAULT,
+            FE_INPUT_CLEAR_ME,
+            FE_DATE_SHOW_CALENDAR_WEEKS,
+            FE_DATE_CURRENT_DATETIME,
+            FE_DATE_DATETIME_SIDE_SIDE_BY_SIDE,
+            FE_MIN,
+            FE_MAX
+        );
+
+        $datetimeAttributes = array(
+            "locale",
+            "days-of-week-disabled",
+            "format",
+            "view-mode-default",
+            "show-clear-button",
+            "show-calendar-weeks",
+            "use-current-datetime",
+            "datetime-side-by-side",
+            "minDate",
+            "maxDate"
+        );
+
+        $datePickerClassName = self::getDatePickerClassName($formElement, $formSpec);
+
+        $attribute .= Support::doAttribute('id', $formElement[FE_HTML_ID]);
+        $attribute .= Support::doAttribute('name', $htmlFormElementName);
+        $attribute .= Support::doAttribute('class', 'form-control ' . $datePickerClassName);
+        $attribute .= Support::doAttribute(ATTRIBUTE_DATA_REFERENCE, $formElement[FE_DATA_REFERENCE]);
+
+        $showTime = ($formElement[FE_TYPE] == FE_TYPE_TIME || $formElement[FE_TYPE] == FE_TYPE_DATETIME) ? 1 : 0;
+        if ($value == 'CURRENT_TIMESTAMP') {
+            $value = date('Y-m-d H:i:s');
+        }
+
+        $defaultFormat = self::getDefaultDateFormat($formElement);
+
+        $value = Support::convertDateTime($value, $defaultFormat['date'], $formElement[FE_SHOW_ZERO], $showTime, $formElement[FE_SHOW_SECONDS]);
+
+        // Browser needs own formatted value to show date
+        if ($formElement[FE_DATE_TIME_PICKER_TYPE] === DATE_TIME_PICKER_BROWSER && $value !== '') {
+            $value = self::formatValueForBrowser($formElement[FE_TYPE], $value);
+        }
+
+        $tmpPattern = $formElement[FE_CHECK_PATTERN];
+        //  If bootstrap datetimepicker (date and datetime FE Type) is used, check pattern is not needed. Keep pattern for FE Type time.
+        if ($formElement[FE_TYPE] != FE_TYPE_DATETIME && $formElement[FE_TYPE] != FE_TYPE_DATE && $formElement[FE_TYPE] != FE_TYPE_TIME) {
+            $formElement[FE_CHECK_PATTERN] = Support::dateTimeRegexp($formElement[FE_TYPE], $formElement[FE_DATE_FORMAT], $formElement[FE_TIME_IS_OPTIONAL]);
+        }
+
+        switch ($formElement[FE_CHECK_TYPE]) {
+            case  SANITIZE_ALLOW_PATTERN:
+                $formElement[FE_CHECK_PATTERN] = $tmpPattern;
+                break;
+            case SANITIZE_ALLOW_ALL:
+            case SANITIZE_ALLOW_ALNUMX:
+            case SANITIZE_ALLOW_ALLBUT:
+                $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_PATTERN;
+                break;
+            default:
+                throw new \UserFormException("Checktype not applicable for date/time: '" . $formElement[FE_CHECK_TYPE] . "'", ERROR_NOT_APPLICABLE);
+        }
+
+        $tableColumnTypes = $store->getStore(STORE_TABLE_COLUMN_TYPES);
+        // truncate if necessary
+        if ($value != '' && $formElement[FE_MAX_LENGTH] > 0) {
+            if ($formElement[FE_TYPE] === FE_TYPE_TIME && $tableColumnTypes[$formElement[FE_NAME]] === DB_COLUMN_TYPE_DATETIME) {
+                $value = explode(' ', $value)[1];
+            } else {
+                $value = substr($value, 0, $formElement[FE_MAX_LENGTH]);
+            }
+        }
+
+        if ($formElement[FE_DATE_TIME_PICKER_TYPE] === DATE_TIME_PICKER_BROWSER) {
+            $type = self::getDateTimeBrowserType($formElement[FE_TYPE]);
+        } else {
+            // date|time|datetime|datetime-local are not appropriate - only I18n representation possible.
+            $type = 'text';
+        }
+
+        $attribute .= Support::doAttribute('type', $type);
+
+        //Examples of accepted dateFormats: YYYY-MM-DD , DD.MM.YYYY, HH:mm(24h), hh:mm(12h AM PM)
+        // Get dateformat default from T3 config and adjust it for datetimepicker because config default (dd.mm.yyyy) is not the default of bootstrap datetimepicker.
+        if ($formElement[FE_DATE_TIME_PICKER_TYPE] === DATE_TIME_PICKER_QFQ) {
+            $defaultFormat = self::getDateTimeFormatQfq($defaultFormat, $formElement[FE_TYPE]);
+        } else if ($formElement[FE_TYPE] == FE_TYPE_DATETIME) {
+            if ($defaultFormat['time'] === '') {
+                $defaultFormat['time'] = 'hh:mm';
+            }
+            $defaultFormat['date'] .= ' ' . $defaultFormat['time'];
+        }
+
+        // if FE type datetime and showSeconds is set, corrected format is needed
+        if ($formElement[FE_TYPE] === FE_TYPE_DATETIME && $formElement[FE_SHOW_SECONDS] == 1 && !isset($defaultFormat['timeParts'][2])) {
+            $defaultFormat['date'] .= ':ss';
+        }
+
+        // if FE type 'time' is used, overwrite $defaultFormat['date']
+        if ($formElement[FE_TYPE] === FE_TYPE_TIME) {
+            $defaultFormat = self::getTimeFormat($defaultFormat, $formElement[FE_DATE_TIME_PICKER_TYPE], $formElement[FE_SHOW_SECONDS]);
+        }
+
+        $formElement[FE_DATE_DAYS_OF_WEEK_ENABLED] = $formElement[FE_DATE_DAYS_OF_WEEK_ENABLED] ?? '';
+
+        // Set correct parameter value for daysOfWeekDisabled attribute in FE
+        if ($formElement[FE_DATE_DAYS_OF_WEEK_ENABLED] != '' && isset($formElement[FE_DATE_DAYS_OF_WEEK_ENABLED])) {
+            $disabledDays = self::getDateTimePickerDisabledDays($formElement[FE_DATE_DAYS_OF_WEEK_ENABLED]);
+            $formElement[FE_DATE_DAYS_OF_WEEK_ENABLED] = '[' . $disabledDays . ']';
+        }
+
+        if ($formElement[FE_DATE_TIME_PICKER_TYPE] === DATE_TIME_PICKER_QFQ) {
+            $formElement[FE_INPUT_CLEAR_ME] = empty($formElement[FE_INPUT_CLEAR_ME]) ? 'false' : 'true';
+        }
+
+        // Add datepicker attributes
+        self::setDateTimePickerAttributes($formElement, $defaultFormat['date'], $datetimeKeys, $datetimeAttributes, $attribute);
+
+        // 'maxLength' needs an upper 'L': naming convention for DB tables!
+        $attribute .= HelperFormElement::getAttributeList($formElement, ['size', 'maxLength']);
+        $attribute .= Support::doAttribute('value', htmlentities($value), false);
+
+        if ($formElement[FE_PLACEHOLDER] == '' && ($formElement[FE_TYPE] === FE_TYPE_TIME || $formElement[FE_TYPE] === FE_TYPE_DATE || $formElement[FE_TYPE] === FE_TYPE_DATETIME)) {
+            $placeholder = $defaultFormat['date'];
+            $formElement[FE_PLACEHOLDER] = $placeholder;
+        }
+
+        if ($formElement[F_FE_DATA_PATTERN_ERROR] == '') {
+            $formElement[F_FE_DATA_PATTERN_ERROR] = "Please match the format: " . $placeholder;
+        }
+        $attribute .= HelperFormElement::getAttributeList($formElement, [F_FE_DATA_PATTERN_ERROR, F_FE_DATA_REQUIRED_ERROR, F_FE_DATA_MATCH_ERROR, F_FE_DATA_ERROR]);
+
+        $attribute .= HelperFormElement::getAttributeList($formElement, [FE_INPUT_AUTOCOMPLETE, 'autofocus', 'placeholder']);
+        $attribute .= Support::doAttribute('data-load', ($formElement[FE_DYNAMIC_UPDATE] === 'yes') ? 'data-load' : '');
+        $attribute .= Support::doAttribute('title', $formElement[FE_TOOLTIP]);
+
+        $pattern = Sanitize::getInputCheckPattern($formElement[FE_CHECK_TYPE], $formElement[FE_CHECK_PATTERN], '', $sanitizeMessage);
+        $attribute .= ($pattern === '') ? '' : 'pattern="' . $pattern . '" ';
+
+        // Use system message only,if no custom one is set.
+        if ($formElement[F_FE_DATA_PATTERN_ERROR] == $formElement[F_FE_DATA_PATTERN_ERROR_SYSTEM]) {
+            $formElement[F_FE_DATA_PATTERN_ERROR] = $sanitizeMessage;
+        }
+
+        // For other dateTimePicker than qfq, min/max values need to be converted
+        if ($formElement[FE_DATE_TIME_PICKER_TYPE] !== DATE_TIME_PICKER_QFQ) {
+            self::setNoQfqMinMax($formElement);
+        }
+
+        $attribute .= HelperFormElement::getAttributeList($formElement, [FE_MIN, FE_MAX]);
+
+        $json = AbstractBuildForm::getFormElementForJson($htmlFormElementName, $value, $formElement, null, $wrappedClass);
+
+        $formElement = HelperFormElement::prepareExtraButton($formElement, true);
+
+        $attribute .= HelperFormElement::getAttributeFeMode($formElement[FE_MODE]);
+
+        $input = "<input $attribute>" . HelperFormElement::getHelpBlock() . $formElement[FE_TMP_EXTRA_BUTTON_HTML];
+
+        if ($formElement[FE_TMP_EXTRA_BUTTON_HTML] !== '') {
+            $input = Support::wrapTag('<div class="input-group">', $input);
+        }
+
+        return $input . $formElement[FE_INPUT_EXTRA_BUTTON_INFO];
+
+    }
+
+    /**
+     * @param $formElement
+     * @param $formSpec
+     * @return string
+     */
+    private function getDatePickerClassName($formElement, $formSpec): string {
+        $datePickerClassName = '';
+        if ($formElement[FE_DATE_TIME_PICKER_TYPE] === DATE_TIME_PICKER_QFQ) {
+            $datePickerClassName = 'qfq-datepicker';
+        } elseif (isset($formElement[FE_INPUT_CLEAR_ME]) && $formElement[FE_INPUT_CLEAR_ME] != '0' && $formElement[FE_DATE_TIME_PICKER_TYPE] === DATE_TIME_PICKER_NO) {
+            if (($formSpec[F_MULTI_MODE] ?? '') == 'vertical') {
+                $datePickerClassName = ' qfq-clear-me-multiform';
+            } else {
+                $datePickerClassName = ' qfq-clear-me';
+            }
+        }
+        return $datePickerClassName;
+    }
+
+    /**
+     * @param $formElement
+     * @return array
+     */
+    private function getDefaultDateFormat(&$formElement): array {
+        $defaultDateFormat = explode(' ', $formElement[FE_DATE_FORMAT], 2);
+        $defaultFormat = array();
+        if (isset($defaultDateFormat[1])) {
+            $defaultFormat['time'] = $defaultDateFormat[1];
+            $defaultFormat['date'] = $defaultDateFormat[0];
+            $defaultFormat['timeParts'] = explode(':', $defaultFormat['time'], 3);
+        } else {
+            $defaultFormat['date'] = $formElement[FE_DATE_FORMAT];
+            $defaultFormat['timeParts'] = explode(':', $formElement[FE_DATE_FORMAT], 3);
+        }
+
+        if ($defaultFormat['timeParts'][2] ?? '' === 'ss') {
+            $formElement[FE_SHOW_SECONDS] = 1;
+        }
+        return $defaultFormat;
+    }
+
+    /**
+     * @param $feType
+     * @param $value
+     * @return false|mixed|string
+     */
+    private function formatValueForBrowser($feType, $value) {
+        $dateOldFormat = date_create($value);
+        if ($feType === FE_TYPE_DATE) {
+            $value = date_format($dateOldFormat, "Y-m-d");
+        } elseif ($feType === FE_TYPE_DATETIME) {
+            $value = date_format($dateOldFormat, "Y-m-d H:i");
+        }
+        return $value;
+    }
+
+    /**
+     * @param $feType
+     * @return string
+     */
+    private function getDateTimeBrowserType($feType): string {
+        if ($feType == FE_TYPE_DATE) {
+            $type = 'date';
+        } elseif ($feType == FE_TYPE_TIME) {
+            $type = 'time';
+        } else {
+            $type = 'datetime-local';
+        }
+        return $type;
+    }
+
+    /**
+     * @param $defaultFormat
+     * @param $feType
+     * @return mixed
+     */
+    private function getDateTimeFormatQfq($defaultFormat, $feType) {
+        switch ($defaultFormat['date']) {
+            case FORMAT_DATE_INTERNATIONAL:
+            case FORMAT_DATE_INTERNATIONAL_QFQ:
+            case FORMAT_DATE_GERMAN:
+            case FORMAT_DATE_GERMAN_QFQ:
+                if ($feType == FE_TYPE_DATETIME) {
+                    $defaultFormat['date'] = strtoupper($defaultFormat['date']);
+                    if (empty($defaultFormat['time'])) {
+                        $defaultFormat['time'] = 'HH:mm';
+                    }
+                    $defaultFormat['date'] .= ' ' . $defaultFormat['time'];
+                } else {
+                    $defaultFormat['date'] = strtoupper($defaultFormat['date']);
+                }
+                break;
+        }
+        return $defaultFormat;
+    }
+
+    /**
+     * @param $defaultFormat
+     * @param $feDateTimePickerType
+     * @param $feShowSeconds
+     * @return mixed
+     */
+    private function getTimeFormat($defaultFormat, $feDateTimePickerType, $feShowSeconds) {
+        if ($defaultFormat['timeParts'][0] === 'HH' || $defaultFormat['timeParts'][0] === 'hh') {
+            $defaultFormat['date'] = $defaultFormat['timeParts'][0] . ':' . $defaultFormat['timeParts'][1];
+        } else if ($feDateTimePickerType === DATE_TIME_PICKER_QFQ) {
+            $defaultFormat['date'] = 'HH:mm';
+        } else {
+            $defaultFormat['date'] = 'hh:mm';
+        }
+
+        if ($feShowSeconds == 1) {
+            $defaultFormat['date'] .= ':ss';
+        }
+        return $defaultFormat;
+    }
+
+    /**
+     * @param $enabledDays
+     * @return false|string
+     */
+    private function getDateTimePickerDisabledDays($enabledDays) {
+        // convert enabled days from datetimepicker user input daysOfWeekEnabled to disabled days
+        $enabledDays = explode(',', $enabledDays);
+        $disabledDays = '';
+
+        for ($i = 0; $i <= 6; $i++) {
+            $flagDayPoint = false;
+            foreach ($enabledDays as $day) {
+                if ($day == $i) {
+                    $flagDayPoint = true;
+                }
+            }
+            if ($flagDayPoint == false) {
+                $disabledDays .= $i . ',';
+            }
+        }
+
+        // if last char ',' exists, remove it
+        $lastChar = substr($disabledDays, -1);
+        if ($lastChar == ',') {
+            $disabledDays = substr($disabledDays, 0, -1);
+        }
+        return $disabledDays;
+    }
+
+    /**
+     * @param $formElement
+     * @param $defaultDateFormat
+     * @param $dateTimeKeys
+     * @param $dateTimeAttributes
+     * @param $attribute
+     * @return void
+     * @throws \CodeException
+     */
+    private function setDateTimePickerAttributes($formElement, $defaultDateFormat, $dateTimeKeys, $dateTimeAttributes, &$attribute) {
+        $keyCount = 0;
+        foreach ($dateTimeKeys as $key) {
+            if (isset($formElement[$key]) && $formElement[$key] != "" && $key != FE_DATE_FORMAT) {
+                $attribute .= Support::doAttribute('data-' . $dateTimeAttributes[$keyCount], $formElement[$key]);
+            } elseif ($key == FE_DATE_FORMAT) {
+                $attribute .= Support::doAttribute('data-' . $dateTimeAttributes[$keyCount], $defaultDateFormat);
+            }
+            $keyCount++;
+        }
+    }
+
+    /**
+     * @param $formElement
+     * @return void
+     */
+    private function setNoQfqMinMax(&$formElement) {
+        if ($formElement[FE_TYPE] == FE_TYPE_DATE) {
+            $dateMinMaxFormat = "Y-m-d";
+        } else {
+            $dateMinMaxFormat = "Y-m-d H:i";
+        }
+
+        if (isset($formElement[FE_MIN]) && $formElement[FE_MIN] !== '') {
+            $dateMin = date_create($formElement[FE_MIN]);
+            $formElement[FE_MIN] = date_format($dateMin, $dateMinMaxFormat);
+        }
+
+        if (isset($formElement[FE_MAX]) && $formElement[FE_MAX] !== '') {
+            $dateMax = date_create($formElement[FE_MAX]);
+            $formElement[FE_MAX] = date_format($dateMax, $dateMinMaxFormat);
+        }
+    }
+
+    /**
+     * Check  $value as date/datetime/time value and convert it to FORMAT_DATE_INTERNATIONAL.
+     *
+     * @param array $formElement - if not set, set $formElement[FE_DATE_FORMAT]
+     * @param string $value - date/datetime/time value in format FORMAT_DATE_INTERNATIONAL or FORMAT_DATE_GERMAN
+     *
+     * @return string - checked datetime string
+     * @throws \UserFormException
+     */
+    public static function doDateTime(array &$formElement, $value) {
+
+        // check for browser dateTimePickerType and adjust value
+        $typeBrowser = false;
+
+        if ($formElement[FE_DATE_TIME_PICKER_TYPE] === DATE_TIME_PICKER_BROWSER) {
+            $typeBrowser = true;
+            $datetimeArray = explode("T", $value, 2);
+            if (preg_match("/^(?:2[0-3]|[01][0-9]):[0-5][0-9]$/", $datetimeArray[1])) {
+                $value = $datetimeArray[0] . " " . $datetimeArray[1];
+            }
+        }
+
+        $dateFormat = explode(':', $formElement[FE_DATE_FORMAT], 3);
+        if (isset($dateFormat[2])) {
+            if ($dateFormat[2] === 'ss')
+            $formElement[FE_SHOW_SECONDS] = 1;
+        }
+
+        $regexp = Support::dateTimeRegexp($formElement[FE_TYPE], $formElement[FE_DATE_FORMAT], $formElement[FE_TIME_IS_OPTIONAL] ?? "");
+
+        if (1 !== preg_match('/' . $regexp . '/', $value, $matches) && !$typeBrowser) {
+            $placeholder = Support::getDateTimePlaceholder($formElement);
+            throw new \UserFormException("DateTime format not recognized: $placeholder / $value ", ERROR_DATE_TIME_FORMAT_NOT_RECOGNISED);
+        }
+
+        $showTime = $formElement[FE_TYPE] == FE_TYPE_DATE ? '0' : '1';
+        $value = Support::convertDateTime($value, FORMAT_DATE_INTERNATIONAL, '1', $showTime, $formElement[FE_SHOW_SECONDS]);
+        $formElement[FE_MIN] = Support::convertDateTime($formElement[FE_MIN], FORMAT_DATE_INTERNATIONAL, '1', $showTime, $formElement[FE_SHOW_SECONDS]);
+        if (isset($formElement[FE_MAX]) && $formElement[FE_MAX] !== '') {
+            $formElement[FE_MAX] = Support::convertDateTime($formElement[FE_MAX], FORMAT_DATE_INTERNATIONAL, '1', $showTime, $formElement[FE_SHOW_SECONDS]);
+
+        }
+
+        if ($formElement[FE_TYPE] !== FE_TYPE_TIME) {
+            // Validate date (e.g. 2010-02-31)
+            $dateValue = explode(' ', $value)[0];
+            $dateParts = explode('-', $dateValue);
+            if (!checkdate($dateParts[1], $dateParts[2], $dateParts[0]))
+                throw new \UserFormException("$dateValue is not a valid date.", ERROR_INVALID_DATE);
+        }
+        return $value;
+    }
+}
\ No newline at end of file
diff --git a/extension/Tests/Unit/Core/Helper/DateTimeTest.php b/extension/Tests/Unit/Core/Helper/DateTimeTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..863460e7c4c9e95a9abebd92511cf0e70c3c67b3
--- /dev/null
+++ b/extension/Tests/Unit/Core/Helper/DateTimeTest.php
@@ -0,0 +1,92 @@
+<?php
+
+namespace IMATHUZH\Qfq\Tests\Unit\Core\Helper;
+
+use IMATHUZH\Qfq\Core\Helper\DateTime;
+use IMATHUZH\Qfq\Core\Store\Store;
+use PHPUnit\Framework\TestCase;
+
+class DateTimeTest extends TestCase {
+
+    public function testBuildDateTime () {
+        $formElement[FE_TYPE] = 'datetime';
+        $formElement[FE_DATE_TIME_PICKER_TYPE] = 'qfq';
+        $formElement[FE_DATE_FORMAT] = 'dd.mm.yyyy';
+        $formElement[FE_MIN] = '23.04.2021 21:00';
+        $formElement[FE_MAX] = '14.08.2021 12:00';
+        $formElement[FE_SHOW_SECONDS] = '0';
+        $formElement[FE_PLACEHOLDER] = '';
+
+        self::setFormElementDefaults($formElement);
+
+        $formSpec[F_MULTI_MODE] = '';
+
+        $json = array();
+        $store = Store::getInstance();
+
+        $result = DateTime::buildDateTime($formElement, 'dateFrom', '23.05.2022 23:32', $json, $formSpec, $store, null, 'fixed');
+        $excepted = '<input id="10" name="dateFrom" class="form-control qfq-datepicker" data-reference="testReference" type="text" data-format="DD.MM.YYYY HH:mm" data-show-clear-button="false" data-minDate="23.04.2021 21:00" data-maxDate="14.08.2021 12:00" value="23.05.2022 23:32" data-pattern-error="Please match the format: DD.MM.YYYY HH:mm" placeholder="DD.MM.YYYY HH:mm" min="23.04.2021 21:00" max="14.08.2021 12:00" data-hidden="no" data-disabled="no" data-required="no" ><div class="help-block with-errors hidden"></div>';
+        $this->assertEquals($excepted, $result);
+    }
+
+    /**
+     *  Convert dateTime from form to store it in database
+     *
+     * @return void
+     * @throws \UserFormException
+     */
+    public function testDoDateTime () {
+        $formElement = array();
+        $formElement[FE_DATE_TIME_PICKER_TYPE] = 'qfq';
+        $formElement[FE_DATE_FORMAT] = 'dd.mm.yyyy';
+        $formElement[FE_SHOW_SECONDS] = 1;
+        $formElement[FE_MIN] = '';
+        $formElement[FE_MAX] = '';
+
+        $formElement[FE_TYPE] = 'datetime';
+        $result = DateTime::doDateTime($formElement, '24.04.2020 23:55:12');
+        $this->assertEquals('2020-04-24 23:55:12', $result);
+
+        $formElement[FE_TYPE] = 'date';
+        $result = DateTime::doDateTime($formElement, '24.04.2020');
+        $this->assertEquals('2020-04-24', $result);
+
+        $formElement[FE_TYPE] = 'time';
+        $result = DateTime::doDateTime($formElement, '23:29:12');
+        $this->assertEquals('23:29:12', $result);
+
+        // Test with offset seconds
+        $formElement[FE_SHOW_SECONDS] = 0;
+        $result = DateTime::doDateTime($formElement, '23:29:00');
+        $this->assertEquals('23:29', $result);
+
+        $formElement[FE_TYPE] = 'datetime';
+        $result = DateTime::doDateTime($formElement, '24.04.2020 23:55:00');
+        $this->assertEquals('2020-04-24 23:55', $result);
+
+        // International date format
+        $formElement[FE_DATE_FORMAT] = 'yyyy-mm-dd';
+        $result = DateTime::doDateTime($formElement, '2020-04-24 23:55');
+        $this->assertEquals('2020-04-24 23:55', $result);
+
+        $formElement[FE_TYPE] = 'date';
+        $result = DateTime::doDateTime($formElement, '2020-04-24');
+        $this->assertEquals('2020-04-24', $result);
+
+    }
+
+    public function setFormElementDefaults(&$formElement) {
+        $formElement[FE_HTML_ID] = '10';
+        $formElement[FE_NAME] = 'form1';
+        $formElement[FE_SHOW_ZERO] = '0';
+        $formElement[FE_DATA_REFERENCE] = 'testReference';
+        $formElement[FE_CHECK_PATTERN] = '';
+        $formElement[FE_CHECK_TYPE] = 'pattern';
+        $formElement[FE_MAX_LENGTH] = '';
+        $formElement[F_FE_DATA_PATTERN_ERROR] = '';
+        $formElement[F_FE_DATA_PATTERN_ERROR_SYSTEM] = '';
+        $formElement[FE_DYNAMIC_UPDATE] = 'no';
+        $formElement[FE_TOOLTIP] = '';
+        $formElement[FE_MODE] = 'show';
+    }
+}