Javascript处理时间
一、区分几个时间相关的概念
- 标准时间:GMT即「格林威治标准时间」(Greenwich Mean Time,简称G.M.T.),由于地球的不规则自转,导致GMT时间有误差,因此目前已不被当作标准时间使用。
- UTC:UTC是最主要的世界时间标准。当前时区比 UTC 早8个小时。
- 时间表示形式:时间字符串/时间秒数(毫秒数)/UTC时间
- Unix时间戳:前时间到1970年1月1日00:00:00 UTC对应的秒数
- JS中的时间戳:当前时间到1970年1月1日00:00:00 UTC对应的毫秒数
详细的基本概念参考:阮一峰老师—Date对象
二、Moment.js
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
- 安装:
npm install moment
- 使用:可以挂到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处理时间相关推荐
- Google Chrome 工程师:JavaScript 不容错过的八大优化建议
[摘要]本文为 Google Chrome 团队的开发项目工程师 Addy Osmani 在PerfMatters 2019 网页性能大会发表的"JavaScript性能优化"(h ...
- 使用 JavaScript 的代价!(2018 版)
(点击上方公众号,可快速关注) 英文:Addy Osmani 译文:开源中国 www.oschina.net/translate/the-cost-of-javascript-in-2018 建立交 ...
- 5种获取JavaScript时间戳函数的方法
来源 | https://www.fly63.com/ 一.JavasCRIPT时间转时间戳 JavaScript获得时间戳的方法有五种,后四种都是通过实例化时间对象new Date() 来进一步获取 ...
- 【Day.js】一个轻量2KB的处理时间和日期的JavaScript 库,常用API记录与分享
关于时间的操作,一直在使用momentjs这个库.方便灵巧,功能强大.唯一的缺点:包大小为200K.精简的方案:如dayjs和miment. dayjs本身就是对标momentjs进行开发的: Day ...
- javascript模块_JavaScript模块第2部分:模块捆绑
javascript模块 by Preethi Kasireddy 通过Preethi Kasireddy JavaScript模块第2部分:模块捆绑 (JavaScript Modules Part ...
- js的时间 java怎么处理,JS实现处理时间,年月日,星期的公共方法示例
本文实例讲述了JS实现处理时间,年月日,星期的公共方法.分享给大家供大家参考,具体如下: 在项目中用到的,用js 来得到年月日,星期,当前多少个周的函数,备忘在这里,以后参考. Date.protot ...
- 5、JavaScript进阶篇②——函数、事件、内置对象
一.函数 1. 什么是函数 函数的作用,可以写一次代码,然后反复地重用这个代码. 如:我们要完成多组数和的功能. var sum; sum = 3+2; alert(sum);sum=7+8 ; al ...
- [译] Vue.js 优雅地集成第三方 JavaScript
原文地址:Sliding In And Out Of Vue.js 原文作者:Kevin Ball 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:Luca ...
- 第一百零四节,JavaScript时间与日期
JavaScript时间与日期 学习要点: 1.Date类型 2.通用的方法 3.格式化方法 4.组件方法 ECMAScript提供了Date类型来处理时间和日期.Date类型内置一系列获取和设置日期 ...
最新文章
- 2018/5/1 ----1986年图灵奖PPT
- 计算机网络环境及应用系统的安装与调试(Computer network environment and application system installation and debugging)
- SQL语句的解释计划
- [UE4]虚幻引擎的C++环境安装
- 需求 录入多个班级的同学成绩并分别得出平均分
- Python使用turtle绘制函数y=9-x^2的图像
- 【MySQL】浅谈一致性读
- 【codevs1052】地鼠游戏
- switchhost使用记录
- 加法器与数据选择器(数电实验报告)
- Python AutoCAD 文件
- C++线索二叉树(中序线索二叉树及遍历)
- JavaWeb课堂笔记
- 吊打天猫精灵等“本土”智能音箱,HomePod做得到吗?...
- 100的阶层真的算不出来吗?
- Delphi/VisualJ++/.NET/C#之父-Anders Hejlsberg
- Oralce 异常问题排查sql
- Kubernetes中Sidecar生命周期管理
- macbook移动文件
- CentOS 恢复 rm -rf * 误删数据--extundelete