网站首页 > 博客文章 正文
为什么要讲一下这个问题呢?
很多时候在项目的开发中或许没有接触过多时区,项目大多是部署国内,同时仅仅为国内用户提供服务,一旦当用户到国外后,项目中的很多时间都变得与当地时间不一样,对用户非常不友好。例如近几年非常火的线上教育,像一些外籍老师,教小朋友学英文,如何保证双方在特定的时间都进入教室,变得非常常见。
对于多时区用户提供服务,业界如何处理时间呢?
在讲述业界的处理之前,我们先来了解几个概念。
时间戳,是指格林尼治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数,用有符号32位整数表示。
GMT:Greenwich Mean Time 格林尼治标准时间。这是以英国格林尼治天文台观测结果得出的时间,这是英国格林尼治当地时间,这个地方的当地时间过去被当成世界标准的时间。
UT:Universal Time 世界时。根据原子钟计算出来的时间。
UTC:Coordinated Universal Time 协调世界时。因为地球自转越来越慢,每年都会比前一年多出零点几秒,每隔几年协调世界时组织都会给世界时+1秒(会出现闰秒即61s,一般不处理),让基于原子钟的世界时和基于天文学(人类感知)的格林尼治标准时间相差不至于太大。并将得到的时间称为UTC,这是现在使用的世界标准时间。
GMT和UTC维度不一样,但值是一样的,UTC = GTM+0(时区)
我们都知道时间都可以用GMT或者UTC来表示,而时间戳由于是基于格林尼治的特定时间,在地球上过1秒,在全球任何一个地方都是1秒,因此同一时刻,全球的值是一样的。
可以看看java示例,发现不同时区时间戳确实是相等的
// 获得不同时区的时间,来计算时间戳
LocalDateTime localDateTime = LocalDateTime.now();
OffsetDateTime offsetDateTime7 = OffsetDateTime.of(localDateTime.minusHours(1), ZoneOffset.ofHours(7));
OffsetDateTime offsetDateTime8 = OffsetDateTime.of(localDateTime, ZoneOffset.ofHours(8));
System.out.println(offsetDateTime7.toEpochSecond() == offsetDateTime8.toEpochSecond()); // true
因此,业界对于时区的处理基本都是基于时间戳。
前后端配合以保证用户看到的都是本地时间
针对此类问题,对于后端需要注意的是服务器是否会部署到不同时区,建议获取系统时间的操作,改成获取统一一个时区的时间,再将其转成时间戳进行存储;而前端最主要的则是在请求中传入时区到后端,一般可以在请求头中添加获取到的系统的时区,将时区传入到后端。后端根据时区,如+8,则将数据库中的时间戳,转成对应时区的时间。如下图
最后,推荐使用java8时间类去处理,java8中核心的类就几种:
ZoneId、ZoneOffset主要表示时区和偏移
Instant 表示时间戳,Duration、Period 表示时间差,前者表示时间差,后者表示日期差
LocalDate、LocalTime、LocalDateTime表示日期、时间、日期+时间
ZonedDateTime、OffsetDateTime含时区信息的时间
猜你喜欢
- 2024-12-02 PHP时间戳的秘密--关于PHP时间戳函数各种使用方法
- 2024-12-02 MySQL 中时间函数详解,及加减计算总结和使用!
- 2024-12-02 SQLServer时间戳的误解,与时间没有关系
- 2024-12-02 一种整车域控制器片内及片外时间同步方法
- 2024-12-02 时间戳服务怎么收费?可信时间戳一年多少钱?
- 2024-12-02 PTP时间同步的具体原理
- 2024-12-02 特斯拉UWB数字钥匙,是怎么一步步被黑的
- 2024-12-02 java的时间戳的长度为什么是固定的?它是如何做到的
- 2024-12-02 「技术分享」利用卫星校准系统时间
- 2024-12-02 运用在电子合同中的可信时间戳是什么?
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)