时间相关
当前标准时间
function format(fmt,timestamp) {
const date = timestamp ? new Date(timestamp) : new Date()
const o = {
"Y+": date.getFullYear(),
"M+": date.getMonth() + 1, // 月
"D+": date.getDate(), // 日
"h+": date.getHours(), // 时
"m+": date.getMinutes(), // 分
"s+": date.getSeconds(), // 秒
"W": date.getDay() // 周
}
for (var k in o) {
if (new RegExp("(" + k + ")").test(fmt)) {
fmt = fmt.replace(RegExp.$1, () => {
if (k === 'W') { // 星期几
const week = ['日', '一', '二', '三', '四', '五', '六']
return week[o[k]]
} else if (k === 'Y+' || RegExp.$1.length == 1) { // 年份 or 小于10不加0
return o[k]
} else {
return ("00" + o[k]).substr(("" + o[k]).length) // 小于10补位0
}
})
}
}
return fmt
}
format('星期W') // 星期日
format("YYYY-MM-DD hh:mm:ss") // 2021-03-21 20:24:32
format("MM/DD/YYYY hh:mm") // 03-21-2021 20:24
format("MM/DD/YYYY hh:mm") // 03-21-2021 20:24
format("YYYY年MM月DD日 hh:mm:ss 星期W") // 2021年03月21日 20:30:14 星期日
format("YYYY年MM月DD日 hh:mm:ss 周W", 1616330071538) //2021年03月21日 20:34:31 周日
时间戳转换
new Date().getTime() // 精确到毫秒
new Date().valueOf() // 精确到毫秒
Date.parse(new Date()) // 精确到秒
// 第一个得到:1616330071538
传入时间戳判断多久前
const time = (timestemp) => {
const minute = 1000 * 60;
const hour = minute * 60;
const day = hour * 24;
const month = day * 30;
const year = month * 12;
const diffValue = new Date().getTime() - timestemp; // 当前时间戳-原时间戳=相差时间
// 如果本地时间小于变量时间
if (diffValue <= 0) {
return '现在'
}
// 计算差异时间的量级
const yearC = diffValue / year;
const monthC = diffValue / month;
const weekC = diffValue / (7 * day);
const dayC = diffValue / day;
const hourC = diffValue / hour;
const minC = diffValue / minute;
// 从大到小排序 满足1以上即成立
const map = {
[yearC]: '年',
[monthC]: "月",
[weekC]: "周",
[dayC]: "天",
[hourC]: "小时",
[minC]: "分钟",
}
for (let i in map) {
if (i >= 1) {
return `${parseInt(i)}${map[i]}前`
}
}
}
time(new Date().getTime()) // 现在
time(new Date('2021-1-11').getTime()) // 2月前
time(new Date('2021-2-22').getTime()) // 3周前
time(new Date('2020-3-11').getTime()) // 1年前
time(new Date('2019-3-11').getTime()) // 2年前
time(new Date(1616330071538).getTime()) // 1小时前
判断当前时间是否在时间范围内
// 第一种 很简单
function time(beginTime, endTime) {
const timeNow = new Date().getHours()
return timeNow >= beginTime && timeNow < endTime
}
time(8, 20) //true
// 第二种 升级版
function times(beginTime, endTime) {
const bDate = beginTime.split(':')
const eDate = endTime.split(':')
const o = {}
const s = ['nDate', 'bDate', 'eDate']
for (let i of s) {
o[i] = new Date()
let hours, minute;
if (i == 'nDate') {
hours = o[i].getHours()
minute = o[i].getMinutes()
} else {
const arr = i == 'bDate' ? bDate : eDate
hours = arr[0]
minute = arr[1] || 0
}
o[i].setHours(hours)
o[i].setMinutes(minute)
}
// 当前、开始、结束,三者的时间戳进行对比,答案就很清晰明了
return o.nDate.getTime() - o.bDate.getTime() > 0 && o.nDate.getTime() - o.eDate.getTime() < 0
}
// 两种都支持
console.log(times('8', '22'))
console.log(times('8:30', '22:54'))
前后七天日期
// 后七天日期
function getAfterDate() {
let date = new Date().getTime(),
result = [],
newDate,
month,
day;
for (let i = 1; i < 8; i++) {
newDate = date + i * 24 * 60 * 60 * 1000
month = new Date(newDate).getMonth() + 1
day = new Date(newDate).getDate()
result.push(month + '-' + day)
}
return result
}
// ["3-25", "3-26", "3-27", "3-28", "3-29", "3-30", "3-31"]
// 前七天日期
function getBeforeDate() {
let date = new Date().getTime(),
result = [],
newDate,
month,
day;
for (let i = 7; i > 0; i--) {
newDate = date - i * 24 * 60 * 60 * 1000
month = new Date(newDate).getMonth() + 1
day = new Date(newDate).getDate()
result.push(month + '-' + day)
}
return result
}
// ["3-17", "3-18", "3-19", "3-20", "3-21", "3-22", "3-23"]
是否现在到之后七天内日期
/**
* @param {String} tcimestamp => '2020-05-08 19:46'
*/
function a(timestamp) {
timestamp = new Date(timestamp).getTime()
const endTime = 24 * 60 * 60 * 1000 * 7
const currentTime = new Date().setHours(0, 0, 0, 0)
return currentTime <= timestamp && currentTime + endTime > timestamp
}
console.log(a('2021-3-23')) // true
console.log(a('2021-3-29')) // true
console.log(a('2021-3-31')) // false
随意搭配
/**
* @param {String} tcimestamp => '2020-05-08 19:46'
*/
function dateFormat(timestamp) {
const w = new Date(timestamp).getDay() // 获取周
// 解析时间为数组
timestamp = timestamp.toString().replace(/-|\:|\/|\ /g, ',').split(',')
const week = ['日', '一', '二', '三', '四', '五', '六']
const month = ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二']
const weekEn = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
const monthEn = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec']
const opt = ['Y', 'M', 'D', 'h', 'm', 'W'].reduce((t, v, i) => {
t[v] = v === 'W' ? w : timestamp[i]
return t
}, {})
// 日
let st = 'st',
nd = 'nd',
rd = 'rd',
th = 'th',
obj = {
1: st,
2: nd,
3: rd,
21: st,
22: nd,
23: rd,
31: st
};
let day = opt.D + (obj[opt.D] ? obj[opt.D] : th)
day = day.startsWith(0) ? day.slice(1) : day // 去除前面的0
const time = {
date: `${opt.Y}/${opt.M}/${opt.D} ${opt.h}:${opt.m}`,
time: `${opt.h}:${opt.m}`,
year: opt.Y,
month: {
on: opt.M,
cn: month[Number(opt.M) - 1],
en: monthEn[Number(opt.M) - 1]
},
day: {
on: opt.D,
en: day
},
week: {
on: week[opt.W],
en: weekEn[opt.W]
}
}
return time
}
console.log(dateFormat('2020-05-08 19:46'))
// {
// date: "2020/05/08 19:46"
// day: { on: "08", en: "8th" }
// month: { on: "05", cn: "五", en: "May" }
// time: "19:46"
// week: { on: "五", en: "Friday" }
// year: "2020"
// }
← 对象相关 JavaScript题解 →