一文读透时区和时间戳以及基于Java的操作

重要概念

1. UTC 和 UTC+8

UTC 是世界标准时间, UTC+8 是东八区标准时间,中国就属于东八区, 也就是北京时间。
+8 就是加8个小时。 时区的划分图示如下:

也就是说:
假如现在是UTC时间是 2023-08-08 01:00:00 (2023年8月8号凌晨1点),那么北京时间现在就是 2023-08-08 09:00:00 (上午9点)。

2. 时间戳

时间戳是一个数字,以UTC 的1970年1月1日作为开始时间, 也就是0开始, 后面的时间减去这个时间得到的秒数。
比如 UTC的 1970-01-01 00:00:00 的时间戳是 0 。 一分钟后 1970-01-01 00:01:00 的时间戳是 60。

为什么以这个时间作为开始呢?
因为这是 UNIX操作系统的约定, 约定 1970年1月1日作为时间纪元的开始, 后面很多计算机相关的语言,系统等都遵循了这个约定。

获取某个时间的时间戳

	@Test
	public void Timestamp(){
		LocalDateTime dateTime = LocalDateTime.of(1970, 1, 1, 0, 0, 0);// 获取时间戳(秒数)
		long timestamp = dateTime.toEpochSecond(ZoneOffset.UTC);//设置时区后获取时间戳
		System.out.println("Timestamp: " + timestamp); //0, 时间戳开始
	}
  • LocalDateTime 是一个不带时区信息的时间
  • ZoneOffset.UTC 则代表UTC 的时区

Java还提供了一个简便的方式获取当前时间的时间戳。

System.currentTimeMillis()

获取某个时区的时间

ZonedDateTime 是一个需要指定时区的时间, 比如北京时间的1970年1月1日的上午8点,可以如下表示:

ZonedDateTime utc8DateTime= ZonedDateTime.of(1970, 1, 1, 8, 0, 0,0, ZoneId.of("UTC+8"));

因为东八区的时间比UTC标准时间快8个小时,所以上面的时间也就是时间戳的开始时间。

	@Test
	public void zoneTimeStamp(){
		ZonedDateTime utc8DateTime= ZonedDateTime.of(1970, 1, 1, 8, 0, 0,0, ZoneId.of("UTC+8"));
		long timestamp =utc8DateTime.toEpochSecond();
		System.out.println("Timestamp1: " + timestamp);  //0
	}

当然,时区时间也可以从 LocalDateTime 转换而来,比如:

		LocalDateTime lcoalDateTime = LocalDateTime.of(1970, 1, 1, 8, 0, 0);
		ZonedDateTime zonedDateTime = ZonedDateTime.of(lcoalDateTime, ZoneId.of("UTC+8"));
		timestamp =zonedDateTime.toEpochSecond();
		Assert.assertEquals(0, timestamp);

时间的格式化显示

使用 DateTimeFormatter 可以将时间显示为不同格式的字符串, 示例代码如下:

	
	@Test
	public void dateTimeformatter() {
		LocalDateTime lcoalDateTime = LocalDateTime.of(1970, 1, 1, 8, 0, 0);
		ZonedDateTime zonedDateTime = ZonedDateTime.of(lcoalDateTime, ZoneId.of("UTC+8"));
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); 
		String lcoalDateTimeStr = formatter.format(lcoalDateTime);
		Assert.assertEquals("1970-01-01 08:00:00", lcoalDateTimeStr);
		
		String zonedDateTimeStr =  formatter.format(zonedDateTime);
		Assert.assertEquals("1970-01-01 08:00:00", zonedDateTimeStr);
	}

获取当前的北京时间

通过 ZonedDateTime.now() 可以获取当前的时间:

	@Test
	public void getCurrentUtc8Time() {
        // 获取UTC+8时区
        ZoneId utc8ZoneId = ZoneId.of("UTC+8");
        // 获取当前时间
        ZonedDateTime now = ZonedDateTime.now(utc8ZoneId);
        // 格式化为字符串
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");     
        String currentTime = now.format(formatter);
        // 输出时间
        System.out.println("Current time in UTC+8: " + currentTime);
	}

如果要获取的是 UTC标准时间,则需要修改上面获取的时区即可:

ZoneId.of("UTC");

时间戳转换为时间

通过Instant 可以将一个时间戳转换为时间。

	@Test
	public void timeMillisToUtc() {
		long timeMillis = 0L;
		Instant instant = Instant.ofEpochMilli(timeMillis);
		LocalDateTime utcDateTime = LocalDateTime.ofInstant(instant, ZoneId.of("UTC"));
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
		String utcTime = utcDateTime.format(formatter);
		Assert.assertEquals("1970-01-01 00:00:00", utcTime);
	}

注意: 时间戳和时间无关

在实际的开发中, 遇到这样一种场景: 某些应用的授权 Token的有效截止时间是时间戳的格式,也就是一个长整型的数字, 有人会问: “这个是已经+8处理的时间吗?”,显然,这句话问的就很外行了。

一个时间戳对应的就是一个时间,也就是基于 UTC的开始时间的一个时间, 这个时间戳可以转换为不同时区的时间,但是时间戳本身并没有时区的差异。也就是说, 时间戳是0 , 对应的就是UTC时间的1970年1月1日的零点, 也就是1970年1月1日的上午8点。

总结

  • LocalDateTime 是一个和时区无关的时间处理类
  • ZonedDateTime 是一个和时区有关的时间处理类
  • 时间戳的开始时间是1970年1月1日的零点,也就是北京时间的上午8点。
  • 时间戳和时区无关

在线示例

  • https://github.com/osxm/java-ency/blob/master/src/main/java/com/osxm/je/topic/date/DateDemo.java


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/57980.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据库——多表操作

文章目录 前言多表关系一对一关系一对多/多对一关系多对多关系 外键约束创建外键约束插入数据删除带有外键约束的表的数据删除外键约束 多表联合查询数据准备交叉连接查询内连接查询外连接查询左外连接查询右外连接查询满外连接查询 子查询子查询关键字ALL 关键字ANY 和 SOME 关…

k8s kubeadm命令升级集群 从1.17升级到1.18

k8s kubeadm命令升级集群 从1.17升级到1.18 大纲 注意事项master节点执行升级命令master节点和node节点执行命令 注意事项 目标当前线上k8s集群版本是k8s1.17 想把k8s升级到1.18。注意k8s不能跨版本升级例如k8s1.17不能直接升级到k8s1.19,需要先升级到1.18才后向…

【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

dubbo的高可用

1、zookeeper宕机与dubbo直连 现象:zookeeper注册中心宕机,还可以消费dubbo暴露的服务。 原因: 健壮性 (1)监控中心宕掉不影响使用,只是丢失部分采样数据. (2)数据库宕掉后&#x…

springboot访问请求404的原因

是记录,可能出现错误 可能出现的原因 1.你请求的URL路径不对,比如说你请求的路径是/usr/list,GET方法,但是你UserController上面的RequestMapping是这个样子:RequestMapping(“user”),有可能哈 2.前端的请求时GET方法,后端对应的处理函数的方…

C++ 指针数组

如果一个数组的每个元素都是指针变量,这个数组就是指针数组。指针数组的每个元素都必须是同一类型的指针。 1.一维指针数组 声明一维指针数组的语法形式: 数据类型*数组名[下标表达式];下标表达式指出数组元素的个数,数据类型确定每个元素…

Kafka3.0.0版本——生产者如何提高吞吐量

目录 一、生产者提高吞吐量参数设置二、产者提高吞吐量代码示例 一、生产者提高吞吐量参数设置 batch.size:设置批次大小,默认16klinger.ms:设置等待时间,修改为5-100msbuffer.memory:设置缓冲区大小, 默认…

信号槽中的函数重载

信号槽中的函数重载 QT4的方式QT5的方式函数指针重载函数QT5信号函数重载解决方案 总结 QT4的方式 Qt4中声明槽函数必须要使用 slots 关键字, 不能省略。 信号函数: 槽函数: mainwondow: cpp文件: #include "mainwindow.h"…

快速部署外卖系统:利用现代工具简化开发流程

在竞争激烈的外卖市场中,快速部署高效稳定的外卖系统是餐饮企业成功的关键之一。本文将介绍如何利用现代工具简化外卖系统的开发流程,并附带代码示例,帮助开发者快速搭建功能完备、用户友好的外卖平台。 1. 简介 在外卖业务快速增长的背景…

使用express搭建后端服务

目录 1 创建工程目录2 初始化3 安装express依赖4 启动服务5 访问服务总结 上一篇我们利用TDesign搭建了前端服务,现在的开发讲究一个前后端分离,后端的话需要单独搭建服务。后端服务的技术栈还挺多,有java、php、python、nodejs等。在众多的技…

稍微深度踩坑haystack + whoosh + jieba

说到django的全文检索,网上基本推荐的都是 haystack whoosh jieba 的方案。 由于我的需求对搜索时间敏感度较低,但是要求不能有数据的错漏。 但是没有调试的情况下,搜索质量真的很差,搞得我都想直接用Like搜索数据库算了。 但是…

排序八卦炉之冒泡、快排

文章目录 1.冒泡排序1.1代码实现1.2复杂度 2.快速排序2.1人物及思想介绍【源于百度】2.2hoare【霍尔】版本1.初识代码2.代码分析3.思其因果 3.相关博客 1.冒泡排序 1.1代码实现 //插入排序 O(N)~O(N^2) //冒泡排序 O(N)~O(N^2) //当数据有序 二者均为O(N) //当数据接近有序或…

什么是 webpack?

Webpack 介绍 什么是 webpack? :::tip 官方描述 webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具。当 webpack 处理应用程序时,它会在内部从一个或多个入口点构建一个 依赖图(dependency graph),然后将你项目中所需的每一个…

第四章 数据库安全性

问题的提出 (1)数据库的一大特点是数据可以共享 (2)数据共享必然带来数据库的安全性问题 (3)数据库系统中的数据共享不能是无条件的共享 这就引发了数据库安全性问题 1.数据库安全性概述 数据库的安全性…

MySQL日志——查询日志

1.查询日志 show variables like %general%;修改mysql的配置文件 /etc/my.cnf文件,添加如下内容: #该选项用来开启查询日志,可选值:0或者1;0代表关闭,1代表开启 general_log1 #设置日志的文件名&#xff0…

C# Blazor 学习笔记(8):row/col布局开发

文章目录 前言相关文章代码row和col组件B_rowB_col结构 使用 前言 可能是我用的element ui和 uView这种第三方组件用的太多了。我上来就希望能使用这些组件。但是目前Blazor目前的生态其实并不完善,所以很多组件要我们自己写。 我们对组件的要求是 我们在组件化一共…

纯粹即刻,畅享音乐搜索的轻松体验

纯粹即刻,畅享音乐搜索的轻松体验 在当今快节奏的生活中,我们常常渴望一种简单而便捷的方式来探索和享受音乐。现在,你可以纯粹即刻地畅享音乐搜索的轻松体验。无论你是寻找热门歌曲还是探索不同风格的音乐,这款应用将为你带来随…

地址空间细致入微+深入了解页表

目录 地址空间保存了什么? 页表到底是怎么存储的 我们都知道,我们进程看到的空间其实是虚拟内存,真正的内存是需要页表的映射才能找到真正的物理内存,那么我我们有两个问题的引出那么进程地址空间是保存了什么呢?页表…

Maven项目解决cannot resolve plugin maven-deploy-plugin:2.7

导入maven项目后,编辑的时候提示一些插件加载失败!大概率是你的网络有问题,插件下载失败。 如下图:(网络突然好了,我想截图但是没有复现,用网上找到的截图代替,明白意思就行&#x…

一起学算法(选择排序篇)

距离上次更新已经很久了,以前都是非常认真的写笔记进行知识分享,但是带来的情况并不是很好,一度认为发博客是没有意义的,但是这几天想了很多,已经失去了当时写博客的初心了,但是我觉得应该做点有意义的事&a…