zoukankan      html  css  js  c++  java
  • 关于js日期对象二三事

        学习日期对象date之前,先来理清一些知识。

         一个月有多少天?一年有多少天?什么叫平年和闰年?平年和闰年的区别?时间的基准点(起点)从何时开始算起?new Date()初始化的格式?

         OK,带着这些问题,我们一步步,循序渐进的进入date对象的世界。

         

          一,平年和闰年

         公历年份是整百或整千的(也就是年份末尾至少有2个0的),用年份除以400,如果能整除,就是闰年,不能整除就是平年,

         公历其他的年份,用年份除以4,如果能整除,就是闰年,不能整除就是平年,

         如1900年,1900÷400=4……300 就是平年,平年2月是28天。
         2000年,2000÷400=5 就是闰年,闰年2月是29天。
         2001年,2001÷4=500……1 就是平年
         2004年,2004÷4=501 就是闰年

         闰年2月只有29天 平年2月只有28天

          上面这段话就说明每一年的2月不是28天就是29天,而其他月份,1,3,5,7,8,10,12共7个月都是31天,4,6,9,11共4个月都是30天。因此这么一算,一年不是365天,就是366天。每四年出现一次闰年。

          因此,闰年就是31*7+29+30*4=366天,平年就是31*7+28+30*4=365天。

          二,时间的起点

          为什么时间要从1970年1月1日开始算起?先阅读两篇文章了解一下。第一篇第二篇,读完之后,我们可以从中发现,最早出现的UNIX操作系统考虑到计算机产生的年代和应用的 时限综合取了1970年1月1日作为UNIX TIME的纪元时间(开始时间),至于时间回归的现象相信随着64为操作系统的产生逐渐得到解决,因为用64位操作系统可以表示到 292,277,026,596年12月4日15时30分08秒,相信我们的N代子孙,哪怕地球毁灭那天都不用愁不够用了,因为这个时间已经是千亿年以后 了。因此这个规矩就一直定下来了。我们以1970年1月1日为起点开始计算。

          细心的可能会想到,时分秒又是多少呢?别急,我们在打印一下。

          

            从上面可以看出返回的结果是1970年1月1日,8点开始算起。真的是这样吗?实际上时分秒是 0  0  0  ,0点是时间纪元。

            打印出来的时间是8点而非0点,原因是存在系统时间和本地时间的问题,其实系统时间依然是0点,只不过我的电脑时区设置为东8区,故打印的结果是8点。

            因此,通过上面的分析与探索,我们可以得出以下结论:

             时间的起点是1970年1月1日0时0分0秒,只不过在中国由于电脑时区设置,所以会显示打印结果为8点。

           

            三:date初始化格式

            new Date() 日期参数初始化 

             1) new Date("month dd,yyyy hh:mm:ss")
             2) new Date("month dd,yyyy");
             3) new Date(yyyy,mth,dd,hh,mm,ss);
             4) new Date(yyyy,mth,dd);
             5) new Date(ms);  //需要注意最后一种形式,参数表示的是需要创建的时间和 GMT时间1970年1月1日之间相差的毫秒数

            我们实验一下:

            1)new Date('2014/5/1 00:00:00');

            2)  new Date('2014-5-1 00:00:00');

            3)  new Date(1325295549549);  //直接将毫秒数传参  new Date(ms)

            4)  new Date(2014,4,1,00,00,00);  //如果不加引号就在月份那减1,因为月份是从0开始的

            5)  new Date('2014,5,1');

            6)  new Date("May 1,2014 00:00:00");

            7)  new Date("May 1,2014");

            上述几种方式都能返回正确设置的时间。但我们要注意一下第四种写法,第四种写法,不加引号时,第二个参数是指第几个月,比如你这里的 4 就是第4个月,实际上已经是5月了,因为月份是从0开始的。加引号时,就相当于格式化时间格式。

    添加引号,会自动调用date.parse()这个方法,将这个字符串转换为时间。如果不加引号,那就是直接输入了年月日,又因为索引是从0开始的原因,自然会多出一个月的天数。

            因此,在用第四种方法的时候要记得月是从0开始算起的。

            

            var today = new Date(); //获取现在的时间

           

           这样,我们每次刷新页面都能得到当前的时刻,也就是说是变化的。如果我们想让它自动随着时间显示当前的年月日,时分秒,我们就需要编写一个js函数了。     

    <body onload="showtime()" >
    <script language="javascript">
        function showtime(){
        var today=new Date();
        var h=today.getHours();
        var m=today.getMinutes();
        var s=today.getSeconds();
        m=checkTime(m);
        s=checkTime(s);
        document.getElementById('text').innerHTML=h+":"+m+":"+s;
        setTimeout('showtime()',200); //这个时间尽量小一点,因为为了精确
        }
     
        function checkTime(i)
        {
            if (i<10)
            {i="0" + i}
            return i ;
        }
    </script>
    <div id="text"></div>
    </body>

            

           四:常用方法

           1. Date.now()

           = > 返回自 1970-1-1 00:00:00 UTC (时间标准时间)至今所经过的毫秒数。

           Date.now(); //1469166290095
          2. Date.parse()

          = > 解析一个表示日期的字符串,并返回从 1970-1-1 00:00:00 所经过的毫秒数。

          Date.parse('Sun Dec 17 1995 03:24:00 GMT+0800 (CST)');  //819141840000
         3. getFullYear()

         = > 返回指定日期对象的年份

         var today = new Date();
         today.getFullYear(); // 2016
         4. getMonth()

         = > 返回指定日期对象的月份(0-11)

         var today = new Date();
         today.getMonth(); // 6
         5. getDate()

         = > 返回指定日期对象的月份中的第几天(1-31)

         var today = new Date();
         today.getDate(); // 22
         6. getHours()

         = > 返回指定日期对象的小时(0-23)

         var today = new Date();
         today.getHours(); // 14
         7. getMinutes()

         = > 返回指定日期对象的分钟(0-59)

         var today = new Date();
         today.getMinutes(); // 40
         8. getSeconds()

         = > 返回指定日期对象的秒数(0-59)

         var today = new Date();
         today.getSeconds(); // 40

           五:累计运行

           有这么一个需求,假如我从2014年5月1号加入了某个神秘的社团,一直到现在?问我加入这个社团一共有 多少年多少月多少日多少时分秒?

            提出这么一个需求后,我们就得先分析解决这个需求的逻辑。OK,我们知道两个日期段之间的毫秒数肯定的准确的。然后可以一直精确得换算出多少天,时分秒等。然后再往上求呢?多少天转化为年和月,我们知道1年有可能有365天或366天,相应的月份有28|29|30|31天,这样做是不是觉得要考虑的情况挺复杂。这种思路肯定是不太好处理的。这时,我们需要换一种思路。等价处理法。

            如何等价?因为我们可以明确的知道两个时间段之间的毫秒数,而我们又知道基准时间是从1970年1月1日0点开始算起的。因此我们可以将差值毫秒数传进new Date()作为它的参数,然后求出对应的时间日期,在对应着减去基准时间,因为基准时间都是最小的。所以不会出现值为负数,然后像高位借1的情况。   

    var today = new Date();
    var oldtime = new Date("2014/5/1 00:00:00");

    得到这两者之后,我们还需要考虑的一点是 getTime()

    var cha = today - oldtime; //这个就相当于today.getTime() - oldtime.getTime(),隐式转换了

    getTime()是获取dateObject 指定的日期和时间距 1970 年 1 月 1 日午夜(GMT 时间)之间的毫秒数。

          什么是午夜,也就是夜里12点钟,这里取得是距离1月1日夜里12点,也就是1月2日0点开始的,因此,我们计算差值的时候,最后不包括1月1日这一天,就是这么来的。哈哈。

         讲道理,我们从字面上来看,午夜应该就是夜里12点,但是系统时间,我们看到new Date(0)获取的却是从1月1日0点开始的,因此这里有点迷惑。如果有明白的小伙伴可以告诉一下。

         再来考虑一个问题,由于我们计时都是从0点开始,这符合我们的逻辑,但是当我们在电脑上输出new Date(0); 发现出来的居然是08:00:00,这是因为我们处于东8区,默认8点开始的。因此我们再计算毫秒数差值的时候要讲8*3600*1000这个毫秒数剪掉才是对应的我们真正的时间。

    var DTIME = 8*3600*1000;

    因此,理清这个逻辑后我们就会很容器理解了。

    两个时间段的差值为    

    var cha = today - oldtime - DTIME;

    将这段差值传进new Date()中。 

    var t  = new Date(cha);

    然后求出对应的年月日,时分秒。

     END!!

  • 相关阅读:
    1349:【例4-10】最优布线问题
    1348:【例4-9】城市公交网建设问题
    P2024 [NOI2001]食物链
    $P2573 [SCOI2012]滑雪$
    $P1991 无线通讯网$
    $P2872 [USACO07DEC]道路建设Building Roads$
    $P1547 Out of Hay$
    hdu 3468 Treasure Hunting
    hungary HK 多重匹配
    Hdu匹配题集
  • 原文地址:https://www.cnblogs.com/hl-520/p/5719859.html
Copyright © 2011-2022 走看看