Converter::isAprilButBefore14th()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 3
eloc 2
nc 3
nop 4
1
<?php
2
3
/*
4
 * This file is part of the EasyBanglaDate package.
5
 *
6
 * Copyright (c) 2015 Roni Saha
7
 *
8
 * This source file is subject to the MIT license that is bundled
9
 * with this source code in the file LICENSE.
10
 */
11
12
namespace EasyBanglaDate\Tools;
13
14
class Converter
15
{
16
    public static function getEnglishTimeFromBanglaDate(\DateTime $time, $bnDateArray, $morning )
17
    {
18
        self::adjustYearAndMonth($time, $bnDateArray, $morning);
19
20
        $currentBnDate = self::getBengaliDateMonthYear($time, $morning);
21
22
        $diff = self::getDiffInDays($currentBnDate, $bnDateArray);
23
24
        if($diff == 0) {
25
            return $time;
26
        }
27
28
        $time->modify(sprintf('%+d day', $diff));
29
30
        return self::getEnglishTimeFromBanglaDate($time, $bnDateArray, $morning);
31
32
    }
33
34
    private static function getArrayValueDifference($lhs, $rhs)
35
    {
36
        $ret = array();
37
38
        foreach (array('year', 'month', 'day') as $key) {
39
            $ret[$key] = $rhs[$key] - $lhs[$key];
40
        }
41
42
        return $ret;
43
    }
44
45
    /**
46
     * @param \DateTime $time
47
     * @param int $morning
48
     * @return array
49
     */
50
    public static function getBengaliDateMonthYear(\DateTime $time, $morning)
51
    {
52
53
        $enMonth = $time->format('n');
54
        $day = (int)$time->format('j');
55
        $hour = (int)$time->format('G');
56
57
        list($bnDate, $bnMonth) = BanglaCalender::getBengaliDateAndMonth($enMonth, $day, $hour, $morning, $time->format('L'));
58
59
        return array(
60
            'year'  => self::getBengaliYear($enMonth, $day, $hour, $morning, (int)$time->format('Y')),
61
            'month' => $bnMonth,
62
            'day'  => $bnDate,
63
        );
64
    }
65
66
67
    /**
68
     * @param $enMonth
69
     * @param $day
70
     * @param $hour
71
     * @param $morning
72
     * @param $engYear
73
     * @return int
74
     */
75
    private static function getBengaliYear($enMonth, $day, $hour, $morning, $engYear)
76
    {
77
        if (self::isBeforeNewYear($enMonth, $day, $hour, $morning)) {
78
            return $engYear - 594;
79
        }
80
81
        return $engYear - 593;
82
    }
83
84
    /**
85
     * @param $enMonth
86
     * @param $day
87
     * @param $hour
88
     * @param $morning
89
     * @return bool
90
     */
91
    private static function isBeforeNewYear($enMonth, $day, $hour, $morning)
92
    {
93
        return $enMonth < 4 || self::isAprilButBefore14th($enMonth, $day, $hour, $morning);
94
    }
95
96
    /**
97
     * @param \DateTime $time
98
     * @param $bnDateArray
99
     * @param $morning
100
     */
101
    protected static function adjustYearAndMonth(\DateTime $time, $bnDateArray, $morning)
102
    {
103
        $diffArray = self::getArrayValueDifference(
104
            self::getBengaliDateMonthYear($time, $morning),
105
            $bnDateArray
106
        );
107
108
        $time->modify(sprintf('%+d year %+d month', $diffArray['year'], $diffArray['month']));
109
    }
110
111
    private static function getDiffInDays($lhs , $rhs)
112
    {
113
        return self::getDaysFromDateArray($rhs) - self::getDaysFromDateArray($lhs);
114
    }
115
116
    private static function getDaysFromDateArray($arr)
117
    {
118
        $days = $arr['year'] * 365.25;
119
120
        if ($arr['month'] < 6) {
121
            $days += ($arr['month'] * 31);
122
        } else {
123
            $days += (5 * 31) + (($arr['month'] - 5) * 30);
124
        }
125
126
        return $days + $arr['day'];
127
    }
128
129
    /**
130
     * @param $enMonth
131
     * @param $day
132
     * @param $hour
133
     * @param $morning
134
     * @return bool
135
     */
136
    private static function isAprilButBefore14th($enMonth, $day, $hour, $morning)
137
    {
138
        return ($enMonth == 4 && ($day < 14 || self::isBeforeMorningOf14thApril($day, $hour, $morning)));
139
    }
140
141
    /**
142
     * @param $day
143
     * @param $hour
144
     * @param $morning
145
     * @return bool
146
     */
147
    private static function isBeforeMorningOf14thApril($day, $hour, $morning)
148
    {
149
        return ($day == 14 && $hour < $morning);
150
    }
151
152
}