一、区分几个时间相关的概念

  1. 标准时间:GMT即「格林威治标准时间」(Greenwich Mean Time,简称G.M.T.),由于地球的不规则自转,导致GMT时间有误差,因此目前已不被当作标准时间使用。
  2. UTC:UTC是最主要的世界时间标准。当前时区比 UTC 早8个小时。
  3. 时间表示形式:时间字符串/时间秒数(毫秒数)/UTC时间
  4. Unix时间戳:前时间到1970年1月1日00:00:00 UTC对应的秒数
  5. JS中的时间戳:当前时间到1970年1月1日00:00:00 UTC对应的毫秒数

详细的基本概念参考:阮一峰老师—Date对象

二、Moment.js

Moment.js为JavaScript Date对象提供了封装与统一好的API接口,并且提供了更多的功能。实践中,应用到时间相关的处理(vue+elementUI 时间选择组件,设置默认时间为当前一个月)

1. moment对象具有可变性

moment对象的可变性:在使用add,subtract或者set方法的时候会改变原来的moment。
比如:

var a = moment('2016-01-01');
var b = a.add(1, 'week');
a.format();    // "2016-01-08T00:00:00-06:00"

可以看到,a比之前多了一周。如果想要避免这个现象,在执行add,subtract或者set之前可以先clone:

var a = moment('2016-01-01');
var b = a.clone().add(1, 'week');
a.format();    // "2016-01-01T00:00:00-06:00"

2. Time与Date的处理

区别:

  • Moment.js中的time math假设是线性时间标度,只是将基于UTC的时间戳增加或减少所提供的时间单位。
  • date math不使用线性时间标度,而是增加或减少日历上的日期。这是因为一天,一个月或一年中的时间量是可变的。

例如,由于夏令时的过渡,一天的长度可能在23到25小时之间。 当然,月份的天数会有所不同,由于leap年,年份的长度也会有所不同。日期数学可能会导致一些有趣的情况。

3. JS中的Date

Moment.js为原生JavaScript日期对象提供了包装。 为此,Moment.js扩展了功能,还解决了对象中的一些缺陷。

使用本地日期进行解析显然是不可预测的。
例如,假设我在美国使用计算机,但是我有DD / MM / YYYY格式的日期:

var a = new Date('01/12/2016'); //December 1 2016 in DD/MM/YYYY format
//"Tue Jan 12 2016 00:00:00 GMT-0600 (Central Standard Time)"

对于本机Date对象,此行为没有很好的解决方法。 Moment的解析器可以很好地处理它:

moment('01/12/2016', 'DD/MM/YYYY', true).format()
"2016-12-01T00:00:00-06:00"

4. vue项目中使用Momentjs

  1. 安装: npm install moment
  2. 使用:可以挂到vue上来使用
import moment from 'moment'export default {install(Vue) {Object.defineProperty(Vue.prototype, '$moment', { value: moment })}
}

5. 常用操作

Moment.js 使用流式的接口模式,也称为方法链。

moment().add(7, 'days').subtract(1, 'months').year(2009).hours(0).minutes(0).seconds(0);

5.1 add() : 通过增加时间来改变原始的 moment。

moment().add(Number, String);
moment().add(Duration);
moment().add(Object);

这是一个相当稳健的功能,可以为现有的 moment 增加时间。 若要增加时间,则传入要增加的时间的键、以及要增加的数量。

moment().add(7, 'days');    // 或者  moment().add(7, 'd');

常用简写方式:

快捷键
years y
quarters Q
months M
weeks w
days d
hours h
minutes m
seconds s
milliseconds ms

如果要同时增加多个不同的键,则可以将它们作为对象字面量传入。

moment().add(7, 'days').add(1, 'months'); // 链式
moment().add({days:7,months:1}); // 对象字面量

5.2 月份和年份的特殊考虑
如果原始日期的月份中的日期大于最终月份中的天数,则该月份中的日期将会更改为最终月份中的最后一天。

moment([2010, 0, 31]);                  // 一月 31 号
moment([2010, 0, 31]).add(1, 'months'); // 二月 28 号

当增加跨越夏时制时间的时间时,还需要记住一些特殊的注意事项。 如果要增加年份、月份、周、或天,则原始的小时将始终与增加的小时匹配。
增加一个月会将指定的月数增加到日期。

moment([2010, 1, 28]);                 // 二月 28 号
moment([2010, 1, 28]).add(1, 'month'); // 三月 28 号
var m = moment(new Date(2011, 2, 12, 5, 0, 0)); // 美国夏令时开始的前一天
m.hours(); // 5
m.add(1, 'days').hours(); // 5

如果要增加小时、分钟、秒钟或毫秒,则会假设期望精确到小时,这将会导致不同的小时。

var m = moment(new Date(2011, 2, 12, 5, 0, 0)); // 美国夏令时开始的前一天
m.hours(); // 5
m.add(24, 'hours').hours(); // 6(但可能需要先设置时区)

另外,可以使用时长来增加时间。

var duration = moment.duration({'days' : 1});
moment([2012, 0, 31]).add(duration); // 二月 1 号

5.3 subtract():通过减去时间来改变原始的 moment。

moment().subtract(Number, String);
moment().subtract(Duration);
moment().subtract(Object);

与add的用法是一样的,只不过是减去时间。

5.4 startOf():通过将原始的 moment 设置为时间单位的开头来对其进行更改。

moment().startOf(String);

举例:

moment().startOf('year');    // 设置为今年一月1日上午 12:00
moment().startOf('month');   // 设置为本月1日上午 12:00
moment().startOf('quarter');  // 设置为当前季度的开始,即每月的第一天上午 12:00
moment().startOf('week');    // 设置为本周的第一天上午 12:00
moment().startOf('isoWeek'); // 根据 ISO 8601 设置为本周的第一天上午 12:00
moment().startOf('day');     // 设置为今天上午 12:00
moment().startOf('date');     // 设置为今天上午 12:00
moment().startOf('hour');    // 设置为当前时间,但是 0 分钟、0 秒钟、0 毫秒
moment().startOf('minute');  // 设置为当前时间,但是 0 秒钟、0 毫秒
moment().startOf('second');  // 与 moment().milliseconds(0); 相同

这些快捷方式与以下的基本相同。

moment().startOf('year');
moment().month(0).date(1).hours(0).minutes(0).seconds(0).milliseconds(0);moment().startOf('hour');
moment().minutes(0).seconds(0).milliseconds(0)

5.5 endOf():通过将原始的 moment 设置为时间单位的末尾来对其进行更改。

moment().endOf(String);

比如:

moment().endOf("year"); // 将 moment 设置为今年的 12 月 31 日 23:59:59.999

以上内容主要来自:MomentJS文档

Javascript处理时间相关推荐

  1. Google Chrome 工程师:JavaScript 不容错过的八大优化建议

    [摘要]本文为 Google Chrome 团队的开发项目工程师 Addy Osmani 在PerfMatters 2019 网页性能大会发表的"JavaScript性能优化"(h ...

  2. 使用 JavaScript 的代价!(2018 版)

    (点击上方公众号,可快速关注) 英文:Addy Osmani  译文:开源中国 www.oschina.net/translate/the-cost-of-javascript-in-2018 建立交 ...

  3. 5种获取JavaScript时间戳函数的方法

    来源 | https://www.fly63.com/ 一.JavasCRIPT时间转时间戳 JavaScript获得时间戳的方法有五种,后四种都是通过实例化时间对象new Date() 来进一步获取 ...

  4. 【Day.js】一个轻量2KB的处理时间和日期的JavaScript 库,常用API记录与分享

    关于时间的操作,一直在使用momentjs这个库.方便灵巧,功能强大.唯一的缺点:包大小为200K.精简的方案:如dayjs和miment. dayjs本身就是对标momentjs进行开发的: Day ...

  5. javascript模块_JavaScript模块第2部分:模块捆绑

    javascript模块 by Preethi Kasireddy 通过Preethi Kasireddy JavaScript模块第2部分:模块捆绑 (JavaScript Modules Part ...

  6. js的时间 java怎么处理,JS实现处理时间,年月日,星期的公共方法示例

    本文实例讲述了JS实现处理时间,年月日,星期的公共方法.分享给大家供大家参考,具体如下: 在项目中用到的,用js 来得到年月日,星期,当前多少个周的函数,备忘在这里,以后参考. Date.protot ...

  7. 5、JavaScript进阶篇②——函数、事件、内置对象

    一.函数 1. 什么是函数 函数的作用,可以写一次代码,然后反复地重用这个代码. 如:我们要完成多组数和的功能. var sum; sum = 3+2; alert(sum);sum=7+8 ; al ...

  8. [译] Vue.js 优雅地集成第三方 JavaScript

    原文地址:Sliding In And Out Of Vue.js 原文作者:Kevin Ball 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:Luca ...

  9. 第一百零四节,JavaScript时间与日期

    JavaScript时间与日期 学习要点: 1.Date类型 2.通用的方法 3.格式化方法 4.组件方法 ECMAScript提供了Date类型来处理时间和日期.Date类型内置一系列获取和设置日期 ...

最新文章

  1. 2018/5/1 ----1986年图灵奖PPT
  2. 计算机网络环境及应用系统的安装与调试(Computer network environment and application system installation and debugging)
  3. SQL语句的解释计划
  4. [UE4]虚幻引擎的C++环境安装
  5. 需求 录入多个班级的同学成绩并分别得出平均分
  6. Python使用turtle绘制函数y=9-x^2的图像
  7. 【MySQL】浅谈一致性读
  8. 【codevs1052】地鼠游戏
  9. switchhost使用记录
  10. 加法器与数据选择器(数电实验报告)
  11. Python AutoCAD 文件
  12. C++线索二叉树(中序线索二叉树及遍历)
  13. JavaWeb课堂笔记
  14. 吊打天猫精灵等“本土”智能音箱,HomePod做得到吗?...
  15. 100的阶层真的算不出来吗?
  16. Delphi/VisualJ++/.NET/C#之父-Anders Hejlsberg
  17. Oralce 异常问题排查sql
  18. Kubernetes中Sidecar生命周期管理
  19. macbook移动文件
  20. CentOS 恢复 rm -rf * 误删数据--extundelete

热门文章

  1. Ubuntu下安装LXR
  2. 最热开源静态网站生成器 TOP 20
  3. Nginx访问403异常问题处理
  4. Linux上开启TUN
  5. Java JDK安装和配置
  6. 如何安装使用MinDoc搭建个人在线wiki文档
  7. java 递归 求一个数的阶乘
  8. C#LeetCode刷题之#541-反转字符串 II(Reverse String II)
  9. C#LeetCode刷题之#383-赎金信(Ransom Note)
  10. 地表最强mysql命令行连接工具mycli