xref: /webtrees/app/Timestamp.php (revision 19429262d0b300895d8e4f261157cf134c51e39f)
1d97083feSGreg Roach<?php
2d97083feSGreg Roach
3d97083feSGreg Roach/**
4d97083feSGreg Roach * webtrees: online genealogy
5d11be702SGreg Roach * Copyright (C) 2023 webtrees development team
6d97083feSGreg Roach * This program is free software: you can redistribute it and/or modify
7d97083feSGreg Roach * it under the terms of the GNU General Public License as published by
8d97083feSGreg Roach * the Free Software Foundation, either version 3 of the License, or
9d97083feSGreg Roach * (at your option) any later version.
10d97083feSGreg Roach * This program is distributed in the hope that it will be useful,
11d97083feSGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of
12d97083feSGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13d97083feSGreg Roach * GNU General Public License for more details.
14d97083feSGreg Roach * You should have received a copy of the GNU General Public License
15d97083feSGreg Roach * along with this program. If not, see <https://www.gnu.org/licenses/>.
16d97083feSGreg Roach */
17d97083feSGreg Roach
18d97083feSGreg Roachdeclare(strict_types=1);
19d97083feSGreg Roach
20d97083feSGreg Roachnamespace Fisharebest\Webtrees;
21d97083feSGreg Roach
22d97083feSGreg Roachuse Carbon\Carbon;
238e989043SGreg Roachuse Carbon\CarbonImmutable;
24d97083feSGreg Roachuse Fisharebest\Webtrees\Contracts\TimestampInterface;
25d97083feSGreg Roach
268e989043SGreg Roachuse function gregoriantojd;
278e989043SGreg Roach
28d97083feSGreg Roach/**
29d97083feSGreg Roach * A localized date-time.
30d97083feSGreg Roach */
31d97083feSGreg Roachclass Timestamp implements TimestampInterface
32d97083feSGreg Roach{
338e989043SGreg Roach    private CarbonImmutable $carbon;
34d97083feSGreg Roach
35d97083feSGreg Roach    public function __construct(int $timestamp, string $timezone, string $locale)
36d97083feSGreg Roach    {
378e989043SGreg Roach        $this->carbon = CarbonImmutable::createFromTimestamp($timestamp, $timezone);
38d97083feSGreg Roach        $this->carbon->locale($locale);
39d97083feSGreg Roach    }
40d97083feSGreg Roach
41ee551e0bSGreg Roach    public function __clone()
42ee551e0bSGreg Roach    {
43ee551e0bSGreg Roach        $this->carbon = clone($this->carbon);
44ee551e0bSGreg Roach    }
45ee551e0bSGreg Roach
46d97083feSGreg Roach    public function julianDay(): int
47d97083feSGreg Roach    {
48d97083feSGreg Roach        return gregoriantojd($this->carbon->month, $this->carbon->day, $this->carbon->year);
49d97083feSGreg Roach    }
50d97083feSGreg Roach
51d97083feSGreg Roach    public function diffForHumans(): string
52d97083feSGreg Roach    {
53d97083feSGreg Roach        return $this->carbon->diffForHumans();
54d97083feSGreg Roach    }
55d97083feSGreg Roach
56d97083feSGreg Roach    public function format(string $format): string
57d97083feSGreg Roach    {
58d97083feSGreg Roach        return $this->carbon->format($format);
59d97083feSGreg Roach    }
60d97083feSGreg Roach
61d97083feSGreg Roach    public function isoFormat(string $format): string
62d97083feSGreg Roach    {
63d97083feSGreg Roach        return $this->carbon->isoFormat($format);
64d97083feSGreg Roach    }
65d97083feSGreg Roach
66d97083feSGreg Roach    public function toDateString(): string
67d97083feSGreg Roach    {
68d97083feSGreg Roach        return $this->carbon->format('Y-m-d');
69d97083feSGreg Roach    }
70d97083feSGreg Roach
71d97083feSGreg Roach    public function toDateTimeString(): string
72d97083feSGreg Roach    {
73d97083feSGreg Roach        return $this->carbon->format('Y-m-d H:i:s');
74d97083feSGreg Roach    }
75d97083feSGreg Roach
768e989043SGreg Roach    public function compare(TimestampInterface $timestamp): int
77d97083feSGreg Roach    {
788e989043SGreg Roach        return $this->timestamp() <=> $timestamp->timestamp();
79d97083feSGreg Roach    }
80d97083feSGreg Roach
817761cf05SGreg Roach    public function addSeconds(int $seconds): TimestampInterface
82d97083feSGreg Roach    {
838e989043SGreg Roach        return new self(
848e989043SGreg Roach            $this->carbon->addSeconds($seconds)->getTimestamp(),
858e989043SGreg Roach            $this->carbon->timezone->getName(),
860a011512SGreg Roach            $this->carbon->locale
870a011512SGreg Roach        );
88d97083feSGreg Roach    }
89d97083feSGreg Roach
907761cf05SGreg Roach    public function addMinutes(int $minutes): TimestampInterface
91d97083feSGreg Roach    {
928e989043SGreg Roach        return new self(
938e989043SGreg Roach            $this->carbon->addMinutes($minutes)->getTimestamp(),
948e989043SGreg Roach            $this->carbon->timezone->getName(),
950a011512SGreg Roach            $this->carbon->locale
960a011512SGreg Roach        );
97d97083feSGreg Roach    }
98d97083feSGreg Roach
997761cf05SGreg Roach    public function addHours(int $hours): TimestampInterface
100d97083feSGreg Roach    {
1018e989043SGreg Roach        return new self(
1028e989043SGreg Roach            $this->carbon->addHours($hours)->getTimestamp(),
1038e989043SGreg Roach            $this->carbon->timezone->getName(),
1040a011512SGreg Roach            $this->carbon->locale
1050a011512SGreg Roach        );
106d97083feSGreg Roach    }
107d97083feSGreg Roach
1087761cf05SGreg Roach    public function addDays(int $days): TimestampInterface
109d97083feSGreg Roach    {
1108e989043SGreg Roach        return new self(
1118e989043SGreg Roach            $this->carbon->addDays($days)->getTimestamp(),
1128e989043SGreg Roach            $this->carbon->timezone->getName(),
1130a011512SGreg Roach            $this->carbon->locale
1140a011512SGreg Roach        );
115d97083feSGreg Roach    }
116d97083feSGreg Roach
1177761cf05SGreg Roach    public function addMonths(int $months): TimestampInterface
118d97083feSGreg Roach    {
1198e989043SGreg Roach        return new self(
120*19429262SGreg Roach            $this->carbon->addMonths($months)->getTimestamp(),
1218e989043SGreg Roach            $this->carbon->timezone->getName(),
1220a011512SGreg Roach            $this->carbon->locale
1230a011512SGreg Roach        );
124d97083feSGreg Roach    }
125d97083feSGreg Roach
1267761cf05SGreg Roach    public function addYears(int $years): TimestampInterface
127d97083feSGreg Roach    {
1288e989043SGreg Roach        return new self(
1298e989043SGreg Roach            $this->carbon->addYears($years)->getTimestamp(),
1308e989043SGreg Roach            $this->carbon->timezone->getName(),
1310a011512SGreg Roach            $this->carbon->locale
1320a011512SGreg Roach        );
133d97083feSGreg Roach    }
134d97083feSGreg Roach
1357761cf05SGreg Roach    public function subtractSeconds(int $seconds): TimestampInterface
136d97083feSGreg Roach    {
1378e989043SGreg Roach        return new self(
1388e989043SGreg Roach            $this->carbon->subSeconds($seconds)->getTimestamp(),
1398e989043SGreg Roach            $this->carbon->timezone->getName(),
1400a011512SGreg Roach            $this->carbon->locale
1410a011512SGreg Roach        );
142d97083feSGreg Roach    }
143d97083feSGreg Roach
1447761cf05SGreg Roach    public function subtractMinutes(int $minutes): TimestampInterface
145d97083feSGreg Roach    {
1468e989043SGreg Roach        return new self(
1478e989043SGreg Roach            $this->carbon->subMinutes($minutes)->getTimestamp(),
1488e989043SGreg Roach            $this->carbon->timezone->getName(),
1490a011512SGreg Roach            $this->carbon->locale
1500a011512SGreg Roach        );
151d97083feSGreg Roach    }
152d97083feSGreg Roach
1537761cf05SGreg Roach    public function subtractHours(int $hours): TimestampInterface
154d97083feSGreg Roach    {
1558e989043SGreg Roach        return new self(
1568e989043SGreg Roach            $this->carbon->subHours($hours)->getTimestamp(),
1578e989043SGreg Roach            $this->carbon->timezone->getName(),
1580a011512SGreg Roach            $this->carbon->locale
1590a011512SGreg Roach        );
160d97083feSGreg Roach    }
161d97083feSGreg Roach
1627761cf05SGreg Roach    public function subtractDays(int $days): TimestampInterface
163d97083feSGreg Roach    {
1648e989043SGreg Roach        return new self(
1658e989043SGreg Roach            $this->carbon->subDays($days)->getTimestamp(),
1668e989043SGreg Roach            $this->carbon->timezone->getName(),
1670a011512SGreg Roach            $this->carbon->locale
1680a011512SGreg Roach        );
169d97083feSGreg Roach    }
170d97083feSGreg Roach
1717761cf05SGreg Roach    public function subtractMonths(int $months): TimestampInterface
172d97083feSGreg Roach    {
1738e989043SGreg Roach        return new self(
1748e989043SGreg Roach            $this->carbon->subMonths($months)->getTimestamp(),
1758e989043SGreg Roach            $this->carbon->timezone->getName(),
1760a011512SGreg Roach            $this->carbon->locale
1770a011512SGreg Roach        );
178d97083feSGreg Roach    }
179d97083feSGreg Roach
1807761cf05SGreg Roach    public function subtractYears(int $years): TimestampInterface
181d97083feSGreg Roach    {
1828e989043SGreg Roach        return new self(
1838e989043SGreg Roach            $this->carbon->subYears($years)->getTimestamp(),
1848e989043SGreg Roach            $this->carbon->timezone->getName(),
1850a011512SGreg Roach            $this->carbon->locale
1860a011512SGreg Roach        );
187d97083feSGreg Roach    }
188d97083feSGreg Roach
189d97083feSGreg Roach    public function timestamp(): int
190d97083feSGreg Roach    {
191d97083feSGreg Roach        return $this->carbon->getTimestamp();
192d97083feSGreg Roach    }
193d97083feSGreg Roach}
194