JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
Fix db_get_value after mysql->mysqli upgrade
[wfpl.git] / time.php
1 <?php
2
3 # This program is in the public domain within the United States. Additionally,
4 # we waive copyright and related rights in the work worldwide through the CC0
5 # 1.0 Universal public domain dedication, which can be found at
6 # http://creativecommons.org/publicdomain/zero/1.0/
7
8
9 # This file contains functions to manipulate/calculate dates/times
10
11 # argument in format: YYYY-MM-DD
12 function yyyymmdd_to_days($str) {
13         return ymd_to_days((int)substr($str, 0, 4), (int)substr($str, 5, 2), (int)substr($str, 8, 2));
14 }
15 # args must be integers
16 function ymd_to_days($year, $month, $day) {
17         return (int)(mktime(12,0,0,$month,$day, $year) / 86400);
18 }
19
20 function days_to_ymd($days) {
21         return explode('-', date('Y-n-j', $days * 86400 + 43200));
22 }
23
24 function days_to_weekday_name($days) {
25         $day_names = array('Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday', 'Wednesday');
26         return $day_names[$days % 7];
27 }
28
29
30 #function time_test() {
31 #       for($i = 0; $i < 41 * 86400; $i += 86399) {
32 #               echo "seconds: $i";
33 #               $days = (int)($i / 86400);
34 #               list($year, $month, $day) = days_to_ymd($days);
35 #               echo ", days_to_ymd($days): $year-$month-$day";
36 #               $days = ymd_to_days($year, $month, $day);
37 #               echo ", ymd_to_days($year, $month, $day): $days\n<br>";
38 #       }
39 #}
40
41
42 # pass anything, and get a valid date
43 #
44 # returns array($year, $month, $day)
45 function clean_ymd($year, $month, $day) {
46         $year = intval($year, 10);
47         $month = intval($month, 10);
48         $day = intval($day, 10);
49
50         if($year < 100) {
51                 $year += 2000;
52         }
53         if($month < 1) {
54                 $month = 1;
55         } elseif($month > 12) {
56                 $month = 12;
57         }
58         if($day < 1) {
59                 $day = 1;
60         } else {
61                 $max = date('t', mktime(12, 0, 0, $month, 1, $year));
62                 if($day > $max) {
63                         $day = $max;
64                 }
65         }
66
67         return array($year, $month, $day);
68 }
69
70 # pass date like 3/21/99
71 # returns array(year, month, day)
72 function mdy_clean($date) {
73         $date = preg_replace('|[^0-9/-]|', '', $date);
74         $date = preg_replace('|-|', '/', $date);
75         $parts = explode('/', $date);
76         switch(count($parts)) {
77                 case 1:
78                         $year = $parts[0];
79                         if(strlen($year) == 0) {
80                                 list($month, $day, $year) = explode('/', date('m/d/Y'));
81                         } else {
82                                 list($month, $day) = explode('/', date('m/d'));
83                         }
84                 break;
85                 case 2:
86                         list($month, $year) = $parts;
87                         $year = date('d');
88                 break;
89                 default:
90                         list($month, $day, $year) = $parts;
91         }
92
93         return clean_ymd($year, $month, $day);
94 }
95
96 # convert date string from mm/dd/yyyy to yyyy-mm-dd
97 function mdy_to_ymd($date) {
98         list($year, $month, $day) = mdy_clean($date);
99         return sprintf('%04u-%02u-%02u', $year, $month, $day);
100 }
101
102 # pass date like 2008-11-21
103 # returns array(year, month, day)
104 function ymd_clean($date) {
105         $date = preg_replace('|[^0-9/-]|', '', $date);
106         $date = preg_replace('|/|', '-', $date);
107         $parts = explode('-', $date);
108         switch(count($parts)) {
109                 case 1:
110                         $year = $parts[0];
111                         if(strlen($year) == 0 || $year < 1971 || $year > 2050) {
112                                 list($year, $month, $day) = explode('-', date('Y-m-d'));
113                         } else {
114                                 list($month, $day) = explode('-', date('m-d'));
115                         }
116                 break;
117                 case 2:
118                         list($year, $month) = $parts;
119                         $year = date('d');
120                 break;
121                 default:
122                         list($year, $month, $day) = $parts;
123         }
124
125         return clean_ymd($year, $month, $day);
126 }
127
128 # convert date string from yyyy-mm-dd to mm/dd/yyyy
129 function ymd_to_mdy($str) {
130         list($year, $month, $day) = ymd_clean($str);
131         return sprintf('%02u/%02u/%04u', $month, $day, $year);
132 }