但檢核沒什麼判斷
※日期加減(使用API)
window.onload = function(){
mingoDateStringAddSubstract('105/10/30', '/', 'm', -2);
mingoDateStringAddSubstract('1051030', '', 'm', -2);
}
/*
mingoDateString:民國年月日字串
split:要分割的符號,可以為空
ymd:要針對年、月、日作用
number:加減年、月、日數
*/
function mingoDateStringAddSubstract(mingoDateString, split, ymd, number){
if(mingoDateString.length != 7 && mingoDateString.length != 9){
return 'yyymmdd or yyy?mm?dd';
}
var year, month, date;
split = split.trim();
if(split != ''){
var dateArray = mingoDateString.split(split);
year = dateArray[0];
month = dateArray[1];
date = dateArray[2];
} else {
year = mingoDateString.substring(0, 3);
month = mingoDateString.substring(3, 5);
date = mingoDateString.substring(5);
}
// 月-1是因為月是從0開始
var d = new Date(Number(year) + 1911, Number(month) - 1, date);
console.log('before=' + d.toDateString());
if('y' == ymd.toLowerCase()){
d.setYear(d.getFullYear() + number);
} else if('m' == ymd.toLowerCase()){
d.setMonth(d.getMonth() + number);
} else if('d' == ymd.toLowerCase()){
d.setDate(d.getDate() + number);
}
console.log('after=' + d.toDateString());
// 轉民國年,月+1是因為月是從0開始
var rtnYear = Number(d.getFullYear()) - 1911;
var rtnMonth = Number(d.getMonth()) + 1;
var rtnDate = d.getDate();
if(year.length == 2){
year = '0' + year;
} else if(year.length == 1){
year = '00' + year;
}
rtnMonth = rtnMonth < 10 ? '0' + rtnMonth : rtnMonth;
rtnDate = rtnDate < 10 ? '0' + rtnDate : rtnDate;
console.log(rtnYear + split + rtnMonth + split + rtnDate);
console.log('==========');
}
※
※日期加減(不用API)
window.onload = function(){
console.log(mingoDateCalc('105/10/30', '/', 'm', -2));
console.log(mingoDateCalc('1051030', '', 'm', -2));
}
// 是否閏年
function isLeapYear(year){
/* 網路上找到的閏年判斷邏輯
4的倍數-->非100的倍數-->閏
--> 100的倍數-->非400的倍數-->非閏
--> 400的倍數-->閏
y/4 == 0 && y/100 != 0
y/4 == 0 && y/100 == 0 && y/400 == 0
*/
/*
if(
(year % 4 == 0 && year % 100 != 0) ||
(year % 4 == 0 && year % 100 == 0 && year % 400 == 0)
){
return true;
} else {
return false;
}
*/
// 簡化後
if(year % 4 == 0){
if(year % 100 != 0){
return true;
} else {
return year % 400 == 0 ? true : false;
}
} else {
return false;
}
}
// 回傳當月天數
function judgeDateOfMonth(year, month){
switch(month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31
break;
case 4:
case 6:
case 9:
case 11:
return 30
break;
default:
if(isLeapYear(Number(year) + 1911)){
return 29;
} else {
return 28;
}
}
}
function mingoDateCalc(mingoDateString, split, ymd, number){
if(mingoDateString.length != 7 && mingoDateString.length != 9){
return 'yyymmdd or yyy?mm?dd';
}
var year, month, date;
split = split.trim();
if(split != ''){
var dateArray = mingoDateString.split(split);
year = Number(dateArray[0]);
month = Number(dateArray[1]);
date = Number(dateArray[2]);
} else {
year = Number(mingoDateString.substring(0, 3));
month = Number(mingoDateString.substring(3, 5));
date = Number(mingoDateString.substring(5));
}
if(ymd == 'y'){
year = year + number;
if(month == 2 && date == 29){
// 非潤年,加1或減1看需求而定(API是加1)
if(number > 0 && !isLeapYear(Number(year) + 1911)){
// 減1
//date = date - 1;
// 加1
month = 3;
date = 1;
}
}
} else if(ymd == 'm'){
if(number > 0) {
year = year + Math.floor(number / 12);
month = month + (number % 12);
if(month > 12){
year = year + 1;
month = month - 12;
}
} else {
number = Math.abs(number);
year = year - Math.floor(number / 12);
month = month - (number % 12);
if(month <= 0){
year = year - 1;
month = month + 12;
}
}
} else if(ymd == 'd'){
if(number > 0) {
date = date + number;
var ymdArray = calcPlusDate(year, month, date);
year = ymdArray[0];
month = ymdArray[1];
date = ymdArray[2];
} else {
date = date + number;
// 一開始要判斷上個月的天數,所以先扣一個月
month = month - 1;
if(month == 0){
year = year - 1;
month = 12;
}
var ymdArray = calcMinusDate(year, month, date);
year = ymdArray[0];
month = ymdArray[1];
date = ymdArray[2];
}
}
if(year.length == 2){
year = '0' + year;
} else if(year.length == 1){
year = '00' + year;
}
month = month < 10 ? '0' + month : month;
date = date < 10 ? '0' + date : date;
return year + split + month + split + date;
}
// 計算天數為正
function calcPlusDate(y, m, d){
var day = judgeDateOfMonth(y, m);
if(d > day){
d = d - day;
m = m + 1;
if(m == 13){
y = y + 1;
m = 1;
}
return calcPlusDate(y, m, d);
}
return new Array(y, m, d);
}
// 計算天數為負
function calcMinusDate(y, m, d){
var day = judgeDateOfMonth(y, m);
if(d < 0){
d = d + day;
m = m - 1;
if(m == 0){
y = y - 1;
m = 12;
}
return calcMinusDate(y, m, d);
}
// 一開始先扣了一個月,這裡要加回來
m = m + 1;
if(m == 13){
y = y + 1;
m = 1;
}
return new Array(y, m, d);
}
※雖然沒有測很仔細,但應該和API一樣
※檢核可用正則表達式加強一下
※星期
※API有getDay()可取得星期,自己寫的話就要設定一個寫死的日期是星期幾,然後根據這一個來判斷,如下:window.onload = function(){
var y = 2011; var m = 11; var d = 30;
// 兩個日期相差的天數,使用new Date API
var d1 = new Date(2012, 1 - 1, 1);//月減1是因為API是從0開始
var d2 = new Date(y, m - 1, d);
var oneDay = 60 * 60 * 24;
console.log('用API算相差的天數=' + Math.abs((d1-d2) / (oneDay * 1000)));
apiWeek(y, m, d);
noApiWeek(y, m, d);
}
function apiWeek(year, month, date) {
// 使用API
// 月-1是因為月是從0開始
var d = new Date(year, month - 1, date);
console.log('用API算出的日期=' + d.getDay());// 0為星期日
}
function noApiWeek(year, month, date) {
// 不使用API
// 2012/1/1 星期日
// 2010 12 13 星期一
var baseYear = 2012;
var baseMonth = 1;
var totalDay = 0;
//月日一定>=1,所以不用判斷
if(year >= baseYear){
totalDay = date;
while(true){
if(baseMonth > 12){
baseYear = baseYear + 1;
baseMonth = baseMonth - 12;
}
if(baseYear == year && baseMonth == month){
break;
}
totalDay = totalDay + judgeDateOfMonth(baseYear, baseMonth);
baseMonth = baseMonth + 1;
}
totalDay = Math.abs(totalDay - 1);
console.log('不用API算相差的天數=' + totalDay);
getPositiveWeek(totalDay % 7);
} else {
// 判斷上個月的日期
baseMonth = 12;
baseYear = 2011;
var lastMonthDay = judgeDateOfMonth(baseYear, baseMonth);
totalDay = Math.abs(lastMonthDay - date + 1);
while(true){
if(baseYear == year && baseMonth == month){
break;
}
baseMonth = baseMonth - 1;
if(baseMonth == 0){
baseYear = baseYear - 1;
baseMonth = 12;
}
totalDay = totalDay + judgeDateOfMonth(baseYear, baseMonth);
}
console.log('不用API算相差的天數=' + totalDay);
getNegativeWeek(totalDay % 7);
}
}
// 是否閏年
function isLeapYear(year){
if(year % 4 == 0){
if(year % 100 != 0){
return true;
} else {
return year % 400 == 0 ? true : false;
}
} else {
return false;
}
}
function getPositiveWeek(weekNumber){
var display = '不用API算出的日期=星期';
switch(weekNumber) {
case 0:
console.log(display + '日');
break;
case 1:
console.log(display + '一');
break;
case 2:
console.log(display + '二');
break;
case 3:
console.log(display + '三');
break;
case 4:
console.log(display + '四');
break;
case 5:
console.log(display + '五');
break;
case 6:
console.log(display + '六');
break;
}
}
function getNegativeWeek(weekNumber){
var display = '不用API算出的日期=星期';
switch(weekNumber) {
case 0:
console.log(display + '日');
break;
case 1:
console.log(display + '六');
break;
case 2:
console.log(display + '五');
break;
case 3:
console.log(display + '四');
break;
case 4:
console.log(display + '三');
break;
case 5:
console.log(display + '二');
break;
case 6:
console.log(display + '一');
break;
}
}
// 回傳當月天數
function judgeDateOfMonth(year, month){
switch(month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31
break;
case 4:
case 6:
case 9:
case 11:
return 30
break;
default:
if(isLeapYear(year)){
return 29;
} else {
return 28;
}
}
}
※已2012/1/1為基準,我故意選星期天為0的,因為這樣比這個日期大的日期,結果會和API一樣
※回傳當月天數和日期加減的程式碼稍有不同,因為不用民國年了,所以將+1911拿掉了
沒有留言:
張貼留言