|
<?php |
|
|
|
namespace Kanboard\Core; |
|
|
|
use DateTime; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class DateParser extends Base |
|
{ |
|
const DATE_FORMAT = 'm/d/Y'; |
|
const TIME_FORMAT = 'H:i'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getUserDateFormat() |
|
{ |
|
return $this->configModel->get('application_date_format', DateParser::DATE_FORMAT); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getUserDateTimeFormat() |
|
{ |
|
return $this->getUserDateFormat().' '.$this->getUserTimeFormat(); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getUserTimeFormat() |
|
{ |
|
return $this->configModel->get('application_time_format', DateParser::TIME_FORMAT); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getTimeFormats() |
|
{ |
|
return array( |
|
'H:i', |
|
'g:i a', |
|
); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getDateFormats($iso = false) |
|
{ |
|
$formats = array( |
|
$this->getUserDateFormat(), |
|
); |
|
|
|
$isoFormats = array( |
|
'Y-m-d', |
|
'Y_m_d', |
|
); |
|
|
|
$userFormats = array( |
|
'm/d/Y', |
|
'd/m/Y', |
|
'Y/m/d', |
|
'd.m.Y', |
|
); |
|
|
|
if ($iso) { |
|
$formats = array_merge($formats, $isoFormats, $userFormats); |
|
} else { |
|
$formats = array_merge($formats, $userFormats); |
|
} |
|
|
|
return array_unique($formats); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getDateTimeFormats($iso = false) |
|
{ |
|
$formats = array( |
|
$this->getUserDateTimeFormat(), |
|
); |
|
|
|
foreach ($this->getDateFormats($iso) as $date) { |
|
foreach ($this->getTimeFormats() as $time) { |
|
$formats[] = $date.' '.$time; |
|
} |
|
} |
|
|
|
return array_unique($formats); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getAllDateFormats($iso = false) |
|
{ |
|
return array_merge($this->getDateFormats($iso), $this->getDateTimeFormats($iso)); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getAvailableFormats(array $formats) |
|
{ |
|
$values = array(); |
|
|
|
foreach ($formats as $format) { |
|
$values[$format] = date($format).' ('.$format.')'; |
|
} |
|
|
|
return $values; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getParserFormats() |
|
{ |
|
return array( |
|
$this->getUserDateFormat(), |
|
'Y-m-d', |
|
'Y_m_d', |
|
$this->getUserDateTimeFormat(), |
|
'Y-m-d H:i', |
|
'Y_m_d H:i', |
|
); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getTimestamp($value) |
|
{ |
|
if (ctype_digit((string) $value)) { |
|
return (int) $value; |
|
} |
|
|
|
foreach ($this->getParserFormats() as $format) { |
|
$timestamp = $this->getValidDate($value, $format); |
|
|
|
if ($timestamp !== 0) { |
|
return $timestamp; |
|
} |
|
} |
|
|
|
return 0; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private function getValidDate($value, $format) |
|
{ |
|
$date = DateTime::createFromFormat($format, $value); |
|
|
|
if ($date !== false) { |
|
$errors = DateTime::getLastErrors(); |
|
if ($errors === false || |
|
$errors['error_count'] === 0 && $errors['warning_count'] === 0) { |
|
$timestamp = $date->getTimestamp(); |
|
return $timestamp > 0 ? $timestamp : 0; |
|
} |
|
} |
|
|
|
return 0; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function withinDateRange(DateTime $date, DateTime $start, DateTime $end) |
|
{ |
|
return $date >= $start && $date <= $end; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getHours(DateTime $d1, DateTime $d2) |
|
{ |
|
$seconds = abs($d1->getTimestamp() - $d2->getTimestamp()); |
|
return round($seconds / 3600, 2); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getIsoDate($value) |
|
{ |
|
return date('Y-m-d', $this->getTimestamp($value)); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getTimestampFromIsoFormat($value) |
|
{ |
|
return $this->removeTimeFromTimestamp(ctype_digit((string) $value) ? $value : strtotime($value)); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function removeTimeFromTimestamp($timestamp) |
|
{ |
|
return mktime(0, 0, 0, date('m', $timestamp), date('d', $timestamp), date('Y', $timestamp)); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function format(array $values, array $fields, $format) |
|
{ |
|
foreach ($fields as $field) { |
|
if (! empty($values[$field])) { |
|
if (ctype_digit((string) $values[$field])) { |
|
$values[$field] = date($format, $values[$field]); |
|
} |
|
} else { |
|
$values[$field] = ''; |
|
} |
|
} |
|
|
|
return $values; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function convert(array $values, array $fields, $keep_time = false) |
|
{ |
|
foreach ($fields as $field) { |
|
if (! empty($values[$field])) { |
|
$timestamp = $this->getTimestamp($values[$field]); |
|
$values[$field] = $keep_time ? $timestamp : $this->removeTimeFromTimestamp($timestamp); |
|
} |
|
} |
|
|
|
return $values; |
|
} |
|
} |
|
|