当前位置: 首页 > news >正文

LocalDateTime与时间戳

众所周知,如果想把 LocalDateTime 转为时间戳,需要先指定时区,然后才能转为时间戳,例如:

LocalDateTime localDateTime = LocalDateTime.now();  
ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault());  
long second = zonedDateTime.toEpochSecond();

但是既然 LocalDateTime(本地时间)已经确定当前时间,为什么不能直接转为时间戳?

因为时间戳指的是自 1970 年 1 月 1 日(00:00:00 UTC/GMT)以来的秒数,所以无论在哪个时区,同一时间获取的都是相同时间戳,可以用于跨时区。但是我们现实生活用到的本地时间是跟时区挂钩的,中国所在的时区是东八区,会比 UTC 时间快 8 个小时。时间戳是从 UTC 时间得来的,所以时间戳与本地时间的相互转换,需要根据时区来转换。

通过查看 LocalDateTime.now() 方法源码,也能看出会先获取系统默认时区,然后再时间戳和时区获得本地时间。

public static LocalDateTime now() {  return now(Clock.systemDefaultZone());  //先获取系统默认时区
}

Clock.systemDefaultZone() 方法一直往下走,到达获取系统默认时区的重要方法。首先获取 JVM 参数中的时区信息,如果不存在则获取操作系统的时区信息,否则默认使用 GMT。

//java.util.TimeZone#setDefaultZone
private static synchronized TimeZone setDefaultZone() {  TimeZone tz;  // get the time zone ID from the system properties  Properties props = GetPropertyAction.privilegedGetProperties();  String zoneID = props.getProperty("user.timezone");  //通过JVM属性获取// if the time zone ID is not set (yet), perform the  // platform to Java time zone ID mapping.   if (zoneID == null || zoneID.isEmpty()) {  String javaHome = StaticProperty.javaHome();  try {  zoneID = getSystemTimeZoneID(javaHome);  //获取操作系统时区if (zoneID == null) {  zoneID = GMT_ID;  //默认使用GMT}  } catch (NullPointerException e) {  zoneID = GMT_ID;  }  }  // Get the time zone for zoneID. But not fall back to  // "GMT" here.   tz = getTimeZone(zoneID, false);   //从默认的时区配置和java根目录下的/lib/tzdb.dat中根据时区id获取时区信息。if (tz == null) {  // If the given zone ID is unknown in Java, try to  // get the GMT-offset-based time zone ID,        // a.k.a. custom time zone ID (e.g., "GMT-08:00").        String gmtOffsetID = getSystemGMTOffsetID();  if (gmtOffsetID != null) {  zoneID = gmtOffsetID;  }  tz = getTimeZone(zoneID, true);  }  assert tz != null;  final String id = zoneID;  props.setProperty("user.timezone", id);  defaultTimeZone = tz;  return tz;  
}

getSystemTimeZoneID() 是一个 native 方法,根据不同操作系统,获取的方法不同。对于 window 系统,获取的是注册表里的时区信息。

//java.util.TimeZone#getSystemTimeZoneID
private static native String getSystemTimeZoneID(String javaHome);

获取到系统默认时区后,通过获取 1970 年 1 月 1 日午夜至今的秒数和时区偏移量,计算出本地时间的秒数,借此创建 LocalDateTime 实例。

//java.time.LocalDateTime#now(java.time.Clock)
public static LocalDateTime now(Clock clock) {  Objects.requireNonNull(clock, "clock");  final Instant now = clock.instant();  // called once   //获取1970 年 1 月 1 日午夜至今的秒数ZoneOffset offset = clock.getZone().getRules().getOffset(now);  //获取时区偏移量return ofEpochSecond(now.getEpochSecond(), now.getNano(), offset);  
}//java.time.LocalDateTime#ofEpochSecond
public static LocalDateTime ofEpochSecond(long epochSecond, int nanoOfSecond, ZoneOffset offset) {  Objects.requireNonNull(offset, "offset");  NANO_OF_SECOND.checkValidValue(nanoOfSecond);  long localSecond = epochSecond + offset.getTotalSeconds();  // overflow caught later  //将UTC时间下的秒数和时区偏移的秒数相加,获得本地时间的秒数long localEpochDay = Math.floorDiv(localSecond, SECONDS_PER_DAY);  //将本地时间的秒数除以每天的秒数,得到天数int secsOfDay = Math.floorMod(localSecond, SECONDS_PER_DAY);  //将本地时间的秒数对每天的秒数取余,得到一天内剩下的秒数LocalDate date = LocalDate.ofEpochDay(localEpochDay);  LocalTime time = LocalTime.ofNanoOfDay(secsOfDay * NANOS_PER_SECOND + nanoOfSecond);  return new LocalDateTime(date, time);  //通过LocalDate和LocalTime创建LocalDateTime实例
}

既然本地时间是根据 1970 年 1 月 1 日午夜至今的秒数加上时区偏移的秒数得到的,那么从 LocalDateTime 转换为时间戳也自然需要减去时区偏移的秒数。

//java.time.chrono.ChronoZonedDateTime#toEpochSecond
default long toEpochSecond() {  long epochDay = toLocalDate().toEpochDay();  long secs = epochDay * 86400 + toLocalTime().toSecondOfDay();  //获取本地时间的秒数secs -= getOffset().getTotalSeconds();  //减去时区偏移的秒数return secs;  
}

相关文章:

LocalDateTime与时间戳

众所周知,如果想把 LocalDateTime 转为时间戳,需要先指定时区,然后才能转为时间戳,例如: LocalDateTime localDateTime LocalDateTime.now(); ZonedDateTime zonedDateTime localDateTime.atZone(ZoneId.systemDe…...

【Power BI】Power BI 入门指南:版本、下载和报表创建的步骤

文章目录 一、前言二、了解 Power BI 版本三、下载 Power BI Desktop四、如何开始使用 Power BI Desktop五、在 Power BI Desktop 中创建报表六、文末总结 一、前言 Power BI 是微软于 2013 年推出的产品,为一款商业智能与数据可视化工具。它通过引人注目的视觉效果…...

代码随想录算法训练营第23期day21| 235. 二叉搜索树的最近公共祖先 、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

目录 一、(leetcode 235)二叉搜索树的最近公共祖先 二、(leetcode 701)二叉搜索树中的插入操作 三、(leetcode 450)删除二叉搜索树中的节点 一、(leetcode 235)二叉搜索树的最近公…...

小程序页面路由传参的方法?

小程序页面路由传参的方法有三种&#xff1a; 1.URL参数传递&#xff1a;通过在页面跳转的URL中携带参数实现传参。可以使用wx.navigateTo或wx.redirectTo等跳转方法&#xff0c;并在URL中添加参数。 示例&#xff1a; // PageA.wxml <button bindtap"navigateToPage…...

Ubuntu下安装Python

Ubuntu下安装Python 预备知识一、Python安装Python 二、Anaconda安装Anaconda卸载Anaconda 三、Miniconda安装Miniconda 四、异同比较 预备知识 (1) Python是一种编程语言。 (2) Anaconda是一款包管理工具&#xff0c;用来管理Python及其他语言的安装包&#xff0c;预装了很多…...

宝塔使用腾讯COS存储实现自动备份服务器网站数据图文教程

一、进入宝塔安装腾讯COS 点击设置打开后需要配置以下cos参数 二、腾讯云创建COS存储桶 选择私有读写&#xff0c;其他默认就行 三、创建访问密钥 四、配置宝塔中腾讯COS相关设置 很多人是配置错误导致无法正常链接cos region为cos存储桶所属地域 Bucker为存储桶名称 五、…...

npm命令介绍

npm 描述&#xff1a;Node Package Manager (NPM) 是 Node.js 的包管理器&#xff0c;用于安装、管理和发布 JavaScript 包。示例&#xff1a;npm -v npm access 描述&#xff1a;控制包的访问权限。需要管理员或拥有特定权限的用户才能执行。示例&#xff1a;npm access pu…...

openGauss学习笔记-100 openGauss 数据库管理-管理数据库安全-客户端接入之用SSL进行安全的TCP/IP连接

文章目录 openGauss学习笔记-100 openGauss 数据库管理-管理数据库安全-客户端接入之用SSL进行安全的TCP/IP连接100.1 背景信息100.2 前提条件100.3 注意事项100.4 操作步骤100.5 相关参考 openGauss学习笔记-100 openGauss 数据库管理-管理数据库安全-客户端接入之用SSL进行安…...

ESP8266 Node Mcu开发板连接WIFI并上报数据到MQTT服务器——物联网应用开发

一、前言 本文主要介绍关于ESP8266 Node Mcu开发板如何连接WIFI并将本地采集的数据上传到MQTT服务器中。 大家调试可以使用MQTTBox 二、WIFI连接 首先&#xff0c;导入WIFI连接所需的头文件&#xff0c;引入所需库。 #include <ESP8266WiFi.h> 声明字符串常量&#xff0…...

苍穹外卖(八) 使用WebSocket协议完成来单提醒及客户催单功能

WebSocket介绍 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信(双向传输)——浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c; 并进行双向数据传输。 HTTP协议和WebSocket协议对比&#xff1a; HTTP…...

网站如何应对网络流量攻击

网络安全问题中&#xff0c;受到流量攻击是一种常见挑战。以下是一系列的专业建议&#xff0c;帮助您预防和减轻这类攻击&#xff0c;从而确保您的网站和数据的安全。 使用 Web 应用程序防火墙 (WAF) Web 应用程序防火墙是一项专门的安全工具&#xff0c;能够检测和拦截恶意流…...

设置Json序列化时字段的顺序

1. 背景 在部分使用场景&#xff08;如元数据驱动&#xff0c;后台接口仅返回序列化后的json字符串&#xff0c;前端需要根据每个字段在前端呈现&#xff09;&#xff0c;需要手动设置字段的长度。通常情况下&#xff0c;框架是有默认的顺序&#xff0c;如 jackson 默认使用字…...

AcWing5277. 三元组

给定一个长度为 n 的正整数数组 a1,a2,…,an 请你计算&#xff0c;一共有多少个三元组 (i,j,k)&#xff08;1≤i<j<k≤n&#xff09;&#xff0c;使得 ai⋅aj⋅ak 为最小可能值。 输入格式 第一行包含整数 n。 第二行包含 n 个正整数 a1,a2,…,an。 输出格式 一个整…...

【LeetCode热题100】--121.买卖股票的最佳时机

121.买卖股票的最佳时机 class Solution {public int maxProfit(int[] prices) {int minprice Integer.MAX_VALUE;int maxprofit 0;for(int i 0;i<prices.length;i){if(prices[i] < minprice){minprice prices[i]; //找到最小值}else if(prices[i] - minprice > ma…...

高精度计算

1.高精度加法&#xff1a; 两个非常大的数相加. 代码如下&#xff1a; #include <iostream> #include <cstring> #include <algorithm> #include <vector>using namespace std;vector<int> add(vector<int>&A,vector<int>&am…...

KMP 算法 + 详细笔记

给两个字符串&#xff0c;T"AAAAAAAAB"&#xff0c;P"AAAAB"; 可以暴力匹配&#xff0c;但是太费时和效率不太好。于是KMP问世&#xff0c;我们一起来探究一下吧&#xff01;&#xff01;&#xff01; &#xff08;一&#xff09;最长公共前后缀 D[i] p[…...

基于主动移频法与AFD孤岛检测的单相并网逆变器matlab仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 仿真模型 算法介绍 (1)仿真模型由单相电网、逆变器、滤波环节、PI控制器、PWM生成器、锁相环、AFD控制器s函数、测量模块等构成&#xff1b; (2)采用主动移频法(AFD)进行孤岛检测&#xff1b; (3)相应速度…...

MIT 6.S081 Operating System/Fall 2020 macOS搭建risc-v与xv6开发调试环境

文章目录 本机配置安装环境Homebrew执行安装脚本查看安装是否成功 RISC-V tools执行brew的安装脚本 QEMUXV6 测试有用的参考链接&#xff08;感谢前辈&#xff09;写在结尾 本机配置 电脑型号&#xff1a;Apple M2 Pro 2023 操作系统&#xff1a;macOS Ventura 13.4 所以我的电…...

JMeter定时器

一. 同步定时器&#xff08;Synchronizing Timer) &#xff08;在Loadrunner中叫做集合点&#xff09; 思考&#xff1a; 如何模拟多个用户同时抢一个红包&#xff1f;如何测试电商网站中抢购活动、秒杀活动&#xff1f; 1.1 介绍 Sync Timer的目的是阻塞线程&#xff0c;直…...

zookeeper应用场景(二)

单机环境下可以利用jvm级别的锁&#xff0c;比如synchronized、Lock等来实现锁&#xff0c;如果是多机部署就需要一个共享数据存储区域来实现分布式锁 一、分布式锁实现方式 1、基于数据库实现分布式锁 可以用数据库唯一索引来实现 2、基于redis实现分布式锁 redis实现的分…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...