Issues (2563)

app/Date/JulianDate.php (1 issue)

Labels
Severity
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
A parse error occurred: Syntax error, unexpected T_STRING, expecting '=' on line 31 at column 24
Loading history...
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&nbsp;BCE', I18N::digits(-$this->year));
99
        }
100
101
        if ($this->new_old_style) {
102
            return I18N::translate('%s&nbsp;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&nbsp;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