1 | <?php |
||
2 | |||
3 | /** |
||
4 | * webtrees: online genealogy |
||
5 | * Copyright (C) 2025 webtrees development team |
||
6 | * This program is free software: you can redistribute it and/or modify |
||
7 | * it under the terms of the GNU General Public License as published by |
||
8 | * the Free Software Foundation, either version 3 of the License, or |
||
9 | * (at your option) any later version. |
||
10 | * This program is distributed in the hope that it will be useful, |
||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
13 | * GNU General Public License for more details. |
||
14 | * You should have received a copy of the GNU General Public License |
||
15 | * along with this program. If not, see <https://www.gnu.org/licenses/>. |
||
16 | */ |
||
17 | |||
18 | declare(strict_types=1); |
||
19 | |||
20 | namespace Fisharebest\Webtrees\Date; |
||
21 | |||
22 | use Fisharebest\ExtCalendar\JulianCalendar; |
||
23 | use Fisharebest\Webtrees\I18N; |
||
24 | |||
25 | /** |
||
26 | * Definitions for proleptic Julian dates. |
||
27 | */ |
||
28 | class JulianDate extends AbstractGregorianJulianDate |
||
29 | { |
||
30 | // GEDCOM calendar escape |
||
31 | public const string ESCAPE = '@#DJULIAN@'; |
||
0 ignored issues
–
show
Bug
introduced
by
![]() |
|||
32 | |||
33 | // For dates recorded in new-style/old-style format, e.g. 2 FEB 1743/44 |
||
34 | private bool $new_old_style = false; |
||
35 | |||
36 | /** |
||
37 | * Create a date from either: |
||
38 | * a Julian day number |
||
39 | * day/month/year strings from a GEDCOM date |
||
40 | * another CalendarDate object |
||
41 | * |
||
42 | * @param array<string>|int|AbstractCalendarDate $date |
||
43 | */ |
||
44 | public function __construct($date) |
||
45 | { |
||
46 | $this->calendar = new JulianCalendar(); |
||
47 | parent::__construct($date); |
||
48 | } |
||
49 | |||
50 | /** |
||
51 | * Most years are 1 more than the previous, but not always (e.g. 1BC->1AD) |
||
52 | * |
||
53 | * @param int $year |
||
54 | * |
||
55 | * @return int |
||
56 | */ |
||
57 | protected function nextYear(int $year): int |
||
58 | { |
||
59 | if ($year === -1) { |
||
60 | return 1; |
||
61 | } |
||
62 | |||
63 | return $year + 1; |
||
64 | } |
||
65 | |||
66 | /** |
||
67 | * Process new-style/old-style years and years BC |
||
68 | * |
||
69 | * @param string $year |
||
70 | * |
||
71 | * @return int |
||
72 | */ |
||
73 | protected function extractYear(string $year): int |
||
74 | { |
||
75 | if (preg_match('/^(\d\d\d\d)\/\d{1,4}$/', $year, $match)) { |
||
76 | // Assume the first year is correct |
||
77 | $this->new_old_style = true; |
||
78 | |||
79 | return (int) $match[1] + 1; |
||
80 | } |
||
81 | |||
82 | if (preg_match('/^(\d+) B\.C\.$/', $year, $match)) { |
||
83 | return -(int) $match[1]; |
||
84 | } |
||
85 | |||
86 | return (int) $year; |
||
87 | } |
||
88 | |||
89 | /** |
||
90 | * Generate the %Y format for a date. |
||
91 | * |
||
92 | * @return string |
||
93 | */ |
||
94 | protected function formatLongYear(): string |
||
95 | { |
||
96 | if ($this->year < 0) { |
||
97 | return /* I18N: BCE=Before the Common Era, for Julian years < 0. See https://en.wikipedia.org/wiki/Common_Era */ |
||
98 | I18N::translate('%s BCE', I18N::digits(-$this->year)); |
||
99 | } |
||
100 | |||
101 | if ($this->new_old_style) { |
||
102 | return I18N::translate('%s CE', I18N::digits(sprintf('%d/%02d', $this->year - 1, $this->year % 100))); |
||
103 | } |
||
104 | |||
105 | /* I18N: CE=Common Era, for Julian years > 0. See https://en.wikipedia.org/wiki/Common_Era */ |
||
106 | return I18N::translate('%s CE', I18N::digits($this->year)); |
||
107 | } |
||
108 | |||
109 | /** |
||
110 | * Generate the %E format for a date. |
||
111 | * |
||
112 | * @return string |
||
113 | */ |
||
114 | protected function formatGedcomYear(): string |
||
115 | { |
||
116 | if ($this->year < 0) { |
||
117 | return sprintf('%04d B.C.', -$this->year); |
||
118 | } |
||
119 | |||
120 | if ($this->new_old_style) { |
||
121 | return sprintf('%04d/%02d', $this->year - 1, $this->year % 100); |
||
122 | } |
||
123 | |||
124 | return sprintf('%04d', $this->year); |
||
125 | } |
||
126 | } |
||
127 |