关于时间格式 GMT,UTC,CST,ISO |
您所在的位置:网站首页 › 中国时区英文 › 关于时间格式 GMT,UTC,CST,ISO |
GMT:
格林尼治所在地的标准时间 UTC:协调世界时,又称世界统一时间、世界标准时间、国际协调时间。由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC。 协调世界时是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统。中国大陆采用ISO 8601-1988的《数据元和交换格式信息交换日期和时间表示法》(GB/T 7408-1994)称之为国际协调时间,代替原来的GB/T 7408-1994;中国台湾采用CNS 7648的《资料元及交换格式–资讯交换–日期及时间的表示法》,称之为世界统一时间。 CST:CST可视为美国、澳大利亚、古巴或中国的标准时间。 CST可以为如下4个不同的时区的缩写: 美国中部时间:Central Standard Time (USA) UT-6:00 澳大利亚中部时间:Central Standard Time (Australia) UT+9:30 中国标准时间:China Standard Time UT+8:00 古巴标准时间:Cuba Standard Time UT-4:00 ISO是一种时间的表示方法
说明: gmt是前世界标准时,utc是现世界标准时。 GMT和UTC时间可以认为是一样的, 只不过utc更加精准.
nodejs 1 let d = new Date(); 2 console.log( 'default: ',d ) 3 console.log( 'toISOString: ',d.toISOString() ) 4 console.log( 'toUTCString: ',d.toUTCString() ) 5 console.log( 'toLocaleString: ',d.toLocaleString() ) 6 console.log( 'toLocaleDateString: ',d.toLocaleDateString() ) 7 console.log( 'toString: ',d.toString() ) 8 console.log( 'toTimeString: ',d.toTimeString() ) 9 console.log( 'toDateString: ',d.toDateString() ) 10 console.log( 'toJSON: ',d.toJSON() ) 11 console.log( 'toGMTString: ',d.toGMTString() )default: 2020-03-25T02:53:51.259Z toISOString: 2020-03-25T02:39:52.230ZtoUTCString: Wed, 25 Mar 2020 02:39:52 GMTtoLocaleString: 2020-3-25 10:39:52toLocaleDateString: 2020-3-25toString: Wed Mar 25 2020 10:39:52 GMT+0800 (GMT+08:00)toTimeString: 10:39:52 GMT+0800 (GMT+08:00)toDateString: Wed Mar 25 2020toJSON: 2020-03-25T02:39:52.230ZtoGMTString: Wed, 25 Mar 2020 02:39:52 GMT
mongo 默认存储时间是以UTC表示的, 当我们存储时间的时候, 当有时间字段时: createTime:{type:Date, default:Data.now}. 相当于 new Date().toISOString(). 采用ISO表示法存储在数据库中的.
我们studio 3t查数据库的时候, 发现时间少了8个小时, 其实是没有少, 把它转换成本地时间就没有问题了. 看到的时间就是符合咱们中国人的时间了
UTC+08 就是咱们中国的时间
现在看到的时间就是正确的了.
通过nodejs查询结果时候, 拿到的时间其实是时间对象d, 可以通过 d.toLocaleString d.toLocaleDateString d.toTimeString 方法显示正确 通过时间查询的时候. 可以放心的使用时间对象查询. 不要管时区问题. 如我们要查今天的时间登录的用户, new Date(new Date().setHours(0,0,0)) 表示凌晨的时间, 直接查询就OK. 有一个问题, 当我们指定一个时间字符串去创建时间对象的时候, 这个字符串默认就是UTC时间的字符串. 我们一般其实想表达的时间字符串应该是北京时间. 比如要查user表3月21号的数据: db.users.find({createTime:{$gte:new Date("2020-03-21 UTC+0800"), $lt:new Date("2020-03-22 UTC+0800")}}) 或者: db.users.find({createTime:{$gte:new Date("2020-03-21T00:00:00.000+0800"), $lt:new Date("2020-03-22T00:00:00.000+0800")}})
还有一种可能是根据某天的时间戳查询: 北京时间: 2020-03-21 00:00:00 对应时间戳:1584720000秒 new Date(1584720000000) 直接根据时间对象查询即可, 这里不用管时区问题.
注意: mongo是以UTC存储的, mongo查询管理工具, 可以设置本地时间查询, 看到时间的就是正常的. 查询的时候, 如果以时间戳查询, 则不用管时区的问题. 查询的时候, 如果以时间字符串查询, 最好指定时区, 时间字符串尾部加Z 表示UTC。 +0800表示加上8时区, 也即本地时间.
网上很多查询方式, 都是自己计算把本地时间加减8小时, 再去存储和查询, 没必要啊.
时间对象.toLocalString() 就是本地时间, 时间对象.toISOString() 就是UTC时间 new Date("2020-03-21 01:00:00 UTC+0800") 以这样的时间字符串创建对象, 然后用这个对象去操作数据库就不会有问题了. 如果加入了具体时间点, 去掉UTC+0800也可以, 默认本地时间字符串. 如果没有指定时分秒,则默认是UTC时间字符串.
=============================== 在实际中碰到的问题 因为对数据库和时区不熟悉, 让策划配的时间是 "2020-02-22T16:00:00.000Z" 这样的格式. 正确的格式应该是: "2020-02-22 16:00:00 UTC+0800" 或者 "2020-02-22 16:00:00" "2020-02-22T16:00:00.000Z" 这个时间字符串是UTC时间 但是策划把这个UTC时间当成了北京时间. 于是配置生效就有问题了 UTC+8=北京时间。 也就需要这个时间 "2020-02-22T16:00:00.000Z" 减去8小时, 才是数据库应该存储的时间. let d = new Date("2020-02-22T16:00:00.000Z"); d.setHours(d.getHours() - 8) 总结: 为了操作方便,时间字符串的格式应该写为: 2020/02/22 10:00:00 这样的格式. 年月日中间用横杠连接且没有指定时分秒则默认表示UTC时间. 可以指定UTC+0800表示时间字符串格式 时分秒后面加Z表示UTC时间, 不指定Z则表示本地时间. 为了防止出错, 建议年月日中间用斜杠‘/’连接 数据库以UTC存储, 没有任何影响.时间是不会变的, 因为是时间对象, 想以什么格式显示都OK.
|
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |