JavaScript封裝獲取自然周、自然月、自然日、開始結束時間戳
/**
* 獲取自然月開始結束時間
* @param {*} year
* @param {*} month
*/
function getMonthBeginEnd(year, month) {
if (~~year === 0 || ~~month === 0) {
throw new Error('年月參數錯誤');
}
const result = {begin: 0, end: 0};
const target = new Date();
target.setFullYear(year);
target.setMonth(month - 1);
target.setDate(1);
target.setHours(0);
target.setMinutes(0);
target.setSeconds(0);
target.setMilliseconds(0);
result.begin = target.getTime();
const now = new Date();
if (target.getFullYear() + target.getMonth() >= now.getFullYear() + now.getMonth()) {
result.end = now.getTime();
console.log(result);
console.log(new Date(result.begin), new Date(result.end));
return result;
}
target.setMonth(month);//當月的下個月1日 0時0分0秒
target.setSeconds(-1);//前1秒,即昨天最后1秒鍾,也就是上個月的最后一秒鍾
result.end = target.getTime();
console.log(result);
console.log(new Date(result.begin), new Date(result.end));
return result;
}
/**
* 獲取自然日開始結束時間
* @param {*} year
* @param {*} month
* @param {*} date
*/
function getDateBeginEnd(year, month, date) {
if (~~year === 0 || ~~month === 0 || ~~date === 0) {
throw new Error('年月日參數錯誤');
}
const result = {begin: 0, end: 0};
const target = new Date();
target.setFullYear(year);
target.setMonth(month - 1);
target.setDate(date);
target.setHours(0);
target.setMinutes(0);
target.setSeconds(0);
target.setMilliseconds(0);
result.begin = target.getTime();
const targetDateCount = target.getFullYear() + target.getMonth() + target.getDate();
const now = new Date();
const nowDateCount = now.getFullYear() + now.getMonth() + now.getDate();
if (targetDateCount >= nowDateCount) {
result.end = now.getTime();
console.log(0, result);
console.log(new Date(result.begin), new Date(result.end));
return result;
}
target.setDate(target.getDate() + 1);//次日0時0分0秒
target.setSeconds(-1);//前1秒,即當日最后1秒鍾
result.end = target.getTime();
console.log(1, result);
console.log(new Date(result.begin), new Date(result.end));
return result;
}
/**
* 獲取自然周開始結束時間
* @param {*} year
* @param {*} month
* @param {*} number 第幾周
*/
function getWeekByMonth(year, month, number) {
const weekCount = getWeekCountInMonth(year, month);
const result = {begin: 0, end: 0, list: weekCount};
const target = new Date();
target.setFullYear(year);
target.setMonth(month - 1);
target.setDate(1);
target.setHours(0);
target.setMinutes(0);
target.setSeconds(0);
target.setMilliseconds(0);
let targetDay = target.getDay();
targetDay = targetDay === 0 ? 7 : targetDay;
if (number === weekCount[0]) {
console.log(month + '月第' + number + '周起始', target);
result.begin = target.getTime();
target.setDate(target.getDate() + (7 - targetDay));//設置到周日最后一秒
target.setHours(23);
target.setMinutes(59);
target.setSeconds(59);
target.setMilliseconds(0);
console.log(month + '月第' + number + '周截止', target);
result.end = target.getTime();
console.log(result);
return result;
}
target.setDate(target.getDate() + (7 - targetDay) + 1);//對其到周一,設置到第二個周一0時0分0秒
target.setDate(target.getDate() + 7 * (number - 2));//設置到第n周周日
console.log(month + '月第' + number + '周起始', target);
result.begin = target.getTime();
if (number === weekCount[weekCount.length - 1]) {
target.setMonth(month);//次月1日
target.setDate(1);
target.setHours(0);
target.setMinutes(0);
target.setSeconds(0);
target.setMilliseconds(-1);//向前到當月最后1毫秒
result.end = target.getTime();
console.log(month + '月第' + number + '周截止', target);
console.log(result);
return result;
}
target.setDate(target.getDate() + 6);//設置到第n周周日
target.setHours(23);
target.setMinutes(59);
target.setSeconds(59);
target.setMilliseconds(0);
result.end = target.getTime();
console.log(month + '月第' + number + '周截止', target);
console.log(result);
return result;
}
/**
* 獲取每月有多少周
* @param {*} year
* @param {*} month
*/
function getWeekCountInMonth(year, month) {
const list = [];
const target = new Date();
let offset = 1;
target.setFullYear(year);
target.setMonth(month - 1);
target.setDate(1);
target.setHours(0);
target.setMinutes(0);
target.setSeconds(0);
target.setMilliseconds(0);
let targetDay = target.getDay();
targetDay = targetDay === 0 ? 7 : targetDay;
if (targetDay !== 1) {
console.log(targetDay);
list.push(offset);
offset = offset + 1;
target.setDate(target.getDate() + (7 - targetDay) + 1);//對齊到周一
}
for (let i = offset; i <= 5; i++) {
list.push(offset);
offset = offset + 1;
target.setDate(target.getDate() + 7);//設置到次周一0時分秒
target.setMilliseconds(-1);//向前1毫秒到本周最后1毫秒
console.log(target);
if ((target.getMonth() + 1) !== month) {
break;
}
}
console.log(month + '月周數', list);
return list;
}
/**
* 獲取上一月時間
* @param {} date
*/
function getPreMonth (date) {
var _date = dateFormat('YYYY-MM', new Date(date));
var arr = _date.split('-');
var year = arr[0]; // 獲取當前日期的年份
var month = arr[1]; // 獲取當前日期的月份
var day = arr[2]; // 獲取當前日期的日
var days = new Date(year, month, 0);
days = days.getDate(); // 獲取當前日期中月的天數
var year2 = year;
var month2 = parseInt(month) - 1;
if (month2 === 0) {
year2 = parseInt(year2) - 1;
month2 = 12;
}
var day2 = day;
var days2 = new Date(year2, month2, 0);
days2 = days2.getDate();
if (day2 > days2) {
day2 = days2;
}
if (month2 < 10) {
month2 = '0' + month2;
}
var t2 = year2 + '-' + month2;
return t2;
}
/**
* 獲取下一月時間
* @param {時間} date
*/
function getNextMonth (date) {
var _date = dateFormat('YYYY-MM', new Date(date));
var arr = _date.split('-');
var year = arr[0]; // 獲取當前日期的年份
var month = arr[1]; // 獲取當前日期的月份
var day = arr[2]; // 獲取當前日期的日
var days = new Date(year, month, 0);
days = days.getDate(); // 獲取當前日期中的月的天數
var year2 = year;
var month2 = parseInt(month) + 1;
if (month2 === 13) {
year2 = parseInt(year2) + 1;
month2 = 1;
}
var day2 = day;
var days2 = new Date(year2, month2, 0);
days2 = days2.getDate();
if (day2 > days2) {
day2 = days2;
}
if (month2 < 10) {
month2 = '0' + month2;
}
var t2 = year2 + '-' + month2;
return t2;
}
/**
* 格式化時間
* @param {YYYY-MM-DD hh:mm:ss} String
* @param {時間} date
*/
function dateFormat (fmt, date) {
date = new Date(date);
let ret;
let opt = {
'Y+': date.getFullYear().toString(), // 年
'M+': (date.getMonth() + 1).toString(), // 月
'D+': date.getDate().toString(), // 日
'h+': date.getHours().toString(), // 時
'm+': date.getMinutes().toString(), // 分
's+': date.getSeconds().toString() // 秒
// 有其他格式化字符需求可以繼續添加,必須轉化成字符串
};
for (let k in opt) {
ret = new RegExp('(' + k + ')').exec(fmt);
if (ret) {
fmt = fmt.replace(ret[1], (ret[1].length === 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, '0')));
}
}
return fmt;
}
// getMonthBeginEnd(2019, 9);
// getDateBeginEnd(2019, 10, 16);
// getWeekByMonth(2019, 10, 5);