root/lang/php/Date_Holidays_Driver_Japanese/src/Date/Holidays/Driver/Japanese.php @ 9322

Revision 9322, 13.5 kB (checked in by shimooka, 7 years ago)

fixed condition

Line 
1<?php
2/* vim: set expandtab tabstop=4 shiftwidth=4: */
3/**
4 * Driver for holidays in Japanese
5 *
6 * PHP Version 4
7 *
8 * Copyright (c) 1997-2008 The PHP Group
9 *
10 * This source file is subject to version 3.0 of the PHP license,
11 * that is bundled with this package in the file LICENSE, and is
12 * available at through the world-wide-web at
13 * http://www.php.net/license/3_01.txt.
14 * If you did not receive a copy of the PHP license and are unable to
15 * obtain it through the world-wide-web, please send a note to
16 * license@php.net so we can mail you a copy immediately.
17 *
18 * @category Date
19 * @package  Date_Holidays
20 * @author   Hideyuki Shimooka <shimooka@doyouphp.jp>
21 * @license  http://www.php.net/license/3_01.txt PHP License 3.0.1
22 * @version  $Id$
23 * @link     http://pear.php.net/package/Date_Holidays
24 * @see      http://www.h3.dion.ne.jp/~sakatsu/holiday_topic.htm
25 */
26
27require_once 'Date/Holidays/Driver.php';
28
29/**
30 * class that calculates Japanese holidays
31 *
32 * @category   Date
33 * @package    Date_Holidays
34 * @subpackage Driver
35 * @author     Hideyuki Shimooka <shimooka@doyouphp.jp>
36 * @license    http://www.php.net/license/3_01.txt PHP License 3.0.1
37 * @version    $Id$
38 * @link       http://pear.php.net/package/Date_Holidays
39 * @see        http://www.h3.dion.ne.jp/~sakatsu/holiday_topic.htm
40 */
41class Date_Holidays_Driver_Japanese extends Date_Holidays_Driver
42{
43    /**
44     * Constructor
45     *
46     * Use the Date_Holidays::factory() method to construct an object of a
47     * certain driver
48     *
49     * @access   protected
50     */
51    function Date_Holidays_Driver_Japanese()
52    {
53    }
54
55    /**
56     * Build the internal arrays that contain data about the calculated holidays
57     *
58     * @access   protected
59     * @return   boolean true on success, otherwise a PEAR_ErrorStack object
60     * @throws   object PEAR_ErrorStack
61     */
62    function _buildHolidays()
63    {
64        parent::_buildHolidays();
65
66        $this->_buildNewYearsDay();
67        $this->_buildComingofAgeDay();
68        $this->_buildNationalFoundationDay();
69        $this->_buildVernalEquinoxDay();
70        $this->_buildShowaDay();
71        $this->_buildConstitutionMemorialDay();
72        $this->_buildGreeneryDay();
73        $this->_buildChildrensDay();
74        $this->_buildMarineDay();
75        $this->_buildRespectfortheAgedDay();
76        $this->_buildAutumnalEquinoxDay();
77        $this->_buildHealthandSportsDay();
78        $this->_buildNationalCultureDay();
79        $this->_buildLaborThanksgivingDay();
80        $this->_buildEmperorsBirthday();
81
82        $this->_buildOtherMemorialDays();
83
84        $this->_buildSubstituteHolidays();
85
86        return true;
87    }
88
89    /**
90     * Method that returns an array containing the ISO3166 codes that may possibly
91     * identify a driver.
92     *
93     * @static
94     * @access public
95     * @return array possible ISO3166 codes
96     */
97    function getISO3166Codes()
98    {
99        return array('jp', 'jpn');
100    }
101
102    /**
103     * build day of New Year's Day
104     *
105     * @access   private
106     */
107    function _buildNewYearsDay()
108    {
109        if ($this->_year >= 1949) {
110            $this->_addHoliday('newYearsDay',
111                               $this->_year . '-01-01',
112                               'New Year\'s Day');
113        }
114    }
115
116    /**
117     * build day of Coming of Age Day
118     *
119     * @access   private
120     */
121    function _buildComingofAgeDay()
122    {
123        $date = null;
124        if ($this->_year >= 2000) {
125            $date = $this->_calcNthMondayInMonth(1, 2);
126        } else if ($this->_year >= 1949) {
127            $date = $this->_year . '-01-15';
128        }
129        if (!is_null($date)) {
130            $this->_addHoliday('comingOfAgeDay',
131                               $date,
132                               'Coming of Age Day');
133        }
134    }
135
136    /**
137     * build day of National Foundation Day
138     *
139     * @access   private
140     */
141    function _buildNationalFoundationDay()
142    {
143        if ($this->_year >= 1949) {
144            $this->_addHoliday('nationalFoundationDay',
145                               $this->_year . '-02-11',
146                               'National Foundation Day');
147        }
148    }
149
150    /**
151     * build day of Vernal Equinox Day
152     *
153     * @access   private
154     */
155    function _buildVernalEquinoxDay()
156    {
157        $day = null;
158        if ($this->_year >= 1948 && $this->_year <= 1979) {
159            $day = floor(20.8357 + 0.242194 * ($this->_year - 1980) - floor(($this->_year - 1980) / 4));
160        } else if ($this->_year <= 2099) {
161            $day = floor(20.8431 + 0.242194 * ($this->_year - 1980) - floor(($this->_year - 1980) / 4));
162        } else if ($this->_year <= 2150) {
163            $day = floor(21.8510 + 0.242194 * ($this->_year - 1980) - floor(($this->_year - 1980) / 4));
164        }
165        if (!is_null($day)) {
166            $this->_addHoliday('Vernal Equinox Day',
167                               sprintf('%04d-%02d-%02d', $this->_year, 3, $day),
168                               'Vernal Equinox Day');
169        }
170    }
171
172    /**
173     * build day of Showa Day
174     *
175     * @access   private
176     */
177    function _buildShowaDay()
178    {
179        $name = null;
180        if ($this->_year >= 2007) {
181            $name = 'Showa Day';
182        } else if ($this->_year >= 1989) {
183            $name = 'Greenery Day';
184        } else if ($this->_year >= 1949) {
185            $name = 'Showa Emperor\'s Birthday';
186        }
187        if (!is_null($name)) {
188            $this->_addHoliday('showaDay',
189                               $this->_year . '-04-29',
190                               $name);
191        }
192    }
193
194    /**
195     * build day of Constitution Memorial Day
196     *
197     * @access   private
198     */
199    function _buildConstitutionMemorialDay()
200    {
201        if ($this->_year >= 1949) {
202            $this->_addHoliday('constitutionMemorialDay',
203                               $this->_year . '-05-03',
204                               'Constitution Memorial Day');
205        }
206    }
207
208    /**
209     * build day of Greenery Day
210     *
211     * @access   private
212     */
213    function _buildGreeneryDay()
214    {
215        $name = null;
216        if ($this->_year >= 2007) {
217            $name = 'Greenery Day';
218        } else if ($this->_year >= 1986) {
219            $date =& new Date($this->_year . '-05-04');
220            if ($date->getDayOfWeek() != 0) {
221                $name = 'National Holiday';
222            }
223        }
224        if (!is_null($name)) {
225            $this->_addHoliday('greeneryDay',
226                               $this->_year . '-05-04',
227                               $name);
228        }
229    }
230
231    /**
232     * build day of Children's Day
233     *
234     * @access   private
235     */
236    function _buildChildrensDay()
237    {
238        if ($this->_year >= 1949) {
239            $this->_addHoliday('childrensDay',
240                               $this->_year . '-05-05',
241                               'Children\'s Day');
242        }
243    }
244
245    /**
246     * build day of Marine Day
247     *
248     * @access   private
249     */
250    function _buildMarineDay()
251    {
252        $date = null;
253        if ($this->_year >= 2003) {
254            $date = $this->_calcNthMondayInMonth(7, 3);
255        } else if ($this->_year >= 1996) {
256            $date = $this->_year . '-07-20';
257        }
258        if (!is_null($date)) {
259            $this->_addHoliday('marineDay',
260                               $date,
261                               'Marine Day');
262        }
263    }
264
265    /**
266     * build day of Respect for the Aged Day
267     *
268     * @access   private
269     */
270    function _buildRespectfortheAgedDay()
271    {
272        $date = null;
273        if ($this->_year >= 2003) {
274            $date = $this->_calcNthMondayInMonth(9, 3);
275        } else if ($this->_year >= 1966) {
276            $date = $this->_year . '-09-15';
277        }
278        if (!is_null($date)) {
279            $this->_addHoliday('respectfortheAgedDay',
280                               $date,
281                               'Respect for the Aged Day');
282        }
283    }
284
285    /**
286     * build day of Health and Sports Day
287     *
288     * @access   private
289     */
290    function _buildHealthandSportsDay()
291    {
292        $date = null;
293        if ($this->_year >= 2000) {
294            $date = $this->_calcNthMondayInMonth(10, 2);
295        } else if ($this->_year >= 1966) {
296            $date = $this->_year . '-10-10';
297        }
298        if (!is_null($date)) {
299            $this->_addHoliday('healthandSportsDay',
300                               $date,
301                               'Health and Sports Day');
302        }
303    }
304
305    /**
306     * build day of Autumnal Equinox Day
307     *
308     * @access   private
309     */
310    function _buildAutumnalEquinoxDay()
311    {
312        $day = null;
313        if ($this->_year >= 1948 && $this->_year <= 1979) {
314            $day = floor(23.2588 + 0.242194 * ($this->_year - 1980) - floor(($this->_year - 1980) / 4));
315        } else if ($this->_year <= 2099) {
316            $day = floor(23.2488 + 0.242194 * ($this->_year - 1980) - floor(($this->_year - 1980) / 4));
317        } else if ($this->_year <= 2150) {
318            $day = floor(24.2488 + 0.242194 * ($this->_year - 1980) - floor(($this->_year - 1980) / 4));
319        }
320        if (!is_null($day)) {
321            $this->_addHoliday('autumnalEquinoxDay',
322                               sprintf('%04d-%02d-%02d', $this->_year, 9, $day),
323                               'Autumnal Equinox Day');
324
325            if ($this->_year >= 2003 &&
326                $this->getHolidayDate('autumnalEquinoxDay')->getDayOfWeek() == 3) {
327                $this->_addHoliday('nationalHolidayBeforeAutumnalEquinoxDay',
328                                   $this->getHolidayDate('autumnalEquinoxDay')->getPrevDay(),
329                                   'National Holiday before Autumnal Equinox Day');
330            }
331        }
332    }
333
334    /**
335     * build day of National Culture Day
336     *
337     * @access   private
338     */
339    function _buildNationalCultureDay()
340    {
341        if ($this->_year >= 1948) {
342            $this->_addHoliday('nationalCultureDay',
343                               $this->_year . '-11-03',
344                               'National Culture Day');
345        }
346    }
347
348    /**
349     * build day of Labor Thanksgiving Day
350     *
351     * @access   private
352     */
353    function _buildLaborThanksgivingDay()
354    {
355        if ($this->_year >= 1948) {
356            $this->_addHoliday('laborThanksgivingDay',
357                               $this->_year . '-11-23',
358                               'Labor Thanksgiving Day');
359        }
360    }
361
362    /**
363     * build day of Emperor's Birthday
364     *
365     * @access   private
366     */
367    function _buildEmperorsBirthday()
368    {
369        if ($this->_year >= 1989) {
370            $this->_addHoliday('emperorsBirthday',
371                               $this->_year . '-12-23',
372                               'Emperor\'s Birthday');
373        }
374    }
375
376    /**
377     * build day of Emperor's Birthday
378     *
379     * @access   private
380     */
381    function _buildOtherMemorialDays()
382    {
383        if ($this->_year == 1959) {
384            $this->_addHoliday(
385                'theRiteofWeddingofHIHCrownPrinceAkihito',
386                $this->_year . '-04-10',
387                'The Rite of Wedding of HIH Crown Prince Akihito');
388        }
389        if ($this->_year == 1989) {
390            $this->_addHoliday(
391                'theFuneralCeremonyofEmperorShowa.',
392                $this->_year . '-02-24',
393                'The Funeral Ceremony of Emperor Showa.');
394        }
395        if ($this->_year == 1990) {
396            $this->_addHoliday(
397                'theCeremonyoftheEnthronementofHisMajestytheEmperor(attheSeiden)',
398                $this->_year . '-11-12',
399                'The Ceremony of the Enthronement of His Majesty the Emperor (at the Seiden)');
400        }
401        if ($this->_year == 1993) {
402            $this->_addHoliday(
403                'theRiteofWeddingofHIHCrownPrinceNaruhito',
404                $this->_year . '-06-09',
405                'The Rite of Wedding of HIH Crown Prince Naruhito');
406        }
407    }
408
409    /**
410     * build day of substitute holiday
411     *
412     * @access   private
413     */
414    function _buildSubstituteHolidays()
415    {
416        foreach ($this->_dates as $name => $date) {
417            if ($date->getDayOfWeek() == 0) {
418                if ($this->_year >= 2007) {
419                    while (in_array($date, $this->_dates)) {
420                        $date = $date->getNextDay();
421                    }
422                } else if ($date->getDate() >= '1973-04-12') {
423                    $date = $date->getNextDay();
424                    if (in_array($date, $this->_dates)) {
425                        continue;
426                    }
427                } else {
428                    continue;
429                }
430                if (!is_null($date)) {
431                    $this->_addHoliday(
432                        'substituteHolidayFor' . str_replace(' ', '', $name),
433                        $date,
434                        'Substitute Holiday for ' . $name);
435                }
436            }
437        }
438    }
439
440    /**
441     * Calculate Nth monday in a month
442     *
443     * @param int $month    month
444     * @param int $position position
445     *
446     * @access   private
447     * @return   object Date date
448     */
449    function _calcNthMondayInMonth($month, $position)
450    {
451        if ($position  == 1) {
452            $startday = '01';
453        } elseif ($position == 2) {
454            $startday = '08';
455        } elseif ($position == 3) {
456            $startday = '15';
457        } elseif ($position == 4) {
458            $startday = '22';
459        } elseif ($position == 5) {
460            $startday = '29';
461        }
462        $month = sprintf("%02d", $month);
463
464        $date = new Date($this->_year . '-' . $month . '-' . $startday);
465        while ($date->getDayOfWeek() != 1) {
466            $date = $date->getNextDay();
467        }
468        return $date;
469    }
470}
471?>
Note: See TracBrowser for help on using the browser.