标准世界时的格式化
Java – 标准世界时(带TZ)的格式化
情景:Java 调用某某接口返回的数据中的时间格式为标准世界时间。
例如:“2021-12-16T06:07:00.0000000Z”
其中,T表示一个分隔符;Z表示了UTC时间。
拓展小知识:
UTC:协调世界时(英语:Coordinated Universal Time,法语:Temps Universel Coordonné,简称UTC)是最主要的世界时间标准,其以原子时秒长为基础
可以利用SimpleDateFormat转化为时间戳
对一开始的例子进行转化:
String dateStr = “2021-12-16T06:07:00.0000000Z”;
//后面需要多少个小数位就有多少个S,而T与Z作为固定字符就使用单引号包裹起来。
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSS’Z’");
//通过设置UTC时区,后续进行转化为时间戳的时候会自动转为本地时区。nice~
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = null;
try{
date = simpleDateFormat.parse(dateStr);
System.out.println(date); // date类型时间
System.out.println(date.getTime()); // 时间戳
}catch(ParseException e){
System.out.println("PraseeException: "+e);
}
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sf.format(date));//指定格式的时间
JavaScript – 本地时差转化
情景:JS请求后获取的数据为标准时间(没有+8的那种),但是new Date(data)之后发现时间会自动加上那个时差??太奇怪了。
前端JS代码及输出如下:
console.log("release Time : ",releaseTime);
// release Time : 2022-01-06T20:53:10.000+00:00
let d = new Date(releaseTime);
console.log("new Date : ",d);
// new Date : Fri Jan 07 2022 04:53:10 GMT+0800 (中国标准时间)
发布时间(releaseTime)后面的+00:00其实也等同于一个上面说的那个Z啦。JS的new Date会自动加上那个时差,如果不希望补上本地时差怎么办?可以利用函数getTimezoneOffset 来获取本地的时差,单位是分钟,在这里返回的是 -480 (这个负数值得揣摩)。利用时间戳 + 时差 来构造一个新的时间。
d = d.getTime() + d.getTimezoneOffset() * 60 * 1000;
// 东八区的时间戳(单位:毫秒) + (-480分钟)*(60秒/分)*(1000毫秒/秒)
d = new Date(d); //利用新的时间戳再进行构造
这种方法 实质上只是减少了原数据的时间,所以输出的话还是会说GMT+0800,但是显示的年月日已经等同于原标准世界时的数据了,这时候再进行格式化一下就OK。
let resDate = d.getFullYear() + '-' + fillTime((d.getMonth() + 1)) + '-' + fillTime(d.getDate())
let resTime = fillTime(d.getHours()) + ':' + fillTime(d.getMinutes()) + ':' + fillTime(d.getSeconds())
releaseTime = resDate + " " + resTime; // 将 发布时间 转成了一个 格式化的时间字符串 yyyy-MM-dd HH:mm:ss
//上面用到的补全函数如下:
fillTime(s) {
return s < 10 ? '0' + s : s
}