Date
1. 基本方法
创建
//以当前系统时间为默认参数
var now = new Date();
//给定字符串参数(不推荐)
var date = new Date("1994/01/02 03:23:55");
//给定6个参数
var date = new Date(1994, 0, 02, 3, 23, 55);
//注意1月份是从0开始,同理表示12月份要用11
//复制一个
var newDate = new Date(oldDate);
获取和修改
- 对应 get 和 set 方法(注意月份,星期日,小时,都是从 0 开始)
- 后面可跟如下英文串:【例如 get 跟 FullYear 就是 getFullYear()】
年FullYear (无范围) 月Month (0~11, 0开始,没有12) //特别注意!!! 日Date (1~31, 和现实生活一样) 星期Day (0~6, 0是星期日,没有7) //特别注意!!! 时Hours (0~23. 0开始,没有24) 分Minutes (0~59) 秒Seconds (0~59) 毫秒MilliSeconds
- 后面可跟如下英文串:【例如 get 跟 FullYear 就是 getFullYear()】
封装一个格式化函数
function formatDate(date) {
let format_date = new Date(date);
let year = format_date.getFullYear();
let month = format_date.getMonth() + 1;
month = month < 10 ? "0" + month : month;
let day = format_date.getDate();
day = day < 10 ? "0" + day : day;
return `${year}.${month}.${day}`;
}
console.log(formatDate("2021-01-01T08:00:00.000Z"));
//输出2021.01.01
深入解析
本质
基于 Unix Time Stamp(时间戳)
即自格林威治时间1970年1月1日00时00分00秒(UTC)起经过的毫秒数
这个数字在地球的每一个角落都是相同的
表象
可表示成 Time Zone(时区)
即当地的时间;
这个数字在地球不同的国家是不同的;
客户端 A 输入当地时间,发送到服务端存数据库,再展示给客户端 B
输入数据:2021/01/01 16:00:00
不要用-连接,因为火狐和苹果可能不支持
可以每次都先.replace(/-/g, '/')
客户端 A
输入先换成ISO格式
var date_A = "2021/01/01 16:00:00"
var z_str_A = new Date(date_A).toISOString();
console.log("ISO格式是: " + z_str_A)
//输出ISO时间是: 2021-01-01T08:00:00.000Z
字母T代表使用UTC时间
字母Z代表时间偏移量(相当于默认的+0000)
服务端
可查看数据库所用时区
show variables like '%time_zone%'
ISO转换成时间戳 => 数据库
var time_stamp = new Date(z_str_A)
console.log(time_stamp)
数据库取出 => 时间戳转换成ISO
var z_str_B = new Date(time_stamp).toISOString();
console.log("ISO格式是: " + z_str_B)
客户端 B
var date = new Date(z_str_B);
console.log("客户端B显示: " + date.toLocaleString());
小程序:选择当地时间,换算成东 n 区时间显示
function localToNZone(date_str, timezone) {
var date_obj = date_str ? new Date(date_str) : new Date();
var offset_GMT = new Date().getTimezoneOffset();
// 本地时间和格林威治的时间差,单位为分钟
var targetDate = new Date(
date_obj.getTime() + offset_GMT * 60 * 1000 + timezone * 60 * 60 * 1000,
);
console.log("东" + timezone + "区现在是:" + targetDate.toLocaleString());
//必须用toLocaleString,否则又自动换成浏览器时区
}
localToNZone("", 5);
//输出当前时间对应的东5区时间
localToNZone("2020/01/01 16:00:00", 5);
//输出某个时间对应的东5区时间
比较时间先后
var nowD = new Date()
var cmpD = new Date('2021/07/01 12:00:00');
获取时间戳,可用来比较先后
nowD.getTime() > cmpD.getTime()
//函数返回1625022969338这种13位时间戳,可比较先后