You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
364 lines
7.7 KiB
364 lines
7.7 KiB
<?php
|
|
|
|
/**
|
|
* CodeIgniter
|
|
*
|
|
* An open source application development framework for PHP
|
|
*
|
|
* This content is released under the MIT License (MIT)
|
|
*
|
|
* Copyright (c) 2014-2019 British Columbia Institute of Technology
|
|
* Copyright (c) 2019 CodeIgniter Foundation
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
* THE SOFTWARE.
|
|
*
|
|
* @package CodeIgniter
|
|
* @author CodeIgniter Dev Team
|
|
* @copyright 2019 CodeIgniter Foundation
|
|
* @license https://opensource.org/licenses/MIT MIT License
|
|
* @link https://codeigniter.com
|
|
* @since Version 4.0.0
|
|
* @filesource
|
|
*/
|
|
|
|
namespace CodeIgniter\I18n;
|
|
|
|
use DateTime;
|
|
use IntlCalendar;
|
|
|
|
/**
|
|
* Class TimeDifference
|
|
*
|
|
* @package CodeIgniter\I18n
|
|
*/
|
|
class TimeDifference
|
|
{
|
|
/**
|
|
* The timestamp of the "current" time.
|
|
*
|
|
* @var integer
|
|
*/
|
|
protected $currentTime;
|
|
|
|
/**
|
|
* The timestamp to compare the current time to.
|
|
*
|
|
* @var integer
|
|
*/
|
|
protected $testTime;
|
|
|
|
/**
|
|
* Eras.
|
|
*
|
|
* @var float
|
|
*/
|
|
protected $eras = 0;
|
|
|
|
/**
|
|
* Years.
|
|
*
|
|
* @var float
|
|
*/
|
|
protected $years = 0;
|
|
/**
|
|
* Months.
|
|
*
|
|
* @var float
|
|
*/
|
|
protected $months = 0;
|
|
/**
|
|
* Weeks.
|
|
*
|
|
* @var integer
|
|
*/
|
|
protected $weeks = 0;
|
|
/**
|
|
* Days.
|
|
*
|
|
* @var integer
|
|
*/
|
|
protected $days = 0;
|
|
/**
|
|
* Hours.
|
|
*
|
|
* @var integer
|
|
*/
|
|
protected $hours = 0;
|
|
/**
|
|
* Minutes.
|
|
*
|
|
* @var integer
|
|
*/
|
|
protected $minutes = 0;
|
|
/**
|
|
* Seconds.
|
|
*
|
|
* @var integer
|
|
*/
|
|
protected $seconds = 0;
|
|
|
|
/**
|
|
* Difference in seconds.
|
|
*
|
|
* @var integer
|
|
*/
|
|
protected $difference;
|
|
|
|
/**
|
|
* Note: both parameters are required to be in the same timezone. No timezone
|
|
* shifting is done internally.
|
|
*
|
|
* @param DateTime $currentTime
|
|
* @param DateTime $testTime
|
|
*/
|
|
public function __construct(DateTime $currentTime, DateTime $testTime)
|
|
{
|
|
$this->difference = $currentTime->getTimestamp() - $testTime->getTimestamp();
|
|
|
|
$current = IntlCalendar::fromDateTime($currentTime->format('Y-m-d H:i:s'));
|
|
$time = IntlCalendar::fromDateTime($testTime->format('Y-m-d H:i:s'))
|
|
->getTime();
|
|
|
|
$this->currentTime = $current;
|
|
$this->testTime = $time;
|
|
}
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
/**
|
|
* Returns the number of years of difference between the two.
|
|
*
|
|
* @param boolean $raw
|
|
*
|
|
* @return float|integer
|
|
*/
|
|
public function getYears(bool $raw = false)
|
|
{
|
|
if ($raw)
|
|
{
|
|
return $this->difference / YEAR;
|
|
}
|
|
|
|
$time = clone($this->currentTime);
|
|
return $time->fieldDifference($this->testTime, IntlCalendar::FIELD_YEAR);
|
|
}
|
|
|
|
/**
|
|
* Returns the number of months difference between the two dates.
|
|
*
|
|
* @param boolean $raw
|
|
*
|
|
* @return float|integer
|
|
*/
|
|
public function getMonths(bool $raw = false)
|
|
{
|
|
if ($raw)
|
|
{
|
|
return $this->difference / MONTH;
|
|
}
|
|
|
|
$time = clone($this->currentTime);
|
|
return $time->fieldDifference($this->testTime, IntlCalendar::FIELD_MONTH);
|
|
}
|
|
|
|
/**
|
|
* Returns the number of weeks difference between the two dates.
|
|
*
|
|
* @param boolean $raw
|
|
*
|
|
* @return float|integer
|
|
*/
|
|
public function getWeeks(bool $raw = false)
|
|
{
|
|
if ($raw)
|
|
{
|
|
return $this->difference / WEEK;
|
|
}
|
|
|
|
$time = clone($this->currentTime);
|
|
return (int)($time->fieldDifference($this->testTime, IntlCalendar::FIELD_DAY_OF_YEAR) / 7);
|
|
}
|
|
|
|
/**
|
|
* Returns the number of days difference between the two dates.
|
|
*
|
|
* @param boolean $raw
|
|
*
|
|
* @return float|integer
|
|
*/
|
|
public function getDays(bool $raw = false)
|
|
{
|
|
if ($raw)
|
|
{
|
|
return $this->difference / DAY;
|
|
}
|
|
|
|
$time = clone($this->currentTime);
|
|
return $time->fieldDifference($this->testTime, IntlCalendar::FIELD_DAY_OF_YEAR);
|
|
}
|
|
|
|
/**
|
|
* Returns the number of hours difference between the two dates.
|
|
*
|
|
* @param boolean $raw
|
|
*
|
|
* @return float|integer
|
|
*/
|
|
public function getHours(bool $raw = false)
|
|
{
|
|
if ($raw)
|
|
{
|
|
return $this->difference / HOUR;
|
|
}
|
|
|
|
$time = clone($this->currentTime);
|
|
return $time->fieldDifference($this->testTime, IntlCalendar::FIELD_HOUR_OF_DAY);
|
|
}
|
|
|
|
/**
|
|
* Returns the number of minutes difference between the two dates.
|
|
*
|
|
* @param boolean $raw
|
|
*
|
|
* @return float|integer
|
|
*/
|
|
public function getMinutes(bool $raw = false)
|
|
{
|
|
if ($raw)
|
|
{
|
|
return $this->difference / MINUTE;
|
|
}
|
|
|
|
$time = clone($this->currentTime);
|
|
return $time->fieldDifference($this->testTime, IntlCalendar::FIELD_MINUTE);
|
|
}
|
|
|
|
/**
|
|
* Returns the number of seconds difference between the two dates.
|
|
*
|
|
* @param boolean $raw
|
|
*
|
|
* @return integer
|
|
*/
|
|
public function getSeconds(bool $raw = false)
|
|
{
|
|
if ($raw)
|
|
{
|
|
return $this->difference;
|
|
}
|
|
|
|
$time = clone($this->currentTime);
|
|
return $time->fieldDifference($this->testTime, IntlCalendar::FIELD_SECOND);
|
|
}
|
|
|
|
/**
|
|
* Convert the time to human readable format
|
|
*
|
|
* @param string|null $locale
|
|
*
|
|
* @return string
|
|
*/
|
|
public function humanize(string $locale = null): string
|
|
{
|
|
$current = clone($this->currentTime);
|
|
|
|
$years = $current->fieldDifference($this->testTime, IntlCalendar::FIELD_YEAR);
|
|
$months = $current->fieldDifference($this->testTime, IntlCalendar::FIELD_MONTH);
|
|
$days = $current->fieldDifference($this->testTime, IntlCalendar::FIELD_DAY_OF_YEAR);
|
|
$hours = $current->fieldDifference($this->testTime, IntlCalendar::FIELD_HOUR_OF_DAY);
|
|
$minutes = $current->fieldDifference($this->testTime, IntlCalendar::FIELD_MINUTE);
|
|
|
|
$phrase = null;
|
|
|
|
if ($years !== 0)
|
|
{
|
|
$phrase = lang('Time.years', [abs($years)], $locale);
|
|
$before = $years < 0;
|
|
}
|
|
else if ($months !== 0)
|
|
{
|
|
$phrase = lang('Time.months', [abs($months)], $locale);
|
|
$before = $months < 0;
|
|
}
|
|
else if ($days !== 0 && (abs($days) >= 7))
|
|
{
|
|
$weeks = ceil($days / 7);
|
|
$phrase = lang('Time.weeks', [abs($weeks)], $locale);
|
|
$before = $days < 0;
|
|
}
|
|
else if ($days !== 0)
|
|
{
|
|
$phrase = lang('Time.days', [abs($days)], $locale);
|
|
$before = $days < 0;
|
|
}
|
|
else if ($hours !== 0)
|
|
{
|
|
$phrase = lang('Time.hours', [abs($hours)], $locale);
|
|
$before = $hours < 0;
|
|
}
|
|
else if ($minutes !== 0)
|
|
{
|
|
$phrase = lang('Time.minutes', [abs($minutes)], $locale);
|
|
$before = $minutes < 0;
|
|
}
|
|
else
|
|
{
|
|
return lang('Time.now', [], $locale);
|
|
}
|
|
|
|
return $before
|
|
? lang('Time.ago', [$phrase], $locale)
|
|
: lang('Time.inFuture', [$phrase], $locale);
|
|
}
|
|
|
|
/**
|
|
* Allow property-like access to our calculated values.
|
|
*
|
|
* @param $name
|
|
*
|
|
* @return mixed
|
|
*/
|
|
public function __get($name)
|
|
{
|
|
$name = ucfirst(strtolower($name));
|
|
$method = "get{$name}";
|
|
|
|
if (method_exists($this, $method))
|
|
{
|
|
return $this->{$method}($name);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Allow property-like checking for our calculated values.
|
|
*
|
|
* @param $name
|
|
*
|
|
* @return boolean
|
|
*/
|
|
public function __isset($name)
|
|
{
|
|
$name = ucfirst(strtolower($name));
|
|
$method = "get{$name}";
|
|
|
|
return method_exists($this, $method);
|
|
}
|
|
}
|
|
|