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/
9 # This file contains functions to manipulate/calculate dates/times
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));
15 # args must be integers
16 function ymd_to_days($year, $month, $day) {
17 return (int)(mktime(12,0,0,$month,$day, $year) / 86400);
20 function days_to_ymd($days) {
21 return explode('-', date('Y-n-j', $days * 86400 + 43200));
24 function days_to_weekday_name($days) {
25 $day_names = array('Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday', 'Wednesday');
26 return $day_names[$days % 7];
30 #function time_test() {
31 # for($i = 0; $i < 41 * 86400; $i += 86399) {
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>";
42 # pass anything, and get a valid date
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);
55 } elseif($month > 12) {
61 $max = date('t', mktime(12, 0, 0, $month, 1, $year));
67 return array($year, $month, $day);
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)) {
79 if(strlen($year) == 0) {
80 list($month, $day, $year) = explode('/', date('m/d/Y'));
82 list($month, $day) = explode('/', date('m/d'));
86 list($month, $year) = $parts;
90 list($month, $day, $year) = $parts;
93 return clean_ymd($year, $month, $day);
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);
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)) {
111 if(strlen($year) == 0 || $year < 1971 || $year > 2050) {
112 list($year, $month, $day) = explode('-', date('Y-m-d'));
114 list($month, $day) = explode('-', date('m-d'));
118 list($year, $month) = $parts;
122 list($year, $month, $day) = $parts;
125 return clean_ymd($year, $month, $day);
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);