0

0

Date对象常用的封装方法及遇到的问题解决

不言

不言

发布时间:2019-03-21 11:06:52

|

2177人浏览过

|

来源于segmentfault

转载

本篇文章给大家带来的内容是关于Date对象常用的封装方法及遇到的问题解决,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

使用JS中的Date对象已经很久了,但是一直以来都没有将常用的封装函数和遇到的坑记录下来,趁着今天有空,就记录下来,方便自己下次直接使用,并提醒自己遇到过那些坑。如果有哪些地方不对,希望大家能够指出,那我将不胜感激。

在将日期(没有时分秒)转换为时间戳时,日期在用'-'(2019-01-01)和'/'(2019/01/01)连接时,转换成时间戳的结果有所差异

 为了不让大家先看见例子太多而厌烦,就先上结论了。
 结论: 
     1)如果日期之间是使用 '-'连接时,当月份和天数都小于9且前面加了一个 0 的话,那么被转为时间戳时会将时间默认转换为当天的上午8点
     2)如果日期之间是使用 '-'连接时,当月份和天数有一个小于9且小于9的前面加了一个 0 的话,那么被转为时间戳时会将时间默认转换为当天的上午8点
     3)如果日期之间是使用 '-'连接时,当月份和天数都小于9且只有一个前面加了一个 0 的话,那么被转为时间戳时会将时间默认转换为当天的上午12点也就是00:00
     4)如果日期之间是使用 '-'连接时,当月份和天数都大于9时,那么被转为时间戳时会将时间默认转换为当天的上午8点
     5)如果日期之间是使用 '/'连接时,那么转换成时间戳时只会被转换为当天的凌晨 00:00
  总结: 在将日期转换为时间戳时,如果没有设置时分时,最好使用 '/' 来进行连接,来避免相同日期在写法不同时获取的时间戳不同 
  下面的是用来证明结论的例子:

"
    let time1 = new Date('2019-03-03').getTime();
    let time2 = new Date('2019/3/3').getTime();
    console.log('获取时间')
    console.log(time1)        
    console.log(time2) 
    console.log( (time1-time2) / 1000 /60 /60 )       // 8
    // 根据本地格式,把Date对象的时间转换为字符串  上午12:00:00也就是 00:00:00
    console.log(new Date('2019-03-03').toLocaleString())  // 2019/3/3 上午8:00:00
    console.log(new Date('2019-03-12').toLocaleString())  // 2019/3/12 上午8:00:00
    console.log(new Date('2019-11-03').toLocaleString())  // 2019/11/3 上午8:00:00
    console.log(new Date('2019-3-03').toLocaleString())  // 2019/3/3 上午12:00:00
    console.log(new Date('2019-03-3').toLocaleString())  // 2019/3/3 上午12:00:00
    console.log(new Date('2019-11-13').toLocaleString()) // 2019/11/13 上午8:00:00
    console.log(new Date('2019/03/03').toLocaleString())  // 2019/3/3 上午12:00:00
    console.log(new Date('2019/3/3').toLocaleString())  // 2019/3/3 上午12:00:00
    console.log(new Date('2019/03/3').toLocaleString())  // 2019/3/3 上午12:00:00
    console.log(new Date('2019/3/03').toLocaleString())  // 2019/3/3 上午12:00:00
    console.log(new Date('2019/03/12').toLocaleString())  // 2019/3/12 上午12:00:00
    console.log(new Date('2019/11/03').toLocaleString())  // 2019/11/3 上午12:00:00
  "

将日期格式转换为时间戳和将时间戳转换为日期格式

1. 将日期格式转换为时间戳的三种方法
   "javascript
    let dateStr = new Date('2019-3-20 18:59:39:123');
    let timestamp1 = dateStr.getTime();    // 1553079579123
    let timestamp2 = dateStr.valueOf();    // 1553079579123
    let timestamp3 = Date.parse(dateStr);  // 1553079579000
   "
date.getTime()、date.valueOf()会精确到毫秒,而Date.parse(date)只能精确到秒,毫秒用000替代
2. 将时间戳转换为日期格式
    "javascript
    function dateFormat(timestamp) {
        timestamp = (timestamp + '' ).length > 10 ? timestamp : timestamp * 1000;  //判断时间戳为几位,10位时加上毫秒,13为的则不管
        let date = new Date(timestamp);
        let year = date.getFullYear();
        let month = date.getMonth() + 1 > 9 ? date.getMonth() + 1 : '0' + (date.getMonth() + 1);   // 月份从0开始,0~11, 所以显示时要 +1
        let day = date.getDate() > 9 ? date.getDate() : '0' + date.getDate() ;
        let hour = date.getHours() > 9 ? date.getHours() : '0' + date.getHours() ;
        let minutes = date.getMinutes() > 9 ? date.getMinutes() : '0' + date.getMinutes();
        let seconds = date.getSeconds() > 9 ? date.getSeconds() : '0' + date.getSeconds();
        return year + '-' + month + '-' + day + ' ' + hour + ':' +  minutes + ':' + seconds;
    }
    "

比较两个日期之间相隔多少天

/**
   * @method  计算两个日期之间有几天,包括第一天
   * @param  beginTime  开始时间的日期 '2019-3-19' || '2019/3/19'
   * @param  endTime    结束时间的日期 '2019-3-20' || '2019/3/19'
   */
getIntervalDay('2019-03-03', '2019-03-8');  // 若是没有用 正则将格式转换的话得到的结果是5天,转换后是6天
function getIntervalDay(beginTime, endTime) {
    // 先利用将其转换为统一的格式,因为 '-' 格式下的时间戳转换的结果不一致,原因在本文的开头
    beginTime = beginTime.replace(/\-/g, '/');
    endTime = endTime.replace(/\-/g, '/');
    let time1 = new Date(beginTime).getTime();
    let time2 = new Date(endTime).getTime();
    // console.log(beginTime)
    // console.log(endTime)
    let second = time2 - time1;
    let day = parseInt(second / (1000 * 60 * 60 * 24)) + 1; // 当天也算进去
    return day;
}

判断一年有多少天

    // 闰年为366天(2月中多一天),平年为365天。
   // 闰年有两种: 1)普通闰年:能被4整除但不能被100整除的年份为普通闰年。
   //            2)世纪闰年:能被400整除的为世纪闰年。
   function getYearAllDay(year) {
       return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0 ? 366 : 365;
   }

获取某年的一个月的总天数

  // date格式为 'xxxx-xx-xx' 'xxxx/xx/xx' 'xxxx/xx' 'xxxx-xx'  
  function getMonthAllDay(date) {
      date = new Date(date);
      let year = date.getFullYear();
      let month = date.getMonth() + 1; // 从 Date 对象返回月份 (0 ~ 11)。 
      let nextMonth = year + '-' + (month + 1);  
      let newDate = new Date(nextMonth);
      newDate.setDate(0); // 利用设置日期时从1~31设置,当设置为0时,即上个月的最后一天
      return newDate.getDate();
  }
本篇文章到这里就已经全部结束了,更多其他精彩内容可以关注PHP中文网的JavaScript教程视频栏目!

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

28

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

8

2026.01.26

苹果官方查询网站 苹果手机正品激活查询入口
苹果官方查询网站 苹果手机正品激活查询入口

苹果官方查询网站主要通过 checkcoverage.apple.com/cn/zh/ 进行,可用于查询序列号(SN)对应的保修状态、激活日期及技术支持服务。此外,查找丢失设备请使用 iCloud.com/find,购买信息与物流可访问 Apple (中国大陆) 订单状态页面。

31

2026.01.26

npd人格什么意思 npd人格有什么特征
npd人格什么意思 npd人格有什么特征

NPD(Narcissistic Personality Disorder)即自恋型人格障碍,是一种心理健康问题,特点是极度夸大自我重要性、需要过度赞美与关注,同时极度缺乏共情能力,背后常掩藏着低自尊和不安全感,影响人际关系、工作和生活,通常在青少年时期开始显现,需由专业人士诊断。

3

2026.01.26

windows安全中心怎么关闭 windows安全中心怎么执行操作
windows安全中心怎么关闭 windows安全中心怎么执行操作

关闭Windows安全中心(Windows Defender)可通过系统设置暂时关闭,或使用组策略/注册表永久关闭。最简单的方法是:进入设置 > 隐私和安全性 > Windows安全中心 > 病毒和威胁防护 > 管理设置,将实时保护等选项关闭。

5

2026.01.26

2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】
2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】

铁路12306提供起售时间查询、起售提醒、购票预填、候补购票及误购限时免费退票五项服务,并强调官方渠道唯一性与信息安全。

35

2026.01.26

个人所得税税率表2026 个人所得税率最新税率表
个人所得税税率表2026 个人所得税率最新税率表

以工资薪金所得为例,应纳税额 = 应纳税所得额 × 税率 - 速算扣除数。应纳税所得额 = 月度收入 - 5000 元 - 专项扣除 - 专项附加扣除 - 依法确定的其他扣除。假设某员工月工资 10000 元,专项扣除 1000 元,专项附加扣除 2000 元,当月应纳税所得额为 10000 - 5000 - 1000 - 2000 = 2000 元,对应税率为 3%,速算扣除数为 0,则当月应纳税额为 2000×3% = 60 元。

12

2026.01.26

oppo云服务官网登录入口 oppo云服务登录手机版
oppo云服务官网登录入口 oppo云服务登录手机版

oppo云服务https://cloud.oppo.com/可以在云端安全存储您的照片、视频、联系人、便签等重要数据。当您的手机数据意外丢失或者需要更换手机时,可以随时将这些存储在云端的数据快速恢复到手机中。

40

2026.01.26

抖币充值官方网站 抖币性价比充值链接地址
抖币充值官方网站 抖币性价比充值链接地址

网页端充值步骤:打开浏览器,输入https://www.douyin.com,登录账号;点击右上角头像,选择“钱包”;进入“充值中心”,操作和APP端一致。注意:切勿通过第三方链接、二维码充值,谨防受骗

7

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.1万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号