js Date

870 阅读5分钟

引言

在了解Date的用法之前,首先对GMT,UTC,CST时间做一定了解。

  • 格林威治标准时间GMT: 以格林威治为起点,每隔经度15°,时差1小时,将全球划分24个时区,北京为GMT+8

  • 世界协调时间UTC: 利用原子钟计算时间,几乎可以认为UTC=GMT,但UTC精准。在UTC中,每一年或两年会有一个闰秒,而我们一般不理会这个“闰秒”,但是在Java中,这造成我们有时会出现60秒或61秒

  • 中央标准时间CST:需注意java后台客户端用的不是同一种CST。

     美国cst时间:零时区(GMT)减6个小时
     Central Standard Time (USA) UT-6:00 
     澳大利亚cst:加9个半小时
     Central Standard Time (Australia) UT+9:30 
     中国cst:加8个小时
     China Standard Time UT+8:00 
     古巴cst:减4个小时
     Cuba Standard Time UT-4:00

总结:可通过GMTUTC获取格林威治时间,可通过GMT+时区时间获取当地时间,如北京为GMT+8:00

    //java语言下
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ"); //Z为时区
    System.out.println("本地时间:"+simpleDateFormat.format(new Date()));
    simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
    System.out.println("格林威治时间:"+simpleDateFormat.format(new Date()));
    simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT+09:00"));
    System.out.println("东京时间:" +simpleDateFormat.format(new Date()));
    //打印结果
    本地时间:2020-11-05 16:58:11+0800
    格林威治时间:2020-11-05 08:58:11+0000
    东京时间:2020-11-05 18:02:05+0900

js创建时间

  • 获取当前日期时间
   var now=new Date();
   console.log(now.toLocaleString());
   //打印结果
   2020-11-6 11:14:08
  • 根据特定的日期和时间创建Date对象
  1. 给parse(patternStr)函数传入日期格式的字符串获取毫秒值,再传给new Date(msecond)。 注:也可直接向new Date(patternStr)传入日期格式字符串,两者效果相同
   var now=new Date(Date.parse("2018-01-14 12:24:00"));
   var cur=new Date("2018/12/24")
   console.log(now);
   console.log(cur );
   //打印结果
   2018-01-14T04:24:00.000Z
   2018-12-23T16:00:00.000Z

因国家不同,浏览器解析Date时可能对日期格式的要求有所不同

  1. UTC函数传参获取毫秒值,依次传参:UTC(year,month,day,hour,minute,second,msecond),再通过new Date()获取。

year: 格式yyyy,必填,如2018.

month:可填范围0 ~ 11,其中0代表1月,依次递增,必填

day:可填范围1 ~31选填,不填时默认为1。

hour: 24小时制,选填,不填时默认为0.

minute和second: 选填,默认为0

  var now=new Date(Date.UTC(2018,0));
  var cur=new Date(Date.UTC(2018,2,25,14,6,38));
  console.log(now);
  console.log(cur );
  //打印结果
  2018-01-01T00:00:00.000Z
  2018-03-25T14:06:38.000Z

也可以直接把这些参数传入new Date()中:

   var now=new Date(2018,0);
   var cur=new Date(2018,2,25,14,6,38);
   console.log(now);
   console.log(cur );
   //打印结果
   2017-12-31T16:00:00.000Z
   2018-03-25T06:06:38.000Z
  1. now()函数当前毫秒值:Date.now().
  • toString,toLocalStringvalueOf函数
  1. toString:返回带日期和时区的字符串
  var cur=new Date(2018,2,25,14,6,38);
  console.log(cur.toString());
  //打印结果
  Sun Mar 25 2018 14:06:38 GMT+0800 (GMT+08:00)
  1. toLocalString:按与浏览器相适应的时区的日期格式返回。
   var cur=new Date(2018,2,25,14,6,38);
   console.log(cur.toLocaleString());
   //打印结果
   2018-3-25 14:06:38
  1. valueOf: 返回毫秒值,所以两个时间可以直接比较,因为它们在比较前调用了valueOf方法。
   var cur=new Date(2018,2,25,14,6,38);
   var now=new Date("2017-02-26 12:25:33");
   console.log("cur的毫秒值:"+cur.valueOf());
   console.log("cur>now: "+(cur>now));
   //打印结果
   cur的毫秒值:1521957998000
   cur>now: true
  • 常见的日期时间组件方法。 获取本地时间的年 月 日 时 分 秒 毫秒的值
    var cur=new Date(2018,2,25,14,6,38); //0~11代表1月~12月
    var year=cur.getFullYear();
    var month=cur.getMonth();  
    var day=cur.getDate();
    var hour=cur.getHours();
    var minutes=cur.getMinutes();
    var seconds=cur.getSeconds();
    var mseconds=cur.getMilliseconds();
    console.log("时间为:"+year+"-"+(month+1)+"-"+day+" "+hour+":"+minutes+":"+seconds+":"+mseconds);
    //打印结果
    时间为:2018-3-25 14:6:38:0

获取格林威治时间的年 月 日 时 分 秒 毫秒的值

    //-8小时
    var cur=new Date(2018,2,25,14,6,38); //0~11代表1月~12月
    var year=cur.getUTCFullYear(); 
    var month=cur.getUTCMonth();  
    var day=cur.getUTCDate();
    var hour=cur.getUTCHours();
    var minutes=cur.getUTCMinutes();
    var seconds=cur.getUTCSeconds();
    var mseconds=cur.getUTCMilliseconds();
    console.log("时间为:"+year+"-"+(month+1)+"-"+day+" "+hour+":"+minutes+":"+seconds+":"+mseconds);
    //打印结果
    时间为:2018-3-25 6:6:38:0

获取日期中处于某星期的星期几

    var cur=new Date(2018,2,25,14,6,38); //0~11代表1月~12月
    var week=cur.getDay();
    var arr=["星期一","星期二","星期三","星期四","星期五","星期六","星期天"]
    console.log("本地时间是:"+arr[week]);
    var weekUTC=cur.getUTCDay();
    console.log("格林威治时间是:"+arr[weekUTC]);
    //打印结果
    本地时间是:星期一
    格林威治时间是:星期一

总结: 了计算时外,get和getUTC的方法结果一致的,因为只有小时涉及了时区的概念。

自定义时间格式化

为了解决不同的浏览器对js代码的解析机制不一致,可自定义格式化方法

  function formateDate(date, format) {
      var o = {
        "M+": date.getMonth() + 1, //month
        "d+": date.getDate(), //day
        "h+": date.getHours(), //hour
        "m+": date.getMinutes(), //minute
        "s+": date.getSeconds(), //second
        "q+": Math.floor((date.getMonth() + 3) / 3), //quarter
        S: date.getMilliseconds(), //millisecond
      };
      if (/(y+)/.test(format))
        format = format.replace(
          RegExp.$1,
          (date.getFullYear() + "").substr(4 - RegExp.$1.length)
        );
      for (var k in o)
        if (new RegExp("(" + k + ")").test(format))
          format = format.replace(
            RegExp.$1,
            RegExp.$1.length == 2
              ? o[k]
              : ("00" + o[k]).substr(("" + o[k]).length)
          );
      return format;
    }
    console.log(formateDate( new Date(Date.now()),"yyyy/MM/dd hh:mm:ss"));
    //打印结果
    2020/12/7 15:10:39

对上面代码需要的注意的是:

RegExp.$1: 正则表达式中用各个()括起来的部分为各个捕获组的表达式,而可通过RgeExp.$1,$2,$3.....获取各个捕获组匹配的结果。

定义的对象o,以正则表达式字符串作为对象的属性,如:M+,d+.