10位时间戳、13位时间戳、17位时间戳,以及在JavaScript中的格式转换

07-09 1284阅读

一、介绍

1、10位时间戳

2、13位时间戳

3、17位时间戳

4、时间戳转换工具

二、13位时间戳的转换

1、转标准日期

2、转格式化日期

三、10位时间戳的转换

1、转标准日期

2、转格式化日期

四、17位时间戳的转换

1、解析思路

2、解析过程

3、完整代码

4、新的问题 


一、介绍

1、10位时间戳

指的是Unix时间戳,它表示自1970年1月1日00:00:00 UTC(协调世界时) 以来的总秒数;

10位时间戳是一种常见的时间表示方式,因其简单、易用、兼容性好,在软件开发和网络应用中被广泛使用;

2、13位时间戳

指的是Unix时间戳,它表示自1970年1月1日00:00:00 UTC(协调世界时) 以来的总毫秒数;

13位时间戳是10位时间戳的扩展,将时间精度提高到了毫秒级,在需要高精度时间记录和分析的场景中尤为有用;

3、17位时间戳

它表示自1601年1月1日00:00:00 GMT(格林威治时间) 以来的总微秒数;

17位的时间戳并不常见,但在Chrome、Edge,Firefox等浏览器的本地数据库文件中,有关时间的字段都采用的是17位的时间戳;

4、时间戳转换工具

无论是哪种格式的时间戳,都是用来表示一个时间点,但都不利于阅读,因此需要将其转换为有利于阅读的标准日期格式;

时间戳转换工具(10、13位时间戳)

时间戳转换工具(17位时间戳)

二、13位时间戳的转换

1、转标准日期

  • 13位时间戳表示自1970年1月1日00:00:00的总毫秒数;
  • 使用JavaScript中的Date对象,可以将13位的时间戳转换为标准日期;
  • 只需在创建Date对象时传入需要转换的13位时间戳即可;
    // 以 1719366631159 时间戳为例
    new Date(1719366631159)

    10位时间戳、13位时间戳、17位时间戳,以及在JavaScript中的格式转换

    2、转格式化日期

    使用该方法可以将13位的时间戳转换成 yyyy-MM-dd HH:mm:ss 格式的日期字符串;

    // 13位时间戳的格式化,以1719366631059为例
    console.log("格式化13位时间戳1719366631059:", formatTimeStamp(1719366631059));
    function formatTimeStamp(timeStamp) {
        let date = new Date(timeStamp);
        let year = date.getFullYear();
        let month = date.getMonth() + 1;
        let day = date.getDate();
        let hour = date.getHours();
        let minute = date.getMinutes();
        let second = date.getSeconds();
        month = month  
    

    10位时间戳、13位时间戳、17位时间戳,以及在JavaScript中的格式转换

    三、10位时间戳的转换

    1、转标准日期

    • 10位时间戳表示自1970年1月1日00:00:00的总秒数;
    • 只需给10位时间戳 * 1000 转成13位时间戳,其他按照13位时间戳的处理方式就可以了;
      // 以 1719366631 时间戳为例
      new Date(1719366631 * 1000);

       10位时间戳、13位时间戳、17位时间戳,以及在JavaScript中的格式转换

      2、转格式化日期

      // 13位时间戳的格式化,以1719366631059为例
      console.log("格式化13位时间戳1719366631059:", formatTimeStamp(1719366631059));
      // 10位时间戳的格式化,以1719366631为例
      console.log("格式化10位时间戳1719366631:", formatTimeStamp(1719366631 * 1000));

      注意:这里使用的是上面13位时间戳的转换方法,只需注意传入的参数即可; 

       10位时间戳、13位时间戳、17位时间戳,以及在JavaScript中的格式转换

      四、17位时间戳的转换

      17位的时间戳在解析上就比较麻烦了,JavaScript中的Date对象只能用来处理13位的时间戳,所以只能将17位时间戳的换成13位时间戳的表示规则,再进行解析(哪位大佬有更好的办法,求赐教);

      17位时间戳-在线转换工具

      从上述网站可以直接对17位的时间戳进行转换,如下图所示:

      10位时间戳、13位时间戳、17位时间戳,以及在JavaScript中的格式转换

       输入要转换的时间戳之后,Unix 时间戳(10位)、以及标准时间(GMT + 8:00)都能得到;

       接下来,以【13363929430000000】这个时间戳为例,进行解析;

      1、解析思路

      • 将17位时间戳代表的微秒数转换为毫秒数(进制1000),记为:timeStamp14;
      • 计算1601年1月1日00:00:00的时间戳,记为:epoch_start;
      • 计算1970年1月1日00:00:00的时间戳,记为:epoch_end;
      • 计算差值 epoch_end - epoch_start, 记为epoch;
      • timeStamp14 - epoch,得到1970年1月1日00:00:00 以后的毫秒数, 记为ms;
      • 使用new Date(),创建日期传入ms,得到根据ms创建的日期对象,记为date;
      • 再使用13位时间戳的格式化方法,对date进行格式化后得到格式化后的日期格式;

        2、解析过程

        (1)统一单位

        • 17位时间戳表示总微秒数;
        • 13位时间戳表示总毫秒数;
        • 需要将17位时间戳 / 1000 转换成毫秒数(微秒与毫秒之间的进制为1000);
          // 17位时间戳表示的总微秒数
          let timeStamp17 = 13363929430000000;   
          // 转换之后的总毫秒数
          let timeStamp14 = Math.floor(timeStamp / 1000);

          (2)差值计算

          • 17位时间戳起始时间是1601年1月1日00:00:00(GMT) 以来的总微秒数;
          • 13位时间戳起始时间是1970年1月1日00:00:00 (UTC) 以来的总毫秒数;
          • 需要计算出1601年1月1日00:00:00 到 1970年1月1日00:00:00的总毫秒数;
            // "1601-1-1 00:00:00"的毫秒数:-11644502743000
            let epoch_start = new Date("1601-1-1 00:00:00:000").getTime();   
            // "1970-1-1 00:00:00"的毫秒数:-28800000 
            let epoch_end = new Date("1970-1-1 00:00:00:000").getTime();   
              
            let epoch = (epoch_end - epoch_start);   // 相差 11644473943000 毫秒 

            注意:这里的时间是差了8小时的;

            可以直接使用"1601-1-1 08:00:00:000"和"1970-1-1 08:00:00:000",计算差值结果都是一样的;

            (3)截取时间

            截取17位时间戳从1970年1月1日00:00:00开始后的毫秒数;

            let ms = timeStamp14 - epoch;   // 减去差值后:1719374657000

            这时17位时间戳就已经变成了从1970年1月1日00:00:00开始后的毫秒数(13位时间戳); 

            (4)转标准日期

            将前面获取到的毫秒数进行转换;

            let date = new Date(ms);     // Wed Jun 26 2024 14:02:12 GMT+0800 (中国标准时间)

            (5)格式化日期

            使用13位时间戳的格式化方法;

            formatTimeStamp(date);   // 2024-06-27 10:31:27

            3、完整代码

            // 13363929430000000   1719455830   2024年6月27日星期四上午10点37分 GMT+08:00
            // 格式化17位时间戳13363929430000000: 2024-06-27 10:31:27
            console.log("格式化17位时间戳13363929430000000:", format17TimeStamp(13363929430000000));    
            function format17TimeStamp(timeStamp){
                let epoch_start = new Date("1601-1-1 00:00:00:000");    
                console.log(epoch_start.getTime());   // "1601-1-1 00:00:00"的毫秒数:-11644502743000
                let epoch_end = new Date("1970-1-1 00:00:00:000");      
                console.log(epoch_end.getTime());   // "1970-1-1 00:00:00"的毫秒数:-28800000
                let epoch = (epoch_end.getTime() - epoch_start.getTime());      
                console.log(epoch);      // 相差epoch: 11644473943000 毫秒
                let timeStamp14 = Math.floor(timeStamp / 1000);     // timeStamp14: 13363929430000
                console.log("timeStamp14:", timeStamp14);
                let ms = timeStamp14 - epoch;   // ms: 1719455487000
                console.log("ms:", ms);
                
                let date = new Date(ms);        // date: Thu Jun 27 2024 10:31:27 GMT+0800 (中国标准时间)
                console.log("date:", date);
                return formatTimeStamp(date);   // 2024-06-27 10:31:27
            }

            4、新的问题 

            很开心,终于解析出来了!!!

            这就完了吗? 当我以为已经成功的时候,突然看到

            10位时间戳、13位时间戳、17位时间戳,以及在JavaScript中的格式转换

            10位时间戳、13位时间戳、17位时间戳,以及在JavaScript中的格式转换

            人家的是37分,我的是31分,这不是原地裂开了!!!!心都碎了一地~~~~~~~~~

            .......................................................................................................................................................

            找问题:年、月、日、小时都没有问题,就差了5-6分钟,难道是精度损失,也没有啊,那这几分钟去哪了?

            苦思冥想,头发掉了又掉,为啥呢?

            直到我做出了一个大胆的尝试:

            -------------------------------------------------------------------------------------------------------------------------------

            使用13位的时间戳转换工具,输入0之后,跟预期结果一样,是它的起始时间:

            【1970-01-01 08:00:00】,

            10位时间戳、13位时间戳、17位时间戳,以及在JavaScript中的格式转换

            使用17位的时间戳转换工具,输入0之后,按道理应该是他的起始时间:

            【1601年1月1日星期一早上8点00分 GMT+08:00】,但它不是!!!!!!!!!!!!!!

            10位时间戳、13位时间戳、17位时间戳,以及在JavaScript中的格式转换

            显示 【GMT+08:05】,好像有那么点对上了,可能就是差在了这里!

            可能是时区的问题,也可能是这个转换工具的问题。。。。。(希望不是我的问题!!)

            当然,这个问题我也是不太确定,没有定论!

            ========================================================================

            先记录到这里吧,希望哪位走过路过的大佬指点指点,到底是为什么呢?

            又要一晚上睡不着了~~~~~~~~~~~~~~~~~~~~~~~

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]