82 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace Safe;
 | |
| 
 | |
| use DateInterval;
 | |
| use DateTimeInterface;
 | |
| use DateTimeZone;
 | |
| use Safe\Exceptions\DatetimeException;
 | |
| 
 | |
| /** this class implements a safe version of the Datetime class */
 | |
| class DateTime extends \DateTime
 | |
| {
 | |
|     //switch from regular datetime to safe version
 | |
|     private static function createFromRegular(\DateTime $datetime): self
 | |
|     {
 | |
|         return new self($datetime->format('Y-m-d H:i:s.u'), $datetime->getTimezone());
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param string $format
 | |
|      * @param string $time
 | |
|      * @param DateTimeZone|null $timezone
 | |
|      * @throws DatetimeException
 | |
|      */
 | |
|     public static function createFromFormat($format, $time, $timezone = null): self
 | |
|     {
 | |
|         $datetime = parent::createFromFormat($format, $time, $timezone);
 | |
|         if ($datetime === false) {
 | |
|             throw DatetimeException::createFromPhpError();
 | |
|         }
 | |
|         return self::createFromRegular($datetime);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param DateTimeInterface $datetime2 The date to compare to.
 | |
|      * @param boolean $absolute [optional] Whether to return absolute difference.
 | |
|      * @return DateInterval The DateInterval object representing the difference between the two dates.
 | |
|      * @throws DatetimeException
 | |
|      */
 | |
|     public function diff($datetime2, $absolute = false): DateInterval
 | |
|     {
 | |
|         /** @var \DateInterval|false $result */
 | |
|         $result = parent::diff($datetime2, $absolute);
 | |
|         if ($result === false) {
 | |
|             throw DatetimeException::createFromPhpError();
 | |
|         }
 | |
|         return $result;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param string $modify A date/time string. Valid formats are explained in <a href="https://secure.php.net/manual/en/datetime.formats.php">Date and Time Formats</a>.
 | |
|      * @return DateTime Returns the DateTime object for method chaining.
 | |
|      * @throws DatetimeException
 | |
|      */
 | |
|     public function modify($modify): self
 | |
|     {
 | |
|         /** @var DateTime|false $result */
 | |
|         $result = parent::modify($modify);
 | |
|         if ($result === false) {
 | |
|             throw DatetimeException::createFromPhpError();
 | |
|         }
 | |
|         return $result;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param int $year
 | |
|      * @param int $month
 | |
|      * @param int $day
 | |
|      * @return DateTime
 | |
|      * @throws DatetimeException
 | |
|      */
 | |
|     public function setDate($year, $month, $day): self
 | |
|     {
 | |
|         /** @var DateTime|false $result */
 | |
|         $result = parent::setDate($year, $month, $day);
 | |
|         if ($result === false) {
 | |
|             throw DatetimeException::createFromPhpError();
 | |
|         }
 | |
|         return $result;
 | |
|     }
 | |
| }
 |