// Date.cms 2011.10.02-03 by あすかぜ // 日付処理のライブラリです。 // 編集・再配布は自由です。 // // * format(y, m, d) "yyyy/MM/dd" 形式の文字列を返す // * getYear(str) 日付文字列をパースして、年を返す // * getMonth(str) 日付文字列をパースして、月を返す // * getDay(str) 日付文字列をパースして、日を返す // * addYear(str, y) 日付文字列に y 年加える // * addMonth(str, m) 日付文字列に m 月加える // * addDay(str, d) 日付文字列に d 日加える // * cmp(str1, str2) 日付文字列の大小関係を比較する。str1 が前であれば負、後であれば正、等しければ 0。 // * getDayOfWeek(str) 日付文字列の曜日を返す。日曜は 0、土曜は 6、月〜金は 1〜5。 // "yyyy/MM/dd" 形式の文字列を返す function format(y, m, d){ if(m < 10){ m = "0" + m; } if(d < 10){ d = "0" + d; } return y + "/" + m + "/" + d; } // 日付文字列をパースして、年を返す function getYear(str){ p = pos(str, "/"); if(p > 0){ year = int(left(str, p - 1)); p = pos(mid(str, p + 1), "/"); if(p == 0){ year = ::GetYear(); }else if(year < 100){ year = year + 2000; } return year; }else{ return ::GetYear(); } } // 日付文字列をパースして、月を返す function getMonth(str){ p = pos(str, "/"); if(p > 0){ year = left(str, p - 1); str = mid(str, p + 1); p = pos(str, "/"); if(p > 0){ month = int(left(str, p - 1)); }else{ month = int(year); } return month; }else{ return ::GetMonth(); } } // 日付文字列をパースして、日を返す function getDay(str){ p = pos(str, "/"); if(p > 0){ str = mid(str, p + 1); p = pos(str, "/"); if(p > 0){ day = int(mid(str, p + 1)); }else{ day = int(str); } return day; }else{ return int(str); } } // うるう年の判定 function isLeapYear(y){ if(y % 4){ return false; }else if(y % 100){ return true; }else if(y % 400){ return false; }else{ return true; } } function getDayMax(year, month){ if(month == 4){ return 30; } else if(month == 6){ return 30; } else if(month == 9){ return 30; } else if(month == 11){ return 30; } else if(month == 2){ if(isLeapYear(year)){ return 29; }else{ return 28; } } return 31; } // 日付文字列に y 年加える function addYear(str, y){ year = getYear(str) + int(y); month = getMonth(str); day = getDay(str); daymax = getDayMax(year, month); if(day > daymax){ day = day - daymax; month = month + 1; if(month > 12){ month = month - 12; year = year + 1; } } return format(year, month, day); } // 日付文字列に m 月加える function addMonth(str, m){ year = getYear(str); month = getMonth(str) + int(m); day = getDay(str); while(month > 12){ month = month - 12; year = year + 1; } while(month < 1){ month = month + 12; year = year - 1; } daymax = getDayMax(year, month); if(day > daymax){ day = day - daymax; month = month + 1; if(month > 12){ month = month - 12; year = year + 1; } } return format(year, month, day); } // 日付文字列に d 日加える function addDay(str, d){ year = getYear(str); month = getMonth(str); day = getDay(str) + int(d); daymax = getDayMax(year, month); while(day > daymax){ day = day - daymax; month = month + 1; if(month > 12){ month = month - 12; year = year + 1; } daymax = getDayMax(year, month); } while(day < 1){ month = month - 1; if(month < 1){ month = month + 12; year = year - 1; } day = day + getDayMax(year, month); } return format(year, month, day); } // 日付文字列の大小関係を比較する。 // str1 が前であれば負、後であれば正、等しければ 0。 function cmp(str1, str2){ year1 = getYear(str1); year2 = getYear(str2); if(year1 != year2){ return year1 - year2; } month1 = getMonth(str1); month2 = getMonth(str2); if(month1 != month2){ return month1 - month2; } return getDay(str1) - getDay(str2); } // 割り算して整数に丸める function div(x,y){ return int(x/y); } // ツェラーの公式 function zeller(y, m, d){ if(m < 3){ y--; m = m + 12; } // Wikipediaに掲載されていたコードを利用 return (div(5 * y, 4) - div(y, 100) + div(y, 400) + div((26 * m + 16), 10) + d) % 7; } // 日付文字列の曜日を返す。日曜は 0、土曜は 6、月〜金は 1〜5。 function getDayOfWeek(str){ return zeller(getYear(str), getMonth(str), getDay(str)); } // 以下テストコード function assertEquals(a, b, m, e){ if(a != b){ return e + m + " failed:\n" + a + "\n" + b + "\n"; } return e; } function assertTrue(a, m, e){ return assertEquals(true, a, m, e); } function test(){ e = ""; e = assertEquals("2012/03/04", format(2012, 3, 4), "format", e); e = assertEquals(2012, getYear("2012/03/04") + 0, "getYear", e); e = assertEquals(2012, getYear("12/03/04") + 0, "getYear", e); e = assertEquals(::GetYear(), getYear("03/04") + 0, "getYear", e); e = assertEquals(::GetYear(), getYear("04") + 0, "getYear", e); e = assertEquals(3, getMonth("2012/03/04") + 0, "getMonth", e); e = assertEquals(3, getMonth("03/04") + 0, "getMonth", e); e = assertEquals(::GetMonth(), getMonth("04") + 0, "getMonth", e); e = assertEquals(4, getDay("2012/03/04") + 0, "getDay", e); e = assertEquals(4, getDay("03/04") + 0, "getDay", e); e = assertEquals(4, getDay("04") + 0, "getDay", e); e = assertEquals("2013/03/04", addYear("2012/03/04", "1"), "addYear", e); e = assertEquals("2135/03/04", addYear("2012/03/04", 123), "addYear", e); e = assertEquals("1889/03/04", addYear("2012/03/04", -123), "addYear", e); e = assertEquals("2013/03/01", addYear("2012/02/29", 1), "addYear", e); e = assertEquals("2012/04/04", addMonth("2012/03/04", "1"), "addMonth", e); e = assertEquals("2014/02/04", addMonth("2012/03/04", 23), "addMonth", e); e = assertEquals("2010/04/04", addMonth("2012/03/04", -23), "addMonth", e); e = assertEquals("2012/03/02", addMonth("2012/01/31", 1), "addMonth", e); e = assertEquals("2012/03/05", addDay("2012/03/04", "1"), "addDay", e); e = assertEquals("2012/04/04", addDay("2012/03/04", 31), "addDay", e); e = assertEquals("2012/05/05", addDay("2012/03/04", 62), "addDay", e); e = assertEquals("2012/02/04", addDay("2012/03/04", -29), "addDay", e); e = assertEquals("2013/02/04", addDay("2013/03/04", -28), "addDay", e); e = assertEquals("2011/12/31", addDay("2012/03/04", -64), "addDay", e); e = assertTrue(cmp("2012/03/04", "2012/03/04") == 0, "cmp", e); e = assertTrue(cmp("2012/03/04", "2013/03/04") < 0, "cmp", e); e = assertTrue(cmp("2012/03/04", "2011/03/04") > 0, "cmp", e); e = assertTrue(cmp("2012/03/04", "2012/04/04") < 0, "cmp", e); e = assertTrue(cmp("2012/03/04", "2012/02/04") > 0, "cmp", e); e = assertTrue(cmp("2012/03/04", "2012/03/05") < 0, "cmp", e); e = assertTrue(cmp("2012/03/04", "2012/03/03") > 0, "cmp", e); e = assertEquals(6, getDayOfWeek("2012/03/03"), "getDayOfWeek", e); e = assertEquals(0, getDayOfWeek("2012/03/04"), "getDayOfWeek", e); e = assertEquals(1, getDayOfWeek("2012/03/05"), "getDayOfWeek", e); if(e == ""){ MessageBox("SUCCESS"); }else{ MessageBox("FAILED\n" + e); } } test();