11<?php
22
33namespace HanifHefaz \Dcter ;
4- use \Carbon \Carbon ;
4+
5+ use Carbon \Carbon ;
56use Exception ;
67
8+
79// With modification from https://github.com/roozbeh360
810// and,
911// https://github.com/rabeeaali
1012
11-
1213class Dcter
1314{
1415 public static $ Day ;
@@ -629,309 +630,3 @@ public static function toCarbonJalali($jalaliDate)
629630 return self ::toCarbonFromJalali ($ jalaliDate );
630631 }
631632}
632-
633- class Dcter
634- {
635- public static $ Day ;
636- public static $ Month ;
637- public static $ Year ;
638-
639- // function to convert Hijri Qamari (Islamic) Year to Gregorian
640- public static function HijriToGregorian ($ date , $ format = "YYYY-MM-DD " )
641- {
642- self ::ConstructDayMonthYear ($ date , $ format );
643- $ d = intval (self ::$ Day );
644- $ m = intval (self ::$ Month );
645- $ y = intval (self ::$ Year );
646-
647- if ($ y < 1700 ) {
648-
649- $ jd = self ::intPart ((11 * $ y + 3 ) / 30 ) + 354 * $ y + 30 * $ m - self ::intPart (($ m - 1 ) / 2 ) + $ d + 1948440 - 385 ;
650-
651- if ($ jd > 2299160 ) {
652- $ l = $ jd + 68569 ;
653- $ n = self ::intPart ((4 * $ l ) / 146097 );
654- $ l = $ l - self ::intPart ((146097 * $ n + 3 ) / 4 );
655- $ i = self ::intPart ((4000 * ($ l + 1 )) / 1461001 );
656- $ l = $ l - self ::intPart ((1461 * $ i ) / 4 ) + 31 ;
657- $ j = self ::intPart ((80 * $ l ) / 2447 );
658- $ d = $ l - self ::intPart ((2447 * $ j ) / 80 );
659- $ l = self ::intPart ($ j / 11 );
660- $ m = $ j + 2 - 12 * $ l ;
661- $ y = 100 * ($ n - 49 ) + $ i + $ l ;
662- } else {
663- $ j = $ jd + 1402 ;
664- $ k = self ::intPart (($ j - 1 ) / 1461 );
665- $ l = $ j - 1461 * $ k ;
666- $ n = self ::intPart (($ l - 1 ) / 365 ) - self ::intPart ($ l / 1461 );
667- $ i = $ l - 365 * $ n + 30 ;
668- $ j = self ::intPart ((80 * $ i ) / 2447 );
669- $ d = $ i - self ::intPart ((2447 * $ j ) / 80 );
670- $ i = self ::intPart ($ j / 11 );
671- $ m = $ j + 2 - 12 * $ i ;
672- $ y = 4 * $ k + $ n + $ i - 4716 ;
673- }
674-
675- if ($ d < 10 )
676- $ d = "0 " . $ d ;
677-
678- if ($ m < 10 )
679- $ m = "0 " . $ m ;
680- return $ y . "- " . $ m . "- " . $ d ;
681- } else
682- return "" ;
683- }
684-
685- public static function intPart ($ floatNum )
686- {
687- if ($ floatNum < -0.0000001 ) {
688- return ceil ($ floatNum - 0.0000001 );
689- }
690- return floor ($ floatNum + 0.0000001 );
691- }
692-
693- // fucntion to construct day, month and year.
694- public static function ConstructDayMonthYear ($ date , $ format )
695- {
696- self ::$ Day = "" ;
697- self ::$ Month = "" ;
698- self ::$ Year = "" ;
699-
700- if ($ date != null ) {
701- $ format = strtoupper ($ format );
702- $ format_Ar = str_split ($ format );
703- $ srcDate_Ar = str_split ($ date );
704- for ($ i = 0 ; $ i < count ($ format_Ar ); $ i ++) {
705- if (isset ($ srcDate_Ar [$ i ])) {
706- switch ($ format_Ar [$ i ]) {
707- case "D " :
708- self ::$ Day .= $ srcDate_Ar [$ i ];
709- break ;
710- case "M " :
711- self ::$ Month .= $ srcDate_Ar [$ i ];
712- break ;
713- case "Y " :
714- self ::$ Year .= $ srcDate_Ar [$ i ];
715- break ;
716- }
717- }
718- }
719- }
720- }
721-
722- // fucntion to convert Gregorian date to Hijri Qamari date.
723- public static function GregorianToHijri ($ date , $ format = "YYYY-MM-DD " )
724- {
725- self ::ConstructDayMonthYear ($ date , $ format );
726- $ d = intval (self ::$ Day );
727- $ m = intval (self ::$ Month );
728- $ y = intval (self ::$ Year );
729-
730- if ($ y > 1700 ) {
731- if (($ y > 1582 ) || (($ y == 1582 ) && ($ m > 10 )) || (($ y == 1582 ) && ($ m == 10 ) && ($ d > 14 ))) {
732- $ jd = self ::intPart ((1461 * ($ y + 4800 + self ::intPart (($ m - 14 ) / 12 ))) / 4 ) + self ::intPart ((367 * ($ m - 2 - 12 * (self ::intPart (($ m - 14 ) / 12 )))) / 12 ) - self ::intPart ((3 * (self ::intPart (($ y + 4900 + self ::intPart (($ m - 14 ) / 12 )) / 100 ))) / 4 ) + $ d - 32075 ;
733- } else {
734- $ jd = 367 * $ y - self ::intPart ((7 * ($ y + 5001 + self ::intPart (($ m - 9 ) / 7 ))) / 4 ) + self ::intPart ((275 * $ m ) / 9 ) + $ d + 1729777 ;
735- }
736-
737- $ l = $ jd - 1948440 + 10632 ;
738- $ n = self ::intPart (($ l - 1 ) / 10631 );
739- $ l = $ l - 10631 * $ n + 354 ;
740- $ j = (self ::intPart ((10985 - $ l ) / 5316 )) * (self ::intPart ((50 * $ l ) / 17719 )) + (self ::intPart ($ l / 5670 )) * (self ::intPart ((43 * $ l ) / 15238 ));
741- $ l = $ l - (self ::intPart ((30 - $ j ) / 15 )) * (self ::intPart ((17719 * $ j ) / 50 )) - (self ::intPart ($ j / 16 )) * (self ::intPart ((15238 * $ j ) / 43 )) + 29 ;
742- $ m = self ::intPart ((24 * $ l ) / 709 );
743- $ d = $ l - self ::intPart ((709 * $ m ) / 24 );
744- $ y = 30 * $ n + $ j - 30 ;
745-
746- if ($ d < 10 )
747- $ d = "0 " . $ d ;
748-
749- if ($ m < 10 )
750- $ m = "0 " . $ m ;
751- return $ y . "- " . $ m . "- " . $ d ;
752- } else
753- return "" ;
754- }
755-
756- // Convert Julian day to Hijri Qamari date
757- public static function JulianToHijri ($ jd )
758- {
759- $ jd = $ jd - 1948440 + 10632 ;
760- $ n = (int )(($ jd - 1 ) / 10631 );
761- $ jd = $ jd - 10631 * $ n + 354 ;
762- $ j = ((int )((10985 - $ jd ) / 5316 )) *
763- ((int )(50 * $ jd / 17719 )) +
764- ((int )($ jd / 5670 )) *
765- ((int )(43 * $ jd / 15238 ));
766- $ jd = $ jd - ((int )((30 - $ j ) / 15 )) *
767- ((int )((17719 * $ j ) / 50 )) -
768- ((int )($ j / 16 )) *
769- ((int )((15238 * $ j ) / 43 )) + 29 ;
770- $ m = (int )(24 * $ jd / 709 );
771- $ d = $ jd - (int )(709 * $ m / 24 );
772- $ y = 30 *$ n + $ j - 30 ;
773-
774- return $ y . "- " . $ m . "- " . $ d ;
775- }
776-
777- // function to convert Hijri Qamari date to Julian.
778- public static function HijriToJulian ($ date ){
779- $ array = explode ('- ' , $ date );
780-
781- $ y = $ array [0 ];
782- $ m = $ array [1 ];
783- $ d = $ array [2 ];
784- return (int )((11 * $ y + 3 ) / 30 ) + 354 * $ y +
785- 30 * $ m - (int )(($ m - 1 ) / 2 ) + $ d + 1948440 - 385 ;
786- }
787-
788- static function Division ($ a ,$ b )
789- {
790- return (int ) ($ a / $ b );
791- }
792-
793- // fucntion to convert Gregorian Date to Jalali Date.
794- public static function GregorianToJalali ($ date , $ format = "YYYY-MM-DD " )
795- {
796- self ::ConstructDayMonthYear ($ date , $ format );
797- $ g_d = intval (self ::$ Day );
798- $ g_m = intval (self ::$ Month );
799- $ g_y = intval (self ::$ Year );
800-
801- $ g_days_in_month = array (31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 );
802- $ j_days_in_month = array (31 , 31 , 31 , 31 , 31 , 31 , 30 , 30 , 30 , 30 , 30 , 29 );
803-
804-
805- $ gy = $ g_y -1600 ;
806- $ gm = $ g_m -1 ;
807- $ gd = $ g_d -1 ;
808-
809- $ g_day_no = 365 *$ gy +self ::Division ($ gy +3 ,4 )-self ::Division ($ gy +99 ,100 )+self ::Division ($ gy +399 ,400 );
810-
811- for ($ i =0 ; $ i < $ gm ; ++$ i )
812- $ g_day_no += $ g_days_in_month [$ i ];
813- if ($ gm >1 && (($ gy %4 ==0 && $ gy %100 !=0 ) || ($ gy %400 ==0 )))
814- /* leap and after Feb */
815- $ g_day_no ++;
816- $ g_day_no += $ gd ;
817-
818- $ j_day_no = $ g_day_no -79 ;
819-
820- $ j_np = self ::Division ($ j_day_no , 12053 ); /* 12053 = 365*33 + 32/4 */
821- $ j_day_no = $ j_day_no % 12053 ;
822-
823- $ jy = 979 +33 *$ j_np +4 *self ::Division ($ j_day_no ,1461 ); /* 1461 = 365*4 + 4/4 */
824-
825- $ j_day_no %= 1461 ;
826-
827- if ($ j_day_no >= 366 ) {
828- $ jy += self ::Division ($ j_day_no -1 , 365 );
829- $ j_day_no = ($ j_day_no -1 )%365 ;
830- }
831-
832- for ($ i = 0 ; $ i < 11 && $ j_day_no >= $ j_days_in_month [$ i ]; ++$ i )
833- $ j_day_no -= $ j_days_in_month [$ i ];
834- $ jm = $ i +1 ;
835- if ($ jm <10 )
836- $ jm = "0 " . $ jm ;
837-
838- $ jd = $ j_day_no +1 ;
839- if ($ jd <10 )
840- $ jd = "0 " . $ jd ;
841- return $ jy . "- " . $ jm . "- " . $ jd ;
842- }
843-
844- // function to convert Jalali date to Gregorian date.
845- public static function JalaliToGregorian ($ date , $ format ="YYYY-MM-DD " )
846- {
847- self ::ConstructDayMonthYear ($ date , $ format );
848- $ j_d = intval (self ::$ Day );
849- $ j_m = intval (self ::$ Month );
850- $ j_y = intval (self ::$ Year );
851-
852-
853- $ g_days_in_month = array (31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 );
854- $ j_days_in_month = array (31 , 31 , 31 , 31 , 31 , 31 , 30 , 30 , 30 , 30 , 30 , 29 );
855-
856-
857- $ jy = (int )($ j_y )-979 ;
858- $ jm = (int )($ j_m )-1 ;
859- $ jd = (int )($ j_d )-1 ;
860-
861- $ j_day_no = 365 *$ jy + self ::Division ($ jy , 33 )*8 + self ::Division ($ jy %33 +3 , 4 );
862-
863- for ($ i =0 ; $ i < $ jm ; ++$ i )
864- $ j_day_no += $ j_days_in_month [$ i ];
865-
866- $ j_day_no += $ jd ;
867-
868- $ g_day_no = $ j_day_no +79 ;
869-
870- $ gy = 1600 + 400 *self ::Division ($ g_day_no , 146097 ); /* 146097 = 365*400 + 400/4 - 400/100 + 400/400 */
871- $ g_day_no = $ g_day_no % 146097 ;
872-
873- $ leap = true ;
874- if ($ g_day_no >= 36525 ) /* 36525 = 365*100 + 100/4 */
875- {
876- $ g_day_no --;
877- $ gy += 100 *self ::Division ($ g_day_no , 36524 ); /* 36524 = 365*100 + 100/4 - 100/100 */
878- $ g_day_no = $ g_day_no % 36524 ;
879-
880- if ($ g_day_no >= 365 )
881- $ g_day_no ++;
882- else
883- $ leap = false ;
884- }
885-
886- $ gy += 4 *self ::Division ($ g_day_no , 1461 ); /* 1461 = 365*4 + 4/4 */
887- $ g_day_no %= 1461 ;
888-
889- if ($ g_day_no >= 366 ) {
890- $ leap = false ;
891-
892- $ g_day_no --;
893- $ gy += self ::Division ($ g_day_no , 365 );
894- $ g_day_no = $ g_day_no % 365 ;
895- }
896-
897- for ($ i = 0 ; $ g_day_no >= $ g_days_in_month [$ i ] + ($ i == 1 && $ leap ); $ i ++)
898- $ g_day_no -= $ g_days_in_month [$ i ] + ($ i == 1 && $ leap );
899- $ gm = $ i +1 ;
900-
901- if ($ gm <10 )
902- $ gm = "0 " . $ gm ;
903-
904-
905- $ gd = $ g_day_no +1 ;
906- if ($ gd <10 )
907- $ gd = "0 " . $ gd ;
908-
909- return $ gy . "- " . $ gm . "- " . $ gd ;
910- }
911-
912- // Make carbon date object from any converted date.
913-
914- public static function Carbonize ($ date )
915- {
916- return Carbon::parse ($ date );
917- }
918-
919- // Function to convert Hijri to Jalali date.
920-
921- public static function HijriToJalali ($ date , $ format = "YYYY-MM-DD " )
922- {
923- $ gregorianDate = self ::HijriToGregorian ($ date );
924- $ jalali = self ::GregorianToJalali ($ gregorianDate );
925- return $ jalali ;
926- }
927-
928- // Function to convert Jalali to Hijri date.
929-
930- public static function JalaliToHijri ($ date , $ format = "YYYY-MM-DD " )
931- {
932- $ gregorianDate = self ::JalaliToGregorian ($ date );
933- $ hijri = self ::GregorianToHijri ($ gregorianDate );
934-
935- return $ hijri ;
936- }
937- }
0 commit comments