范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

到底该用GMT8还是GMT

  简介
  最近在使用date命令时,发现表示东8区(中国时区)要使用GMT-8,但在Java中却需要使用GMT+8,如下:$ TZ="GMT-8" date -d@1647658144 +"%F %T %:z" 2022-03-19 10:49:04 +08:00  # 如果用GMT+8,反而慢了16小时 $ TZ="GMT+8" date -d@1647658144 +"%F %T %:z" 2022-03-18 18:49:04 -08:00 复制代码
  而在Java中,如下:DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss XXX"); String dateStr = dtf.format(Instant.ofEpochSecond(1647658144).atZone(ZoneId.of("GMT+8"))); System.out.println(dateStr); //输出2022-03-19 10:49:04 +08:00 复制代码
  这就让人有点迷糊了,经过一段时间搜索,发现在时区表达形式上还有不少知识点呢!时区的偏移量表示法
  众所周知,为了方便各地区本地时间之间的转换,人们将全球划分为了24个时区,以格林尼治天文台(GMT)为零时区,往东西两个方向分别有12个时区,所以自然有了以GMT为前缀的时区表示法,如下:
  GMT+8表示东8区,中国就是使用这个时区,而GMT-8表示西8区,如果格林尼治天文台的本地时间是2022-03-19的0点,那么GMT+8地区的本地时间就是2022-03-19的8点,而GMT-8的本地时间就是往前8小时,即2022-03-18的16点。
  注意,上面的各地区本地时间的表述虽然不同,但它们实际是同一个时刻(绝对时间),要理解本地时间与绝对时间的区别。
  GMT+8正是Java中支持的时区表示法,那为啥Linux中却是GMT-8呢?实际上Linux中的GMT-8也可以写成Etc/GMT-8,这才是它的标准名称,如下:$ TZ="Etc/GMT-8" date -d@1647658144 -Is 2022-03-19T10:49:04+08:00 复制代码DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss XXX"); String dateStr = dtf.format(Instant.ofEpochSecond(1647658144).atZone(ZoneId.of("Etc/GMT-8"))); System.out.println(dateStr); //输出2022-03-19 10:49:04 +08:00 复制代码
  可以发现用Etc/GMT-8的话,Linux与Java的输出都是一样的了,是的,Etc/GMT-8也是一种类似GMT+8的时区表示机制,只不过它的+-号是反的。
  Ok,虽然上面的差异弄清楚了,但时区的表示形式还没有介绍完,接着往下看...
  除了GMT+8表示方式外,我们还经常会看到UTC+8这样的表示方式,这是UTC时区表示法。
  即生GMT何生UTC?这是由于GMT是以格林尼治天文台为时间基准,但地球不是完美球体且自转速度在变慢,所以地球自转速度并不均匀,这导致以格林尼治天文台为时间基准是不准的。
  为了更准确度量时间,科学家们发明了UTC时间,以铯原子跃迁次数来度量时间,比GMT时间更准确,为了保证GMT的准确性,每隔几年GMT时间会做一次调整,以与UTC时间对齐。
  因此,既然有了更准确的UTC,那么就有了以UTC为前缀的时区表示法,如中国时区可使用UTC+8。
  各时区偏移量表示法一览表,如下:
  偏移量表示法
  描述
  GMT+8
  相对GMT多8个小时
  Etc/GMT-8
  同GMT+8,+-号相反
  UTC+8
  同GMT+8
  GMT+08:00
  精确到分钟级别
  GMT+08:00:00
  精确到秒级别
  GMT+0800
  精确到分钟级别,省略冒号
  GMT+080000
  精确到秒级别,省略冒号
  +08:00
  精确到分钟级别,省略前缀
  +08:00:00
  精确到秒级别,省略前缀
  +0800
  精确到分钟级别,省略前缀与冒号
  +080000
  精确到秒级别,省略前缀与冒号
  Z
  表示零时区,等同于GMT、UTC、GMT+0、UTC+0时区的区域表示法
  除了用偏移量来表示时区,为了方便,人们还按区域/城市的方式来定义时区,如Asia/Shanghai,Asia/Hong_Kong都表示东8区,具体有哪些城市命名的时区,可以在时区数据库中查看。
  另外,为了简化区域时区表示法,又定义了一套时区缩写,如CST是中国时区China Standard Time的缩写,可以在时区缩写中查看各种缩写定义。
  注意,一般都不建议使用时区缩写,因为时区缩写的命名经常会重复,比如CST是Central Standard Time(北美中部标准时间UTC -6)、China Standard Time(中国标准时间UTC +8)、Cuba Standard Time(古巴标准时间UTC -5)。
  由于不同软件对CST的解释可能不同,导致会出现时间相差13或14个小时的情况,这在Java搭配MySQL时经常出现,我还专门写了一篇文章mysql的timestamp会存在时区问题?,对于一定要使用时区缩写的场景,可以使用香港时区缩写HKT,它不重复且和上海处于同一个时区。
  区域表示法
  描述
  Asia/Shanghai
  上海时区,即东8区
  CST
  时区缩写,慎用Java中表示时区
  在Java中和时区相关的类有TimeZone、ZoneId,其中TimeZone是老的时区类,而ZoneId是新的时区类,它有ZoneOffset和ZoneRegion两个子类,分别代表偏移量表示法和区域表示法。
  那它们都支持上述的哪些时区写法呢?写个Demo验证一下,如下:public static void main(String[] args) { 	printZoneId("+08:00"); 	printZoneId("+0800"); 	printZoneId("GMT+8"); 	printZoneId("Etc/GMT-8"); 	printZoneId("UTC+8"); 	printZoneId("Asia/Shanghai"); 	printZoneId("CST"); 	printZoneId("Z"); }  public static void printZoneId(String zone){ 	ZoneId zoneId; 	if(!ZoneId.SHORT_IDS.containsKey(zone)){ 		zoneId = ZoneId.of(zone); 	}else{ 		zoneId = ZoneId.of(ZoneId.SHORT_IDS.get(zone)); 	} 	TimeZone timeZone = TimeZone.getTimeZone(zone); 	ZoneOffset zoneOffset = zoneId.getRules().getOffset(Instant.now()); 	DateTimeFormatter dtf = DateTimeFormatter.ofPattern("xxx ZZZ O OOOO"); 	System.out.printf("%-14s -> %-28s -> class:%s -> TimeZone.offset:%d  ", zone, dtf.format(zoneOffset), 			zoneId.getClass().getSimpleName(), timeZone.getRawOffset()); } 复制代码
  输出如下:+08:00         -> +08:00 +0800 GMT+8 GMT+08:00 -> class:ZoneOffset -> TimeZone.offset:0  +0800          -> +08:00 +0800 GMT+8 GMT+08:00 -> class:ZoneOffset -> TimeZone.offset:0  GMT+8          -> +08:00 +0800 GMT+8 GMT+08:00 -> class:ZoneRegion -> TimeZone.offset:28800000  Etc/GMT-8      -> +08:00 +0800 GMT+8 GMT+08:00 -> class:ZoneRegion -> TimeZone.offset:28800000  UTC+8          -> +08:00 +0800 GMT+8 GMT+08:00 -> class:ZoneRegion -> TimeZone.offset:0  Asia/Shanghai  -> +08:00 +0800 GMT+8 GMT+08:00 -> class:ZoneRegion -> TimeZone.offset:28800000  CST            -> -05:00 -0500 GMT-5 GMT-05:00 -> class:ZoneRegion -> TimeZone.offset:-21600000  Z              -> +00:00 +0000 GMT GMT         -> class:ZoneOffset -> TimeZone.offset:0  复制代码
  时区写法
  ZoneId
  TimeZone
  +08:00
  支持
  不支持
  +0800
  支持
  不支持
  GMT+8
  支持
  支持
  Etc/GMT-8
  支持
  支持
  UTC+8
  支持
  不支持
  Asia/Shanghai
  支持
  支持
  CST
  支持,代表北美西部时间,非中国标准时间
  支持,代表北美西部时间,非中国标准时间
  Z
  支持
  支持偏移量表示法与区域表示法区别
  虽然偏移量表示法与区域表示法都可以表示时区,但由于夏令时的存在,它们并不完全等同。
  夏令时(Daylight Saving Time: DST),也叫 夏时制,是指为了节约能源,在天亮的早的夏季,人为将时间调快一小时,以充分利用光照资源,节约照明用电。
  而中国在 1986 年至 1991 年也实行过夏令时,在1986~1991的每年从四月中旬第一个星期日的凌晨2时整(北京时间),将时钟拨快一小时,即将表针由2时拨至3时,夏令时开始;到九月中旬第一个星期日的凌晨2时整(北京夏令时),再将时钟拨回一小时,即将表针由2时拨至1时,夏令时结束。从1986年到1991年的六个年度,除1986年因是实行夏时制的第一年,从5月4日开始到9月14日结束外,其它年份均按规定的时段施行。
  故会有下面看起来有点奇怪的现象:DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss VV"); Instant instant = Instant.ofEpochSecond(515527200); System.out.println(dtf.format(instant.atZone(ZoneId.of("Asia/Shanghai")))); //输出1986-05-04 03:00:00 Asia/Shanghai System.out.println(dtf.format(instant.atZone(ZoneId.of("GMT+8")))); //输出1986-05-04 02:00:00 GMT+08:00 复制代码
  为什么Asia/Shanghai输出为3点,而GMT+8输出为2点呢?原因是1986-05-04 02:00:00这个时间点中国正开始实行夏令时,时钟拨快了1小时。
  而GMT+8为什么输出为2点呢?因为中国、马来西亚、菲律宾、新加坡的时区都是GMT+8,只有中国在实行夏令时,而在GMT+8中没法感知到区域信息,那java只能以没有实行夏令时的方法来计算本地时间了。夏令时导致的奇怪现象
  正是由于夏令时的存在,导致程序可能出现诡异的现象甚至bug,如下:由于夏令时会将2点改成3点,导致2点没了,所以date命令报错了$ TZ="Asia/Shanghai" date -d 1986-05-04T02:00:00 +%s date: invalid date ‘1986-05-04T02:00:00’  $ TZ="Asia/Shanghai" date -d 1986-05-04T03:00:00 +%s 515527200 复制代码时间解析后再格式化输出,发现不一样了DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss VV"); ZonedDateTime time1 = ZonedDateTime.parse("1986-05-04 02:00:00 Asia/Shanghai", dtf); System.out.println(time1.format(dtf)); //输出1986-05-04 03:00:00 Asia/Shanghai 复制代码时间加1小时,发现加了2小时或根本没变public static void main(String[] args) { 	DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss VV"); 	//加1小时刚好夏令时开始 	ZonedDateTime time1 = ZonedDateTime.parse("1986-05-04 01:00:00 Asia/Shanghai", dtf); 	printZonedDateTime(time1); 	printZonedDateTime(time1.plusHours(1)); 	 	//加1小时刚好夏令时结束 	ZonedDateTime time2 = ZonedDateTime.parse("1986-09-14 01:00:00 Asia/Shanghai", dtf); 	printZonedDateTime(time2);   			 	printZonedDateTime(time2.plusHours(1));    }  private static void printZonedDateTime(ZonedDateTime time){ 	DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss VV"); 	System.out.println(time.format(dtf)); } 复制代码
  输出如下:1986-05-04 01:00:00 Asia/Shanghai 1986-05-04 03:00:00 Asia/Shanghai  //加1小时,结果看起来加了2个小时 1986-09-14 01:00:00 Asia/Shanghai 1986-09-14 01:00:00 Asia/Shanghai  //加1小时,结果时间看起来没变 复制代码
  为啥会这样呢?原因是本地时间虽然看起来没变,但Asia/Shanghai这个代表的时区却发生了变化。
  我们可以将上面printZonedDateTime中时间格式由yyyy-MM-dd HH:mm:ss VV修改为yyyy-MM-dd HH:mm:ss VV xxx再执行,发现输出如下:1986-05-04 01:00:00 Asia/Shanghai +08:00 1986-05-04 03:00:00 Asia/Shanghai +09:00 1986-09-14 01:00:00 Asia/Shanghai +09:00 1986-09-14 01:00:00 Asia/Shanghai +08:00 复制代码
  如上,夏令时导致Asia/Shanghai这个时区不一定是东8区了,也可能是东9区,故Java中,想将ZoneRegion转换为ZoneOffset,需要传递一个instant时刻参数,如下://输出+08:00 Instant instant = Instant.now(); System.out.println(ZoneId.of("Asia/Shanghai").getRules().getOffset(instant)); //输出+09:00,在1986-05-04 02:00:00 +08:00处于夏令时,增加了1小时 Instant instant = Instant.ofEpochSecond(515527200); System.out.println(ZoneId.of("Asia/Shanghai").getRules().getOffset(instant)); 复制代码
  夏令时真是一种自欺欺人的做法,还好中国从1991年后就没再实行了!
  作者:打码日记
  链接:https://juejin.cn/post/7076729170205605918

东数西算开启算力经济时代的世纪工程张云泉日前,国家发展改革委中央网信办等4部门联合印发通知,同意在京津冀长三角粤港澳大湾区成渝内蒙古贵州甘肃宁夏等8地启动建设国家算力枢纽节点,并规划了10个国家数据中心集群。至此,字节跳动员工基本年薪曝光最高254万元TikTok已成为美国科技和媒体求职者心目中理想的雇主。商业内幕杂志分析了美国工作签证数据,以衡量TikTok和母公司字节跳动的薪资水平。数据显示,TikTok和字节跳动向持有美国四新零售赚的不是产品差价产品优势很短暂,替代品也层出不穷,竞争更会把差价打为零,赚差价的生意很难持续,新零售赚的什么钱?供应链收益,通俗讲就是资金池利润,有了资金池做生意不差钱,有利润生意就能持续,如何能当下钱不值钱,为什么还越来越难挣了?前几天这条信息炸锅了,网传阿里和腾讯预计裁员1030。不少人开始感慨大企业员工都面临失去工作的风险,普通人呢,日子更不好过了。这一对比,就让人有些恐慌的情绪。隔壁家老太太的儿子儿媳标称续航450公里,充完电屏显续航279公里,新能源车这样缩水合理吗半岛全媒体记者毛梓权当前油价蹦高,市民张先生花费172800元全款购买了一辆新能源车。没想到,先是挂牌遭遇小插曲,首次挂牌失败,后来经过协调才挂上。最糟心的是发现厂家标称续航450不仅与蜡笔小新联名,还有408km续航能力,YOUNG光小星实力行吗?太平洋汽车网评测频道目前国内新能源汽车市场表现如何呢?在过去的2021年中国新能汽车销量达到290万台,相比2020的销量增长了160,另外新能源汽车的市场渗透率在2021年提升到中国手机在俄热销库存售罄供应紧缺价格或持续增长俄罗斯生意人报近日报道称,据俄罗斯移动通信系统公司(MTS)统计,俄市场上的中国品牌智能手机销量在3月初增长了一倍。这些品牌包括华为荣耀OPPOvivo和realme。小米手机自2比亚迪王传福未来新能源车对燃油车的替代会更快每经记者李硕每经编辑裴健如去年新能源车渗透率的快速增长与3年前不一样,当时网约车出租车占比很大,但去年私家车占比达到88,是普通消费者在用实际行动支持购买新能源汽车。3月26日,比比特币正在向世人证明着自己现在欧美一手制裁俄罗斯,另一手开始对加密货币强监管,因为加密货币的匿名性,可以让俄罗斯轻松的绕过欧美SWIFT系统的制裁,昨天俄罗斯考虑接受比特币支付能源的新闻,连央视财经也进行了vivo布局大屏高端商务旗舰,7英寸vivoXNote被提前曝光暖春将至,vivo攻势全开,以X系列为主力的新机纷纷出列。目前已知新机包含vivoX80系列vivoXNote以及vivoXFold,三款机型定位分明,看得出vivo正在执行一场能5G物联网加持,联想智慧服务助力打造北京新型数字乡镇新京报贝壳财经讯(记者许诺)3月25日,新京报贝壳财经记者从联想集团方面获悉,联想集团已于日前与北京市门头沟区妙峰山镇签订科技产业乡村振兴战略合作框架协议。根据该合作框架,联想集团
为什么愿意戴眼镜却不愿意佩戴助听器?为什么助听器眼镜?在工作中,我们经常把助听器与眼镜进行比较。毕竟,它们都是戴在我们的头上,都可以弥补感官损失,改善通向大脑的信号。虽然这种比较有助于消除人们对助听器的顾虑(例如,眼佳能1dx和5d4价差不多,哪个拍照更好?该如何选择?第一张为5D3十2470,第二张为1D十70200,两张的画质无啥区别,难分百仲。只有在专业测试仪去测试其优劣。看大家好多人都在说,要像素高就选5D4,速度快就选1DX,我两台机器为了规避制裁,华为和诺基亚合资生产的手机N8你会买么?mate系列和Nova系列有望以TDTech重生。希望麒麟芯片也一起复活。内什么,鼎桥N8是华为和西门子合作的产物,和诺基亚么撒关系狗头已经哦豁了,也不知道这些花粉菊系kol是怎么12月17日股市内参一投资资讯12021创新数据基础设施论坛下周召开领航海量数据时代据华为官网消息,由央视新闻和华为共同带来的2021创新数据基础设施论坛将于2021年12月22日线上举行,并由央视新字节跳动加速收缩撤销人才发展中心,继续精简HR团队记者柯晓斌近日,字节跳动发布内部邮件称,决定撤销人才发展中心部门。邮件内容显示,经过HR管理团队和公司管理团队多方面慎重考虑,做出以下决定整体撤销人才发展中心团队。现有团队成员优先MyBatis3。5。8发布,Java数据持久层框架MyBatis3。5。8已发布,MyBatis的前身为iBatis,是一个数据持久层(ORM)框架,它提供的持久层能力包括SQLMaps和DataAccessObjects(DAO我为什么不跑顺丰同城了第一点,顺丰骑士这软件,不给通知权限就不能抢单,这是强制性的要求,美团众包蜂鸟众包不开启通知权限却能正常接单,这就是流氓一样的存在。第二点,扣罚太狠。第三点,单价太低,蜂鸟众包和美人穷穷一时华为。志穷穷一生联想人穷穷一时(注重研发重视人才)华为。志穷穷一生(重营销投机倒把)联想这事不是司马南抽丝剥茧整理出来,我国经济落到这些靠投机倒把玩资本永不灭,企业家都去玩资本重营销,没有核心技术,轻当年因华为放弃读博的郑宝用,帮任正非盈利百亿后,为何退居二线他,曾是高考状元,靠60块钱读完大学,却因任正非的一句话,在毕业前一个月放弃学位他,以一己之力帮华为狂赚200亿,却在巅峰期退居二线,从此隐迹江湖。发生了什么?这两年,华为公司的消OPPOFindN(12GB512GB5G版)怎么样?OPPOFindNOPPOFindN(12GB512GB5G版)最新价格是8999元,想买手机不要慌,选它就够了,过去还是现在都能好用,上市时间为2022年。首先,我们关注屏幕方面小米卢伟冰等手机大佬为联发科站台!天玑9000芯片哪家首发?明年的高端旗舰手机市场必将会非常热闹,因为不仅有高通的骁龙8Gen1芯片,还有联发科的天玑9000芯片。众所周知,联发科推出天玑芯片后已彻底的翻身,但就目前天玑1200芯片的性能来