时间类型

简介

获取时间对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var date = new Date(); //获取一个时间对象
var date = new Date([时间戳]); //获取一个时间对象
/**
1. 下面是获取时间日期的方法,需要什么样的格式自己拼接起来就好了
2. 更多好用的方法可以在这查到 -> http://www.w3school.com.cn/jsref/jsref_obj_date.asp
*/
date.getFullYear(); // 获取完整的年份(4位,1970)
date.getMonth(); // 获取月份(0-11,0代表1月,用的时候记得加上1)
date.getDate(); // 获取日(1-31)
date.getTime(); // 获取时间(从1970.1.1开始的毫秒数)
date.getHours(); // 获取小时数(0-23)
date.getMinutes(); // 获取分钟数(0-59)
date.getSeconds(); // 获取秒数(0-59)

// 比如需要这样的格式 yyyy-MM-dd hh:mm:ss
var date = new Date(1398250549490);
Y = date.getFullYear() + '-';
M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-';
D = date.getDate() + ' ';
h = date.getHours() + ':';
m = date.getMinutes() + ':';
s = date.getSeconds();
console.log(Y+M+D+h+m+s); //
// 输出结果:2014-04-23 18:55:49

日期转换成时间戳

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var strtime = '2014-04-23 18:55:49:123';
var date = new Date(strtime);
//传入一个时间格式,如果不传入就是获取现在的时间了,这样做不兼容火狐。
// 可以这样做
var date = new Date(strtime.replace(/-/g, '/'));

// 有三种方式获取,在后面会讲到三种方式的区别
time1 = date.getTime();
time2 = date.valueOf();
time3 = Date.parse(date);

/*
三种获取的区别:
第一、第二种:会精确到毫秒
第三种:只能精确到秒,毫秒将用0来代替
比如上面代码输出的结果(一眼就能看出区别):
1398250549123
1398250549123
1398250549000
*/

Date参数形式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
new Date("month dd,yyyy hh:mm:ss");
new Date("month dd,yyyy");
new Date("yyyy/MM/dd hh:mm:ss");
new Date("yyyy/MM/dd");
new Date(yyyy,mth,dd,hh,mm,ss);
new Date(yyyy,mth,dd);
new Date(ms);

//Example:
new Date("September 16,2016 14:15:05");
new Date("September 16,2016");
new Date("2016/09/16 14:15:05");
new Date("2016/09/16");
new Date(2016,8,16,14,15,5); // 月份从0~11
new Date(2016,8,16);
new Date(1474006780);

服务器端new Date()以及moment的使用

标准时间:
https://time.is/

1
2019-06-16T00:32:50.000Z  //服务器获取到的是utc时间

一般时间处理用,Moment.js
http://momentjs.cn/

时区处理用moment-timezone
http://momentjs.cn/timezone/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
console.log(moment().format("YYYY-MM-DD HH:mm:ss")); //当前时间 

console.log(moment().subtract(10, "days").format("YYYY-MM-DD")); //当前时间的前10天时间
console.log(moment().subtract(1, "years").format("YYYY-MM-DD")); //当前时间的前1年时间
console.log(moment().subtract(3, "months").format("YYYY-MM-DD")); //当前时间的前3个月时间
console.log(moment().subtract(1, "weeks").format("YYYY-MM-DD")); //当前时间的前一个星期时间

console.log(moment().add(10, "days").format("YYYY-MM-DD")); //当前时间的后10天时间
console.log(moment().add(1, "years").format("YYYY-MM-DD")); //当前时间的后1年时间
console.log(moment().add(3, "months").format("YYYY-MM-DD")); //当前时间的后3个月时间
console.log(moment().add(1, "weeks").format("YYYY-MM-DD")); //当前时间的后一个星期时间

console.log(moment().add(-1,'week').isoWeekday(1).format('YYYY-MM-DD')); //ISO标准:当前时间的前一个星期的周一日期
console.log(moment().add(-1,'week').isoWeekday(7).format('YYYY-MM-DD')); //ISO标准:当前时间的前一个星期的周日日期

console.log(moment().subtract(1,'week').isoWeekday(1).format('YYYY-MM-DD')); //ISO标准:当前时间的前一个星期的周一日期
console.log(moment().subtract(1,'week').isoWeekday(7).format('YYYY-MM-DD')); //ISO标准:当前时间的前一个星期的周日日期

console.log(moment().add(-1,'week').startOf('isoWeek').format('YYYY-MM-DD')); //ISO标准:当前时间的前一个星期的周一日期
console.log(moment().add(-1,'week').endOf('isoWeek').format('YYYY-MM-DD')); //ISO标准:当前时间的前一个星期的周日日期

console.log(moment().subtract(1,'week').startOf('isoWeek').format('YYYY-MM-DD')); //ISO标准:当前时间的前一个星期的周一日期
console.log(moment().subtract(1,'week').endOf('isoWeek').format('YYYY-MM-DD')); //ISO标准:当前时间的前一个星期的周日日期
//注:星期获取时有两种格式,一种为ISO标准的,即周日为一周的最后一天,非ISO标准的周日为一周的第一天,具体请参考ISO-8601标准

console.log(moment().add(-1,'month').startOf('month').format('YYYY-MM-DD')); //当前时间的上个月的第一天的日期
console.log(moment().add(-1,'month').endOf('month').format('YYYY-MM-DD')); //当前时间的上个月的最后一天的日期

console.log(moment().subtract(1,'month').startOf('month').format('YYYY-MM-DD')); //当前时间的上个月的第一天的日期
console.log(moment().subtract(1,'month').endOf('month').format('YYYY-MM-DD')); //当前时间的上个月的最后一天的日期


console.log(moment().subtract(1,'week').startOf('isoWeek').unix()); //ISO标准:当前时间的前一个星期的周一的Unix时间戳
console.log(moment().subtract(1,'week').endOf('isoWeek').unix()); //ISO标准:当前时间的前一个星期的周日Unix时间戳

console.log(moment().subtract(1,'month').startOf('month').unix()); //当前时间的上个月的第一天的Unix时间戳
console.log(moment().subtract(1,'month').endOf('month').unix()); //当前时间的上个月的最后一天的Unix时间戳

数据库存储

一般数据库存储都是用datetime格式,不推荐int格式和string格式,以及timestamp.
timestamp时间戳格式范围是1970-01-01 00:00:00到2037年,也就是说2038年时间戳将重置.

将UTC时间(2018-07-03T10:18:58.000Z)转换为北京时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
let time = '2018-07-03T10:18:58.000Z';
function formatUTC(utc_datetime) {
// 转为正常的时间格式 年-月-日 时:分:秒
var T_pos = utc_datetime.indexOf('T');
var Z_pos = utc_datetime.indexOf('Z');
var year_month_day = utc_datetime.substr(0,T_pos);
var hour_minute_second = utc_datetime.substr(T_pos+1,Z_pos-T_pos-1);
var new_datetime = year_month_day+" "+hour_minute_second; // 2017-03-31 08:02:06

// 处理成为时间戳
timestamp = new Date(Date.parse(new_datetime));
timestamp = timestamp.getTime();
timestamp = timestamp/1000;

// 增加8个小时,北京时间比utc时间多八个时区
var timestamp = timestamp+8*60*60;

// 时间戳转为时间
var beijing_datetime = new Date(parseInt(timestamp) * 1000).toLocaleString().replace(/年|月/g, "-").replace(/日/g, " ");
return beijing_datetime;
}
formatUTC(time); // 2018/7/3 下午6:18:58

一些项目经历

在做项目时候遇到一个问题就是:
不同的环境下(系统下)同样的mysql datetime格式时间格式取出来一个得到的是2019-07-08T03:38:27.000Z(字符串),即UTC时间
而后台传给前端的数据就变成了7/8/2019, 7:01:12 AM(字符串) (这种**的类型一看就知道很难转换)
所有代码都是相同的
判断原因:不同机器上,我猜测应该和本地的时间格式设置有关系
解决办法: 当然了 还是祭出时间大杀器momentjs
UTC转YY-MM-DD hh:mm:ss:
moment.js

1
return moment(utc_datetime).format('YYYY-MM-DD hh:mm:ss')