public function evaluateAttributes($event) { if (strncmp($this->sourceFormat, 'php:', 4) === 0) { $sourceFormat = FormatConverter::convertDatePhpToIcu(substr($this->sourceFormat, 4)); } else { $sourceFormat = $this->sourceFormat; } $formatter = new \IntlDateFormatter(Yii::$app->formatter->locale, null, null, Yii::$app->formatter->timeZone, Yii::$app->formatter->calendar, $sourceFormat); foreach ($this->attributes as $attribute) { $value = $this->owner->{$attribute}; if (empty($value)) { continue; } $this->owner->{$attribute} = Yii::$app->formatter->asDateTime($formatter->parse($value), $this->destinationFormat); } }
/** * Creates date time object from date string * * @param string $dateString * @param string|null $timeZone * @param string $format * @throws \Exception * @return \DateTime */ private function createDateTime($dateString, $timeZone = null, $format = 'yyyy-MM-dd') { $pattern = $format ? $format : null; if (!$timeZone) { $timeZone = date_default_timezone_get(); } $calendar = \IntlDateFormatter::GREGORIAN; $intlDateFormatter = new \IntlDateFormatter(\Locale::getDefault(), \IntlDateFormatter::NONE, \IntlDateFormatter::NONE, $timeZone, $calendar, $pattern); $intlDateFormatter->setLenient(false); $timestamp = $intlDateFormatter->parse($dateString); if (intl_get_error_code() != 0) { throw new \Exception(intl_get_error_message()); } // read timestamp into DateTime object - the formatter delivers in UTC $dateTime = new \DateTime(sprintf('@%s UTC', $timestamp)); if ('UTC' !== $timeZone) { try { $dateTime->setTimezone(new \DateTimeZone($timeZone)); } catch (\Exception $e) { throw new \Exception($e->getMessage(), $e->getCode(), $e); } } return $dateTime; }
/** * Convert localized string representations to integer, float or date values * * Subclasses can support localized input formats by calling this method * from a filter. * * Non-string values get trimmed and converted to integer, float or * \DateTime, depending on $type. Invalid values are returned as string. The * input filter should validate filtered data by checking the datatype via * validateType(). * * @param string $value Localized input string * @param string $type Data type (integer, float, date). Any other value will be ignored. * @return mixed Normalized value or input string */ public function normalize($value, $type) { // Integers and floats are validated first to prevent successful parsing // of strings containing invalid characters with the invalid part simply // cut off. switch ($type) { case 'integer': $value = trim($value); if (\Zend\Validator\StaticValidator::execute($value, 'Zend\\I18n\\Validator\\IsInt')) { $value = \Zend\Filter\StaticFilter::execute($value, 'Zend\\I18n\\Filter\\NumberParse', array('type' => \NumberFormatter::TYPE_INT32)); } break; case 'float': $value = trim($value); if (\Zend\Validator\StaticValidator::execute($value, 'Zend\\I18n\\Validator\\IsFloat')) { $value = \Zend\Filter\StaticFilter::execute($value, 'Zend\\I18n\\Filter\\NumberParse', array('type' => \NumberFormatter::TYPE_DOUBLE)); } break; case 'date': $value = trim($value); $validator = new \Zend\I18n\Validator\DateTime(); $validator->setDateType(\IntlDateFormatter::SHORT); if ($validator->isValid($value)) { // Some systems accept invalid date separators, like '/' // with a de_DE locale which should accept only '.'. // An extra comparision of the locale-specific pattern and // the input string is necessary. // This also enforces 4-digit years to avoid any confusion // with 2-digit year input. $pattern = preg_quote($validator->getPattern(), '#'); // Get the year part out of the way first. $pattern = preg_replace('/y+/', '§', $pattern); // Remaining letters are placeholders for digits. $pattern = preg_replace('/[a-zA-Z]+/', '\\d+', $pattern); // Set the year pattern. $pattern = str_replace('§', '\\d{4}', $pattern); if (preg_match("#^{$pattern}\$#", $value)) { $formatter = new \IntlDateFormatter(\Locale::getDefault(), \IntlDateFormatter::SHORT, \IntlDateFormatter::NONE, 'UTC'); $value = \DateTime::createFromFormat('U', $formatter->parse($value)); } } break; } return $value; }
/** * parses a date string into UNIX timestamp * * if "strict dates" is set, this function uses the DateTime or IntlDateFormatter * class to parse the string according to a specific format. If it is not, we * use the conventional strtotime() function, with the enhancement that if the * non-American style format is used with slashes "d/m/Y" the string is prepared * so strtotime can parse it correctly * * @param string $string the string to parse; if not given, defaults to now * @param object $column_atts the column object; used to identify the field for * user feedback * @param bool $zero_time if set, zero the time portion of the date so it * won't interfere with date comparisons * @return int|bool UNIX timestamp or false if parse fails */ public static function parse_date($string = false, $column = '', $zero_time = false) { if (false === $string) { return false; } $string = Participants_Db::set_filter('parse_date', $string, $column); // is it already a timestamp? if (self::is_valid_timestamp($string)) { //if (WP_DEBUG and is_object($column)) error_log(__METHOD__.' tried to parse timestamp from '. $column->name); return $string; } $date = false; // if it is a default zero timestamp, treat it as "no date" if ($string === '0000-00-00 00:00:00') { return false; } /* * we have two options to parse a date string into a timestamp: the * IntlDateFormatter class or the DateTime class. The IntlDateFormatter * class can parse localized text dates, but it seems commonly unavailable, * at least on English-speaking servers. The DateTime class is widely * available, but can't parse non-English text dates. It can parse numeric * date representations, so if the intl module is not available, we try to * use DateTime. If that is not available, we use strtotime with the added trick * of swapping the date/month if they are slashes so slashed European notation * can be correctly parsed */ self::$date_mode = 'none'; $errors = false; $the_Date = false; // test for MySQL-format timestamp $is_MySQL_timestamp = preg_match('#^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$#', $string) === 1 ? true : false; //error_log(__METHOD__.' object? '.(is_object($column)?'yes':'no').' strict dates? '.(self::plugin_setting_is_true('strict_dates', false)?'yes':'no').' timestamp? '.($is_MySQL_timestamp?'yes':'no')); if (self::plugin_setting_is_true('strict_dates', false) and is_object($column) and !$is_MySQL_timestamp) { //error_log(__METHOD__.' intl? '.(class_exists('IntlDateFormatter')?'yes':'no').' datetime? '.(class_exists('DateTime')?'yes':'no')); if (class_exists('IntlDateFormatter')) { self::$date_mode = 'Intl'; $DateFormat = new IntlDateFormatter(get_locale(), IntlDateFormatter::LONG, IntlDateFormatter::NONE, NULL, NULL, Participants_Db::get_ICU_date_format(self::$plugin_options['input_date_format'])); $DateFormat->setLenient(false); // we want it strict $timestamp = $DateFormat->parse($string); if ($DateFormat->getErrorCode() !== 0) { $errors = array('code' => $DateFormat->getErrorCode(), 'error' => $DateFormat->getErrorMessage()); } if (!$errors) { $the_Date = new DateTime(); $the_Date->setTimestamp($timestamp); } elseif (WP_DEBUG) { error_log(__METHOD__ . ' IntlDateFormatter error: format string: ' . Participants_Db::get_ICU_date_format(self::$plugin_options['input_date_format']) . ' timestamp: ' . $timestamp . ' formatter error: ' . $DateFormat->getErrorMessage()); } } if (!$the_Date && class_exists('DateTime')) { self::$date_mode = 'DateTime'; $the_Date = DateTime::createFromFormat(self::$plugin_options['input_date_format'], $string); } if (is_object($the_Date)) { $errors = $the_Date->getLastErrors(); if ($errors['warning_count'] === 0 && $errors['error_count'] === 0) { $errors = false; } } if (is_array($errors) && !empty($string)) { $the_Date = false; if (is_object(self::$validation_errors) and is_object($column)) { self::$validation_errors->add_error($column->name, sprintf(__('The date for "%s" was invalid. Please input the date with the exact format shown', 'participants-database'), $column->title)); } if (WP_DEBUG) { error_log(__METHOD__ . ' DateTime parse error: ' . implode(', ', $errors)); } } /* * if we have a valid date, convert to timestamp */ if ($the_Date) { /* * zero the time so date equality comparisons can be made */ if ($zero_time) { $the_Date->setTime(0, 0); } $date = $the_Date->format('U'); } } /* * if we haven't got a timestamp, parse the date the regular way */ if ($date === false or !self::is_valid_timestamp($date)) { $date = false; // no valid date yet if (is_object($column) && $column->form_element == 'timestamp') { if ($zero_time) { /* * we need to zero the time, we first try to do it using the DateTime class */ $the_Date = new DateTime($string); if (is_object($the_Date)) { $the_Date->setTime(0, 0); $string = $the_Date->format(self::$date_format); } else { /* * remove the time portion of the timestamp */ $string = preg_replace('# [0-9]{2}:[0-9]{2}:[0-9]{2}$#', '', $string); $string .= ' 00:00 -0'; } } } /* * @version 1.6 * Most of the time, the default PHP timezone is the current setting, but * experience has shown it's necessary to reset it for the conversion to make * sure. We also must assume that the database server and PHP server are on * the same TZ. */ date_default_timezone_set(self::get_timezone()); setlocale(LC_ALL, get_locale()); /* * @version 1.6 * added strptime method for locaized dates * * this only works for known formats...so timestamps and when "strict dates" is enabled */ if (function_exists('strptime') && (self::plugin_setting_is_true('strict_dates', false) || $is_MySQL_timestamp)) { self::$date_mode = 'strptime'; if ($is_MySQL_timestamp) { $format = '%Y-%m-%d'; } else { $format_setting = Participants_Db::plugin_setting_is_set('input_date_format') ? Participants_Db::plugin_setting('input_date_format') : get_bloginfo('date_format'); $format = Participants_Db::translate_date_format($format_setting, 'strftime'); } $date_array = strptime($string, $format); $date = mktime($date_array['tm_hour'], $date_array['tm_min'], $date_array['tm_sec'], $date_array['tm_mon'] + 1, $date_array['tm_mday'], $date_array['tm_year'] + 1900); } if ($date === false) { self::$date_mode = 'strtotime'; $date = strtotime(self::date_order_fix($string)); } } return $date; }
/** * {@inheritdoc} * @SuppressWarnings(PHPMD.NPathComplexity) */ public function date($date = null, $locale = null, $useTimezone = true) { $locale = $locale ?: $this->_localeResolver->getLocale(); $timezone = $useTimezone ? $this->getConfigTimezone() : date_default_timezone_get(); if (empty($date)) { return new \DateTime('now', new \DateTimeZone($timezone)); } elseif ($date instanceof \DateTime) { return $date->setTimezone(new \DateTimeZone($timezone)); } elseif (!is_numeric($date)) { $formatter = new \IntlDateFormatter($locale, \IntlDateFormatter::SHORT, \IntlDateFormatter::SHORT, new \DateTimeZone($timezone)); $date = $formatter->parse($date) ?: (new \DateTime($date))->getTimestamp(); } return (new \DateTime(null, new \DateTimeZone($timezone)))->setTimestamp($date); }
static function formatIntl($date) { $fmt = new IntlDateFormatter("pt_BR", IntlDateFormatter::FULL, IntlDateFormatter::FULL, 'America/Sao_Paulo', IntlDateFormatter::GREGORIAN, "d 'de' MMMM 'de' y"); return $fmt->parse($date); }
private function parseDateByPattern($formattedDate, $pattern) { $ftm = new IntlDateFormatter($this->locale, null, null, $this->timezoneName, null, $pattern); return $ftm->parse($formattedDate); }
/** * Convert given date to default (UTC) timezone * * @param string $date * @return \DateTime|null */ protected function _convertDate($date) { $timezone = $this->getColumn()->getTimezone() !== false ? $this->_localeDate->getConfigTimezone() : 'UTC'; $adminTimeZone = new \DateTimeZone($timezone); $formatter = new \IntlDateFormatter($this->localeResolver->getLocale(), \IntlDateFormatter::SHORT, \IntlDateFormatter::NONE, $adminTimeZone); $simpleRes = new \DateTime(null, $adminTimeZone); $simpleRes->setTimestamp($formatter->parse($date)); $simpleRes->setTime(0, 0, 0); $simpleRes->setTimezone(new \DateTimeZone('UTC')); return $simpleRes; }
/** * Convert given date to default (UTC) timezone * * @param string $date * @return \DateTime|null */ protected function _convertDate($date) { $adminTimeZone = new \DateTimeZone($this->_scopeConfig->getValue($this->_localeDate->getDefaultTimezonePath(), \Magento\Store\Model\ScopeInterface::SCOPE_STORE)); $formatter = new \IntlDateFormatter($this->localeResolver->getLocale(), \IntlDateFormatter::SHORT, \IntlDateFormatter::NONE, $adminTimeZone); $simpleRes = new \DateTime(null, $adminTimeZone); $simpleRes->setTimestamp($formatter->parse($date)); $simpleRes->setTime(0, 0, 0); $simpleRes->setTimezone(new \DateTimeZone('UTC')); return $simpleRes; }
<?php $fmt = new IntlDateFormatter("en_US", IntlDateFormatter::FULL, IntlDateFormatter::FULL); var_dump($fmt->parse("Wednesday, January 20, 2038 3:14:07 AM GMT"));
<?php $df = new IntlDateFormatter(Locale::getDefault(), 2, -1, "America/Los_Angeles", 1, "MM*yyyy*dd"); $df->setLenient(false); $timestamp = $df->parse("06*2010*02"); var_dump($timestamp);
/** * Locale Formatted datetime to UTC Timestamp * * @example Locale 22/10/15 14:17 to UTC Timestamp 1445516220 (2015-10-22 12:17:00) * * @param $datetime * @param null $locale * @return int|string */ public function localeFormattedToUTCTimestamp($datetime, $locale = null) { parent::setLocale($locale); $dft = new IDF($this->locale, IDF::SHORT, IDF::SHORT, $this->timezone, IDF::GREGORIAN); return $dft->parse($datetime); }
/** * parses a date string into UNIX timestamp * * if "strict dates" is set, this function uses the DateTime or IntlDateFormatter * class to parse the string according to a specific format. If it is not, we * use the conventional strtotime() function, with the enhancement that if the * non-American style format is used with slashes "d/m/Y" the string is prepared * so strtotime can parse it correctly * * @param string $string the string to parse; if not given, defaults to now * @param object $column_atts the column object; used to identify the field for * user feedback * @param bool $zero_time if set, zero the time portion of the date so it * won't interfere with date comparisons * @return int|bool UNIX timestamp or false if parse fails */ public static function parse_date($string = false, $column = '', $zero_time = false) { if (false === $string) { return false; } $string = Participants_Db::set_filter('parse_date', $string, $column); // it's already a timestamp if (self::is_valid_timestamp($string)) { //if (WP_DEBUG and is_object($column)) error_log(__METHOD__.' tried to parse timestamp from '. $column->name); return $string; } $date = false; // if it is a default zero timestamp or other empty value, treat it as "no date" if ($string == '0000-00-00 00:00:00' || empty($string)) { return false; } /* * we have two options to parse a date string into a timestamp: the * IntlDateFormatter class or the DateTime class. The IntlDateFormatter * class can parse localized text dates, but it seems commonly unavailable, * at least on English-speaking servers. The DateTime class is widely * available, but can't parse non-English text dates. It can parse numeric * date representations, so if the intl module is not available, we try to * use DateTime. If that is not available, we use strtotime with the added trick * of swapping out the separators if they are slashes so slashed European * notation can be correctly parsed */ $mode = 'none'; $timestamp = is_object($column) && $column->form_element == 'timestamp' || preg_match('#^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$#', $string) == 1 ? true : false; if (self::$plugin_options['strict_dates'] == 1 and is_object($column) and !$timestamp) { if (class_exists('IntlDateFormatter')) { $mode = 'Intl'; $DateFormat = new IntlDateFormatter(WPLANG, IntlDateFormatter::LONG, IntlDateFormatter::NONE, NULL, NULL, Participants_Db::get_ICU_date_format(self::$date_format)); //error_log(__METHOD__.' format object:'.print_r($DateFormat,1)); $timestamp = $DateFormat->parse($string); $the_Date = new DateTime(); $the_Date->setTimestamp($timestamp); } else { if (class_exists('DateTime')) { $mode = 'DateTime'; $the_Date = DateTime::createFromFormat(self::$date_format, $string); } } //error_log(__METHOD__.' date:'.print_r($the_Date,1)); if (is_array(date_get_last_errors()) && !empty($string)) { $errors = date_get_last_errors(); if ($errors['warning_count'] > 0 || $errors['error_count'] > 0) { $the_Date = false; if (is_object(self::$validation_errors) and is_object($column)) { self::$validation_errors->add_error($column->name, sprintf(__('The date for "%s" was invalid. Please input the date with the exact format shown', 'participants-database'), $column->title)); } } } /* * if we have a valid date, convert to timestamp */ if ($the_Date) { /* * zero the time so date equality comparisons can be made */ if ($zero_time) { $the_Date->setTime(0, 0); } $date = $the_Date->format('U'); } } // ob_start(); // var_dump($date); // error_log(__METHOD__.' date value:'.ob_get_clean().' mode:'.$mode); /* * if we haven't got a timestamp, parse the date the regular way */ if ($date === false or !self::is_valid_timestamp($date)) { $mode = 'strtotime'; if (is_object($column) && $column->form_element == 'date') { /* * deal with the common special case of non-American-style numeric date with slashes */ if (false !== strpos($string, '/')) { $date_parts = explode('/', self::$date_format); $day_index = array_search('d', $date_parts) !== false ? array_search('d', $date_parts) : array_search('j', $date_parts); $month_index = array_search('m', $date_parts) !== false ? array_search('m', $date_parts) : array_search('n', $date_parts); if ($day_index !== false && $month_index !== false && $day_index < $month_index) { $string = str_replace('/', '-', $string); } } } elseif (is_object($column) && $column->form_element == 'timestamp') { if ($zero_time) { /* * we need to zero the time, we first try to do it using the DateTime class */ $the_Date = new DateTime($string); if (is_object($the_Date)) { $the_Date->setTime(0, 0); $string = $the_Date->format(self::$date_format); } else { /* * remove the time portion of the timestamp */ $string = preg_replace('# [0-9]{2}:[0-9]{2}:[0-9]{2}$#', '', $string); $string .= ' 00:00 -0'; } } } /* * Most of the time, the default PHP timezone is the current setting, but * experience has shown it's necessary to reset it for the conversion to make * sure. We also must assume that the database server and PHP server are on * the same TZ. */ date_default_timezone_set(ini_get('date.timezone')); // ini_get('date.timezone') $date = strtotime($string); } //if (WP_DEBUG) error_log(__METHOD__.' mode: ' . $mode . ' timestamp:' . $date); return $date; }
/** * Get Date Time Object according to localized formated datetime * * @param string $date localized fromated date string * * @return \DateTime */ public static function getDateTimeObjectFromLocaleDate($date) { $formatter = new \IntlDateFormatter(\Locale::getDefault(), \IntlDateFormatter::MEDIUM, \IntlDateFormatter::NONE); $dateTime = new \DateTime(); $dateTime->setTimestamp($formatter->parse($date)); return $dateTime; }