1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace Andegna; |
4
|
|
|
|
5
|
|
|
/** |
6
|
|
|
* Class Calender <br /> |
7
|
|
|
* A set of functions to convert ethiopian date to JDN and vise versa. |
8
|
|
|
*/ |
9
|
|
|
class Calender |
10
|
|
|
{ |
11
|
|
|
/** |
12
|
|
|
* Return a true if the year is a leap year based on the ethiopian calendar. |
13
|
|
|
* |
14
|
|
|
* @param int $year the ethiopian date to be checked |
15
|
|
|
* |
16
|
|
|
* @return bool |
17
|
|
|
*/ |
18
|
|
|
public static function isEthiopianLeapYear($year) |
19
|
|
|
{ |
20
|
|
|
if (!is_int($year)) { |
21
|
|
|
trigger_error( |
22
|
|
|
'isEthiopianLeapYear() expects parameter 1 to be numeric. '. |
23
|
|
|
gettype($year).' given', |
24
|
|
|
E_USER_WARNING |
25
|
|
|
); |
26
|
|
|
} |
27
|
|
|
|
28
|
|
|
return ($year + 1) % 4 == 0; |
29
|
|
|
} |
30
|
|
|
|
31
|
|
|
/** |
32
|
|
|
* Returns true if the <code>$month, $day and $year</code> passed |
33
|
|
|
* are a valid date based on the ethiopian calendar. |
34
|
|
|
* |
35
|
|
|
* @param int $month Ethiopian month |
36
|
|
|
* @param int $day Ethiopian day |
37
|
|
|
* @param int $year Ethiopian year (negative for AD) |
38
|
|
|
* |
39
|
|
|
* @return bool |
40
|
|
|
*/ |
41
|
|
|
public static function ethiopianCheckDate($month, $day, $year) |
42
|
|
|
{ |
43
|
|
|
return |
44
|
|
|
// validate all |
45
|
|
|
is_int($month) && is_int($day) && is_int($year) && |
46
|
|
|
// true if the day is btn 1 - 30 |
47
|
|
|
($day <= 30 && $day >= 1) && |
48
|
|
|
// true if the month is btn 1 - 13 |
49
|
|
|
($month <= 13 && $month >= 1) && |
50
|
|
|
// true if the month is 13 then day is btn 1 - 6 |
51
|
|
|
($month == 13 ? $day <= 6 : true) && |
52
|
|
|
// true if the month is 13 & day is 6 then year must be leap year |
53
|
|
|
($month == 13 && $day == 6 ? |
54
|
|
|
self::isEthiopianLeapYear($year) : true); |
55
|
|
|
} |
56
|
|
|
|
57
|
|
|
/** |
58
|
|
|
* Returns the julian date number representation of the |
59
|
|
|
* given ethiopian date. |
60
|
|
|
* |
61
|
|
|
* @param int $month Ethiopian month |
62
|
|
|
* @param int $day Ethiopian day |
63
|
|
|
* @param int $year Ethiopian year (negative for AD) |
64
|
|
|
* |
65
|
|
|
* @return int |
66
|
|
|
*/ |
67
|
|
|
public static function ethiopianToJd($month = 1, $day = 1, $year = 2000) |
68
|
|
|
{ |
69
|
|
|
if (!self::ethiopianCheckDate($month, $day, $year)) { |
70
|
|
|
trigger_error( |
71
|
|
|
'ethiopianToJd() expects the date to be valid.'. |
72
|
|
|
' check ethiopianCheckDate() first', |
73
|
|
|
E_USER_WARNING |
74
|
|
|
); |
75
|
|
|
} |
76
|
|
|
|
77
|
|
|
return (1723856 + 365) + |
78
|
|
|
365 * ($year - 1) + |
79
|
|
|
(int) ($year / 4) + |
80
|
|
|
30 * $month + |
81
|
|
|
$day - 31; |
82
|
|
|
} |
83
|
|
|
|
84
|
|
|
/** |
85
|
|
|
* Returns the ethiopian date string which is represented by |
86
|
|
|
* the passed jdn <br />. |
87
|
|
|
* |
88
|
|
|
* @param int $jdn the Julian Date Number |
89
|
|
|
* @param bool $array if this is true the function returns |
90
|
|
|
* the day,month and year in associative array. |
91
|
|
|
* |
92
|
|
|
* @return array|string |
93
|
|
|
*/ |
94
|
|
|
public static function jdToEthiopian($jdn, $array = false) |
95
|
|
|
{ |
96
|
|
|
if (!is_int($jdn)) { |
97
|
|
|
trigger_error( |
98
|
|
|
'jdToEthiopian() expects parameter 1 to be numeric. '. |
99
|
|
|
gettype($jdn).' given', |
100
|
|
|
E_USER_WARNING |
101
|
|
|
); |
102
|
|
|
|
103
|
|
|
return self::jdToEthiopian(self::ethiopianToJd()); |
104
|
|
|
} |
105
|
|
|
$r = (($jdn - 1723856) % 1461); |
106
|
|
|
$n = ($r % 365) + 365 * (int) ($r / 1460); |
107
|
|
|
$year = 4 * (int) (($jdn - 1723856) / 1461) + |
108
|
|
|
(int) ($r / 365) - (int) ($r / 1460); |
109
|
|
|
$month = (int) ($n / 30) + 1; |
110
|
|
|
$day = ($n % 30) + 1; |
111
|
|
|
|
112
|
|
|
return ($array ? compact('day', 'month', 'year') : "$month/$day/$year"); |
113
|
|
|
} |
114
|
|
|
} |
115
|
|
|
|