背景
有时候我们在跑数据时可能会遇到将指定日期变为后一天的日期。应用场景如下:今天是 4 月 23 日 17:00,我想获取所有 4 月 22 日到 23 日两天的复联 4 新增预售票房信息,所以理论上我们应该统计 4 月 22 日 00:00——4 月 24 日 00:00 的数据,但是用户有可能下意识的就会选择 22、23。
有人也许会说,加个提示不就行了何必这么麻烦?在日期选择里有时候产品会要求当前日期之后的日子不可选(略杠精)那么这种情况下,上述需求就需要咱们处理了,存在即合理 hhh。那么如何实现呢?
首先众所周知,在编程时,日期有一个通用的标准就是 时间戳 (timestamp)
,时间戳是指格林威治时间 1970 年 01 月 01 日 00 时 00 分 00 秒(北京时间 1970 年 01 月 01 日 08 时 00 分 00 秒) 起至现在的总秒数 / 总毫秒数(但毫秒数更为常见,也更加精确)。
思路
思路其实很简单,就是获取当前时间戳 A,计算一天的毫秒数 B,即可得后一天的时间戳 C =A+B,随后通过 C 获取年月日即可。
代码
在项目里用 TS 写的,不用太纠结于变量的类型声明,其他都差不多
dateFormat(d: Date, str: string, isEndDate: boolean) {let mon = d.getMonth() + 1;
let day = d.getDate();// 设置默认的月份和天数
if (isEndDate) {
// 当输入为结束日期时,执行如下代码
d.setTime(date.getTime() + 3600 * 24 * 1000);
day = d.getDate();
mon = d.getMonth() + 1;}
let monthString = mon.toString();
if (mon < 10) {
// 当月份小于 10 时,显示月份的时候在前面加一个 0
monthString = '0' + monthString;
}
let dayString = day.toString();
if (day < 10) {
// 当天数小于 10 时,显示天数的时候在前面加一个 0
dayString = '0' + dayString;
}
// 根据传进的 str 来返回指定的时间格式,str 可以为任意格式的字符串
return [d.getFullYear(), monthString, dayString].join(str);
}
this.dateFormat(new Date(), '-', true);
// 当前时间为 2019 年 4 月 23 日,此时输出为 2019-4-24
Done,后期会总结一些关于日期相关计算的思路,可能简单的就不写 code 了。