Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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
      

封装一个格式化函数

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位时间戳,可比较先后