// bbs358_20160603.cms by あすかぜ // 日付処理のライブラリです。 // 編集・再配布は自由です。 // // * format(y, m, d) "yyyyMMdd" 形式の文字列を返す // * 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。 // "yyyyMMdd" 形式の文字列を返す function format(y, m, d){ if(m < 10){ m = "0" + m; } if(d < 10){ d = "0" + d; } return str(y) + str(m) + str(d); } // 日付文字列をパースして、年を返す function getYear(str){ return int(left(str, 4)); } // 日付文字列をパースして、月を返す function getMonth(str){ return int(mid(str, 5, 2)); } // 日付文字列をパースして、日を返す function getDay(str){ return int(right(str, 2)); } // うるう年の判定 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("20120304", format(2012, 3, 4), "format", e); e = assertEquals(2012, getYear("20120304") + 0, "getYear", e); e = assertEquals(3, getMonth("20120304") + 0, "getMonth", e); e = assertEquals(4, getDay("20120304") + 0, "getDay", e); e = assertEquals("20130304", addYear("20120304", "1"), "addYear", e); e = assertEquals("21350304", addYear("20120304", 123), "addYear", e); e = assertEquals("18890304", addYear("20120304", -123), "addYear", e); e = assertEquals("20130301", addYear("20120229", 1), "addYear", e); e = assertEquals("20120404", addMonth("20120304", "1"), "addMonth", e); e = assertEquals("20140204", addMonth("20120304", 23), "addMonth", e); e = assertEquals("20100404", addMonth("20120304", -23), "addMonth", e); e = assertEquals("20120302", addMonth("20120131", 1), "addMonth", e); e = assertEquals("20120305", addDay("20120304", "1"), "addDay", e); e = assertEquals("20120404", addDay("20120304", 31), "addDay", e); e = assertEquals("20120505", addDay("20120304", 62), "addDay", e); e = assertEquals("20120204", addDay("20120304", -29), "addDay", e); e = assertEquals("20130204", addDay("20130304", -28), "addDay", e); e = assertEquals("20111231", addDay("20120304", -64), "addDay", e); e = assertTrue(cmp("20120304", "20120304") == 0, "cmp", e); e = assertTrue(cmp("20120304", "20130304") < 0, "cmp", e); e = assertTrue(cmp("20120304", "20110304") > 0, "cmp", e); e = assertTrue(cmp("20120304", "20120404") < 0, "cmp", e); e = assertTrue(cmp("20120304", "20120204") > 0, "cmp", e); e = assertTrue(cmp("20120304", "20120305") < 0, "cmp", e); e = assertTrue(cmp("20120304", "20120303") > 0, "cmp", e); e = assertEquals(6, getDayOfWeek("20120303"), "getDayOfWeek", e); e = assertEquals(0, getDayOfWeek("20120304"), "getDayOfWeek", e); e = assertEquals(1, getDayOfWeek("20120305"), "getDayOfWeek", e); if(e == ""){ MessageBox("SUCCESS"); }else{ MessageBox("FAILED\n" + e); } } test();