You are here

public static function jDateTime::parseFromFormat in Persian Date for Drupal 8 8.4

Parameters

$format:

$date:

Return value

array

2 calls to jDateTime::parseFromFormat()
jDateTime::createDatetimeFromFormat in src/Library/Jalali/jDateTime.php
PersianDrupalDateTime::createFromFormat in src/Plugin/Datetime/PersianDrupalDateTime.php
Creates a date object from an input format.

File

src/Library/Jalali/jDateTime.php, line 693

Class

jDateTime
Class jDateTime @package Morilog\Jalali

Namespace

Drupal\persian_date\Library\Jalali

Code

public static function parseFromFormat($format, $date) {
  if ($format === 'Y-m-d') {
    list($year, $month, $day) = explode('-', $date);
    return [
      'year' => $year,
      'month' => $month,
      'day' => $day,
      'hour' => 12,
      'minute' => 0,
      'second' => 0,
    ];
  }

  // reverse engineer date formats
  $keys = array(
    'Y' => array(
      'year',
      '\\d{4}',
    ),
    'y' => array(
      'year',
      '\\d{2}',
    ),
    'm' => array(
      'month',
      '\\d{2}',
    ),
    'n' => array(
      'month',
      '\\d{1,2}',
    ),
    'M' => array(
      'month',
      '[A-Z][a-z]{3}',
    ),
    'F' => array(
      'month',
      '[A-Z][a-z]{2,8}',
    ),
    'd' => array(
      'day',
      '\\d{2}',
    ),
    'j' => array(
      'day',
      '\\d{1,2}',
    ),
    'D' => array(
      'day',
      '[A-Z][a-z]{2}',
    ),
    'l' => array(
      'day',
      '[A-Z][a-z]{6,9}',
    ),
    'u' => array(
      'hour',
      '\\d{1,6}',
    ),
    'h' => array(
      'hour',
      '\\d{2}',
    ),
    'H' => array(
      'hour',
      '\\d{2}',
    ),
    'g' => array(
      'hour',
      '\\d{1,2}',
    ),
    'G' => array(
      'hour',
      '\\d{1,2}',
    ),
    'i' => array(
      'minute',
      '\\d{2}',
    ),
    's' => array(
      'second',
      '\\d{2}',
    ),
  );

  // convert format string to regex
  $regex = '';
  $chars = str_split($format);
  foreach ($chars as $n => $char) {
    $lastChar = isset($chars[$n - 1]) ? $chars[$n - 1] : '';
    $skipCurrent = '\\' == $lastChar;
    if (!$skipCurrent && isset($keys[$char])) {
      $regex .= '(?P<' . $keys[$char][0] . '>' . $keys[$char][1] . ')';
    }
    else {
      if ('\\' == $char) {
        $regex .= $char;
      }
      else {
        $regex .= preg_quote($char);
      }
    }
  }
  $dt = array();
  $dt['error_count'] = 0;

  // now try to match it
  if (preg_match('#^' . $regex . '$#', $date, $dt)) {
    foreach ($dt as $k => $v) {
      if (is_int($k)) {
        unset($dt[$k]);
      }
    }
    if (!jDateTime::checkdate($dt['month'], $dt['day'], $dt['year'], false)) {
      $dt['error_count'] = 1;
    }
  }
  else {
    $dt['error_count'] = 1;
  }
  $dt['errors'] = array();
  $dt['fraction'] = '';
  $dt['warning_count'] = 0;
  $dt['warnings'] = array();
  $dt['is_localtime'] = 0;
  $dt['zone_type'] = 0;
  $dt['zone'] = 0;
  $dt['is_dst'] = '';
  if (strlen($dt['year']) == 2) {
    $now = jDate::forge('now');
    $x = $now
      ->format('Y') - $now
      ->format('y');
    $dt['year'] += $x;
  }
  $dt['year'] = isset($dt['year']) ? (int) $dt['year'] : 0;
  $dt['month'] = isset($dt['month']) ? (int) $dt['month'] : 0;
  $dt['day'] = isset($dt['day']) ? (int) $dt['day'] : 0;
  $dt['hour'] = isset($dt['hour']) ? (int) $dt['hour'] : 0;
  $dt['minute'] = isset($dt['minute']) ? (int) $dt['minute'] : 0;
  $dt['second'] = isset($dt['second']) ? (int) $dt['second'] : 0;
  return $dt;
}