. */ declare(strict_types=1); namespace Fisharebest\Webtrees\Factories; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Contracts\TimestampFactoryInterface; use Fisharebest\Webtrees\Contracts\TimestampInterface; use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Site; use Fisharebest\Webtrees\Timestamp; use InvalidArgumentException; use function date; use function date_create_from_format; use function time; /** * Create a timestamp object. */ class TimestampFactory implements TimestampFactoryInterface { /** * @param int $timestamp * @param UserInterface|null $user * * @return TimestampInterface */ public function make(int $timestamp, UserInterface|null $user = null): TimestampInterface { $user ??= Auth::user(); $timezone = $user->getPreference(UserInterface::PREF_TIME_ZONE, Site::getPreference('TIMEZONE')); $locale = I18N::locale()->code(); return new Timestamp($timestamp, $timezone, $locale); } /** * @param string|null $string YYYY-MM-DD HH:MM:SS (as provided by SQL). * @param string $format * @param UserInterface|null $user * * @return TimestampInterface */ public function fromString(string|null $string, string $format = 'Y-m-d H:i:s', UserInterface|null $user = null): TimestampInterface { $string ??= date($format); $timestamp = date_create_from_format($format, $string); if ($timestamp === false) { throw new InvalidArgumentException('date/time "' . $string . '" does not match pattern "' . $format . '"'); } return $this->make($timestamp->getTimestamp(), $user); } /** * @param UserInterface|null $user * * @return TimestampInterface */ public function now(UserInterface|null $user = null): TimestampInterface { return $this->make(time(), $user); } }