深入了解 Java 中的时间信息定义、转换、比较和操作
1. 简介
在过去的传统Java日期处理中,经常面临着一些问题。比如,java.util.Date和java.util.Calendar在表示日期和时间时存在着一些奇怪的行为,如月份从0开始计数、对日期进行格式化的方式繁琐不直观等。这些问题给开发带来了一定的困扰。
随着Java 8的发布,引入了全新的时间API —— java.time包,这个新的API提供了更加直观和易用的方式来处理日期和时间。它以更加语义化的方式来表示日期、时间和时间间隔,并提供了丰富的操作方法和函数,使得我们在处理日期和时间时更加方便和高效。
2. 常用时间信息定义方法
2.1.java.util.Date类的使用
在早期的 Java 中,使用java.util.Date类来表示日期和时间是很常见的。
import java.util.Date;public class DateExample {public static void main(String[] args) {Date date = new Date();System.out.println("当前日期和时间: " + date);}
}
然而,这个类在设计上存在一些问题,导致了它的使用变得麻烦和容易出错。
问题之一是java.util.Date类在表示月份时从0开始计数,这与我们通常的理解不符。例如,如果我们想表示1月份,我们需要传入0作为月份的参数,这容易引起误解和错误。
另一个问题是java.util.Date类中的很多方法已经被废弃不建议使用。例如,获取年份需要使用getYear()方法,但它返回的是相对于1900年的偏移值。此外,Date类还不是线程安全的,这意味着在多线程环境下使用时需要额外的同步措施。
下面是一个示例代码,展示了如何创建和操作java.util.Date类对象:
import java.util.Date;public class DateExample {public static void main(String[] args) {// 创建一个当前时间的 Date 对象Date currentDate = new Date();// 获取年份(需要加上1900)int year = currentDate.getYear() + 1900;// 获取月份(需要加上1)int month = currentDate.getMonth() + 1;// 获取日期int day = currentDate.getDate();// 打印日期信息System.out.println("Current Date: " + year + "-" + month + "-" + day);}
}
2.2.java.util.Calendar 类的使用
为了弥补java.util.Date类的不足,Java引入了java.util.Calendar类来处理日期和时间。Calendar类提供了一系列的方法,用于获取和修改年、月、日、时、分、秒等字段。
然而,Calendar类的使用也存在一些问题。首先,它是一个抽象类,不能直接实例化,需要通过Calendar.getInstance()方法获取其实例。其次,月份还是从0开始计数,导致与人们的理解不一致。此外,Calendar类也不是线程安全的,需要额外的同步措施。
下面是一个示例代码,展示了如何使用java.util.Calendar类来获取和修改日期信息:
import java.util.Calendar;
import java.util.Date;public class CalendarExample {public static void main(String[] args) {// 获取当前日期和时间的 Calendar 对象Calendar calendar = Calendar.getInstance();// 获取年份int year = calendar.get(Calendar.YEAR);// 获取月份(需要加上1)int month = calendar.get(Calendar.MONTH) + 1;// 获取日期int day = calendar.get(Calendar.DAY_OF_MONTH);// 打印日期信息System.out.println("Current Date: " + year + "-" + month + "-" + day);// 获取小时int hour = calendar.get(Calendar.HOUR_OF_DAY);// 获取分钟int minute = calendar.get(Calendar.MINUTE);// 获取秒int second = calendar.get(Calendar.SECOND);// 打印时间信息System.out.println("Current Time: " + hour + "-" + minute + "-" + second);// 修改月份为下个月calendar.add(Calendar.MONTH, 1);// 获取修改后的日期信息int updatedMonth = calendar.get(Calendar.MONTH) + 1;int updatedDay = calendar.get(Calendar.DAY_OF_MONTH);// 打印修改后的日期信息System.out.println("Updated Date: " + year + "-" + updatedMonth + "-" + updatedDay);}
}
2.3.新的时间 API(java.time 包)的介绍
为了解决java.util.Date和java.util.Calendar的问题,Java 8引入了新的时间 API java.time包。这个新的API为处理日期和时间提供了更直观和易用的方式。
java.time包中的核心类包括:
LocalDate:用于表示日期,不包含具体时间和时区信息;LocalTime:用于表示时间,不包含日期和时区信息;LocalDateTime:用于表示日期和时间,不包含时区信息;ZonedDateTime:用于表示带有时区的日期和时间。
下面是一个示例代码,展示了如何使用新的时间 API 来创建和操作日期和时间:
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;public class DateTimeExamples {public static void main(String[] args) {// 使用新的时间 API 创建日期对象LocalDate date = LocalDate.now();System.out.println("当前日期: " + date); // 使用新的时间 API 创建时间对象LocalTime time = LocalTime.now();System.out.println("当前时间: " + time); // 使用新的时间 API 创建日期和时间对象LocalDateTime dateTime = LocalDateTime.now();System.out.println("当前日期和时间: " + dateTime); // 使用新的时间 API 创建带时区的日期和时间对象ZonedDateTime zonedDateTime = ZonedDateTime.now();System.out.println("当前带时区的日期和时间: " + zonedDateTime);// 使用 java.sql.Date 表示日期Date sqlDate = Date.valueOf(date);System.out.println("java.sql.Date: " + sqlDate);// 使用 java.sql.Time 表示时间Time sqlTime = Time.valueOf(time);System.out.println("java.sql.Time: " + sqlTime); // 使用 java.sql.Timestamp 表示时间戳(包含日期和时间)Timestamp timestamp = Timestamp.valueOf(dateTime);System.out.println("java.sql.Timestamp: " + timestamp); // 自定义时间LocalDateTime dateTime1 = LocalDateTime.of(2023, 10, 12, 8, 0, 0);System.out.println(" 自定义LocalDateTime时间: " + dateTime1); }
}
通过新的时间 API,我们可以直接创建表示日期、时间、日期和时间以及时区的对象,并进行各种操作,如日期比较、日期加减等。这使得我们在处理日期和时间时更加直观和便利。
2.3.1.取时间
import java.time.LocalDateTime;
import java.time.Month;public class InfoExamples {public static void main(String[] args) {// 当前时间LocalDateTime now = LocalDateTime.now();// 取年份int year = now.getYear();System.out.println("年份year = " + year);// 取月份名Month month = now.getMonth();System.out.println("月份名month = " + month);// 取月份int monthValue = now.getMonthValue();System.out.println("月份monthValue = " + monthValue);// 取日期int dayOfMonth = now.getDayOfMonth();System.out.println("dayOfMonth = " + dayOfMonth);// 取 24小时制小时int hour = now.getHour();System.out.println("hour = " + hour);// 取分钟int minute = now.getMinute();System.out.println("minute = " + minute);// 取秒int second = now.getSecond();System.out.println("second = " + second);}
}
3. 时间戳的概念与使用
3.1.时间戳
时间戳是一种表示从某个特定时间起至今所经过的时间的方式。它通常以整数或浮点数的形式表示,并在不同的编程语言和数据库中具有不同的实现方式。时间戳被广泛用于记录事件的先后顺序、进行时间的比较和排序、计算时间间隔等操作。
在Java中,时间戳通常使用 java.util.Date 或 java.time.Instant 类型来表示。以下是关于时间戳概念和使用的一些重点说明:
3.1.1.java.util.Date 的时间戳
java.util.Date 类中的 getTime() 方法可以获取自1970年1月1日00:00:00 UTC(协调世界时)以来的毫秒数形式的时间戳。这个时间戳可以作为一个长整型数值进行存储或传递。下面是一个示例代码:
import java.util.Date;public class TimestampExample {public static void main(String[] args) {Date now = new Date();long timestamp = now.getTime();System.out.println("时间戳: " + timestamp);}
}
3.1.2.java.time.Instant 的时间戳
在新的时间 API(java.time 包)中,java.time.Instant 类提供了更加简洁和易用的方式来表示时间戳。我们可以使用 Instant.now() 方法获取当前时间的时间戳,并使用 toEpochMilli() 方法将其转换为毫秒数形式的时间戳。以下是一个示例代码:
import java.time.Instant;public class InstantExample {public static void main(String[] args) {Instant now = Instant.now();long timestamp = now.toEpochMilli();System.out.println("时间戳: " + timestamp);}
}
3.1.3.当前时间戳转时间类型
时间戳的使用方式:
时间戳可以用于各种操作,如时间的比较、排序、存储或传输。在进行时间比较时,可以简单地通过比较两个时间戳的数值来确定它们的先后顺序。时间戳的另一个重要用途是计算时间间隔,可以通过相减两个时间戳的数值来获取它们之间的毫秒数差值。
需要注意的是,时间戳通常是以格林尼治标准时间(GMT)或协调世界时(UTC)为基准的,因此在使用时间戳时应注意时区的转换和处理。
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;public class TimestampExample {public static void main(String[] args) {// 获取当前时间的时间戳long timestamp = System.currentTimeMillis();System.out.println("当前时间戳:" + timestamp);// 将时间戳转换为日期对象Date date = new Date(timestamp);System.out.println("时间戳转换为日期对象:" + date);// 将时间戳转换为本地日期时间对象Instant instant = Instant.ofEpochMilli(timestamp);LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());System.out.println("时间戳转换为本地日期时间对象:" + localDateTime);// 将Java 8时间类型转换为时间戳LocalDateTime localDateTime3 = LocalDateTime.now();long timestamp2 = localDateTime3.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();System.out.println("Java 8时间类型转换为时间戳:" + timestamp2);}
}
3.2.java.sql.Timestamp
java.sql.Timestamp是Java中用于表示SQL数据库中的日期和时间信息的类。它是java.util.Date的子类,并扩展了它的功能以支持更高精度的时间信息,尤其是对于代表纳秒级别精度的时间戳。
以下是一些关于java.sql.Timestamp的重要说明:
3.2.1.创建java.sql.Timestamp对象
您可以使用多种方式创建java.sql.Timestamp对象。其中最常用的方式是通过使用java.sql.Timestamp(long time)构造函数,该构造函数接受一个代表自1970年1月1日00:00:00 UTC以来的毫秒数的参数。
以下是一个示例代码,展示了如何创建一个java.sql.Timestamp对象:
import java.sql.Timestamp;public class TimestampExample {public static void main(String[] args) {long timestampInMillis = System.currentTimeMillis();Timestamp timestamp = new Timestamp(timestampInMillis);System.out.println("时间戳: " + timestamp);}
}
3.2.2.与数据库的交互
java.sql.Timestamp常被用于与数据库进行日期和时间类型的交互。当从数据库中查询到一个日期或时间字段时,可以使用java.sql.ResultSet对象的getTimestamp(int columnIndex)或getTimestamp(String columnLabel)方法获取一个java.sql.Timestamp对象。
以下是一个示例代码,展示了如何从数据库中获取一个日期时间字段的时间戳:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;public class DatabaseExample {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "password";try (Connection conn = DriverManager.getConnection(url, username, password);PreparedStatement stmt = conn.prepareStatement("SELECT datetime_column FROM mytable");ResultSet rs = stmt.executeQuery()) {if (rs.next()) {Timestamp timestamp = rs.getTimestamp("datetime_column");System.out.println("时间戳: " + timestamp);}} catch (SQLException e) {e.printStackTrace();}}
}
注意,上述代码仅是一个简化示例,实际情况下需要根据具体的数据库和表结构进行相应的操作。
java.sql.Timestamp类还提供了许多其他方法,以便灵活地处理日期和时间信息,如获取特定部分的日期或时间(年、月、日、小时等),格式化输出等。您可以参考Java官方文档以获取更详细的信息。
4.相互转换
4.1. String 类型与时间类型的相互转换
这一部分我们详细说明了如何将String类型与不同时间类型进行相互转换
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Date;public class StringConvertExample {public static void main(String[] args) {// 将字符串日期转换为java.util.DateString dateString = "2023-10-12";SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");Date date = dateFormat.parse(dateString);System.out.println("字符串转换为java.util.Date:" + date);// 将字符串日期转换为Java 8 时间类型String dateFormattedString = "2023-10-12";DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");LocalDate localDate = LocalDate.parse(dateFormattedString, formatter);System.out.println("字符串转换为Java 8 时间类型:" + localDate);}
}
4.2.时间格式化
使用java.time.format.DateTimeFormatter进行格式化,使用java.time.format.FormatStyle进行简化格式化,以及使用java.time.format.DateTimeFormatterBuilder进行自定义格式化。
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.FormatStyle;
import java.util.Date;public class FormatExample {public static void main(String[] args) {// 将java.util.Date转换为字符串日期Date date = new Date();SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");String format = dateFormat.format(date);System.out.println("java.util.Date转换为字符串:" + format);// 使用java.time.format.DateTimeFormatter进行格式化LocalDateTime dateTime = LocalDateTime.now();DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");String formattedDateTime = dateTime.format(formatter);System.out.println("格式化后的时间:" + formattedDateTime);// 使用java.time.format.FormatStyle进行格式化LocalDateTime dateTime2 = LocalDateTime.now();DateTimeFormatter formatter2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);String formattedDateTime2 = dateTime.format(formatter);System.out.println("格式化后的时间:" + formattedDateTime2);// 使用java.time.format.DateTimeFormatterBuilder进行自定义格式化LocalDateTime dateTime3 = LocalDateTime.now();DateTimeFormatter formatter3 = new DateTimeFormatterBuilder().appendPattern("yyyy年MM月dd日 HH时mm分ss秒").toFormatter();String formattedDateTime3 = dateTime3.format(formatter3);System.out.println("格式化后的时间:" + formattedDateTime3);}
}
4.3. 不同时间类型的相互转换
java.util.Date, Java 8时间类型相互转换
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;public class DateConvertExample {public static void main(String[] args) {// 将java.util.Date转换为Java 8时间类型Date date = new Date();Instant instant = date.toInstant();LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());System.out.println("java.util.Date转换为Java 8时间类型:" + localDateTime);// 将Java 8时间类型转换为java.util.DateLocalDateTime localDateTime2 = LocalDateTime.now();Instant instant2 = localDateTime.atZone(ZoneId.systemDefault()).toInstant();Date date2 = Date.from(instant);System.out.println("Java 8时间类型转换为java.util.Date:" + date2);}
}
5.Java8操作方法
5.1.时间比较和操作
时间的比较和操作,包括比较两个时间的先后顺序、计算时间差以及对时间进行增减操作。
import java.time.Duration;
import java.time.LocalDateTime;public class DateActionExample {public static void main(String[] args) {// 比较两个时间的先后顺序LocalDateTime dateTime1 = LocalDateTime.of(2023, 10, 12, 8, 0, 0);LocalDateTime dateTime2 = LocalDateTime.of(2023, 10, 12, 10, 0, 0);boolean isAfter = dateTime1.isAfter(dateTime2);System.out.println("dateTime1是否在dateTime2之后:" + isAfter);boolean isBefore = dateTime1.isBefore(dateTime2);System.out.println("dateTime1是否在dateTime2之前:" + isBefore);boolean isEqual = dateTime1.isEqual(dateTime2);System.out.println("dateTime1是否与dateTime2相等:" + isEqual);// 计算时间差LocalDateTime oldDateTime = LocalDateTime.of(2023, 10, 12, 8, 0, 0);LocalDateTime newDateTime = LocalDateTime.of(2023, 10, 12, 10, 0, 0);Duration duration = Duration.between(oldDateTime, newDateTime);long hours = duration.toHours();System.out.println("时间差(小时):" + hours);// 对时间进行增减操作LocalDateTime dateTime = LocalDateTime.of(2023, 10, 12, 8, 0, 0);LocalDateTime addedDateTime = dateTime.plusHours(2);System.out.println("增加2小时后的时间:" + addedDateTime);LocalDateTime subtractedDateTime = dateTime.minusHours(2);System.out.println("减少2小时后的时间:" + subtractedDateTime);LocalDateTime withDateTime = dateTime.withHour(2);System.out.println("设置成2点 = " + withDateTime);}
}
相关文章:
深入了解 Java 中的时间信息定义、转换、比较和操作
1. 简介 在过去的传统Java日期处理中,经常面临着一些问题。比如,java.util.Date和java.util.Calendar在表示日期和时间时存在着一些奇怪的行为,如月份从0开始计数、对日期进行格式化的方式繁琐不直观等。这些问题给开发带来了一定的困扰。 …...
2023年中国智能矿山发展历程及趋势分析:智能矿山健康有序发展[图]
智能矿山系统对矿山生产提质增效的效果已经开始显现:对不合规、有风险的行动进行及时预警,减少安全事故发生概率,避免因停产整顿产生的巨额亏损;精细化管理整个生产流程,避免过往传统粗放的流程导致的浪费,…...
acwing算法基础之基础算法--整数离散化算法
目录 1 知识点2 模板 1 知识点 整个范围很大,但存在的数据点很少。比如从 − 1 0 9 -10^9 −109到 1 0 9 10^9 109,但总共只有 1 0 6 10^6 106个数。 可以采用离散化的思想来做,即将离散的大数值映射成连续的小数值(一般是 1 , …...
基于SSM框架的安全教育平台
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…...
Kafka生产者使用案例
1.生产者发送消息的过程 首先介绍一下 Kafka 生产者发送消息的过程: 1)Kafka 会将发送消息包装为 ProducerRecord 对象, ProducerRecord 对象包含了目标主题和要发送的内容,同时还可以指定键和分区。在发送 ProducerRecord 对象前,…...
EasyX图形库实现贪吃蛇游戏
⭐大家好,我是Dark Falme Masker,学习了动画制作及键盘交互之后,我们就可以开动利用图形库写一个简单的贪吃蛇小游戏,增加学习乐趣。 ⭐专栏:EasyX部分小游戏实现详细讲解 最终效果如下 首先包含头文件 #include<stdio.h> #…...
利用 Amazon CodeWhisperer 激发孩子的编程兴趣
我是一个程序员,也是一个父亲。工作之余我会经常和儿子聊他们小学信息技术课学习的 Scratch 和 Kitten 这两款图形化的少儿编程工具。 我儿子有一次指着书房里显示器上显示的 Visual Studio Code 问我,“为什么我们上课用的开发界面,和爸爸你…...
2023年中国分子筛稀土催化材料竞争格局及行业市场规模分析[图]
稀土催化材料能够起到提高催化剂热稳定性、催化剂活性、催化剂储氧能力,以及减少贵金属活性组分用量等作用,广泛应用于石油化工、汽车尾气净化、工业废气和人居环境净化、燃料电池等领域。 2015-2023年中国稀土催化材料规模及预测 资料来源:…...
vue3插件——vue-web-screen-shot——实现页面截图功能
最近在看前同事发我的vue3框架时,发现他们有个功能是要实现页面截图功能。 vue3插件——vue-web-screen-shot——实现页面截图功能 效果图如下:1.操作步骤1.1在项目中添加vvue-web-screen-shot组件1.2在项目入口文件导入组件——main.ts1.3在需要使用的页…...
简单总结Centos7安装Tomcat10.0版本
文章目录 前言JDK8安装部署Tomcat 前言 注意jdk与tomcat的兼容问题,其他的只要正确操作一般问题不大 Tomcat 是由 Apache 开发的一个 Servlet 容器,实现了对 Servlet 和 JSP 的支持,并提供了作为Web服务器的一些特有功能,如Tomca…...
ffmpeg中AVCodecContext和AVCodec的关系分析
怎么理解AVCodecContext和AVCodec的关系 AVCodecContext和AVCodec是FFmpeg库中两个相关的结构体,它们在音视频编解码中扮演着不同的角色。 AVCodecContext:是编解码器上下文结构体,用于存储音视频编解码器的参数和状态信息。它包含了进行音视…...
2023年中国门把手产量、销量及市场规模分析[图]
门把手行业是指专门从事门把手的设计、制造、销售和安装等相关业务的行业。门把手是门窗装饰硬件的一种,用于开启和关闭门窗,同时也具有装饰和美化门窗的作用。 门把手行业分类 资料来源:共研产业咨询(共研网) 随着消…...
HTML 核心技术点基础详细解析以及综合小案例
核心技术点 网页组成 排版标签 多媒体标签及属性 综合案例一 - 个人简介 综合案例二 - Vue 简介 02-标签语法 HTML 超文本标记语言——HyperText Markup Language。 超文本:链接 标记:标签,带尖括号的文本 标签结构 标签要成…...
BAT学习——批处理脚本(也称为BAT文件)常用语法元素与命令
批处理脚本(也称为BAT文件)使用Windows的批处理语言编写,它具有一些常用的语法元素和命令。以下是一些BAT编程的常用语法元素和命令: 命令行命令: 批处理脚本通常包含一系列Windows命令,例如echo࿰…...
AMD AFMF不但能用在游戏,也适用于视频
近期AMD发布了AMD Software Adrenalin Edition预览版驱动程序,增加了对平滑移动帧(AMD Fluid Motion Frames,AFMF)功能的支持,也就是AMD的“帧生成”技术,与DLSS 3类似,作为FidelityFX Super Re…...
CSS 常用样式浮动属性
一、概述 CSS 中,浮动属性的作用是让元素向左或向右浮动,使其他元素围绕它排布,常用的浮动属性有以下几种: float: left; 使元素向左浮动,其他元素从右侧包围它。 float: right; 使元素向右浮动,其他元素…...
Linux引导故障排除:从问题到解决方案的详细指南
1 BIOS初始化 通电->对硬件检测->初始化硬件时钟 2 磁盘引导及其修复 2.1 磁盘引导故障 磁盘主引导记录(MBR)是在0磁道1扇区位置,446字节。 MBR作用:记录grub2引导文件的位置 2.2 修复 步骤:1、光盘进…...
【vim 学习系列文章 6 -- vim 如何从上次退出的位置打开文件】
文章目录 1.1 vim 如何从上次退出的位置打开文件1.2 autogroup 命令学习1.2.1 augroup 基本语法 1.3 vim call 命令详细介绍 1.1 vim 如何从上次退出的位置打开文件 假设我打开了文件 test.c,然后我向下滚动到第 50 行,然后我做了一些修改并关闭了文件。…...
怎样学习C#上位机编程?
怎样学习C#上位机编程? 00001. 掌握C#编程和.NET框架基础。 00002. 学WinForm应用开发,了解控件使用和事件编程。 00003. 熟悉基本数据结构和算法,如链表、栈、队列。 00004. 理解串口通信协议和方法,用于与硬件交互。 00005…...
【算法-动态规划】两个字符串的删除操作-力扣 583
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
WEB3全栈开发——面试专业技能点P4数据库
一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库,基于 mysql 库改进而来,具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点: 支持 Promise / async-await…...
CTF show 数学不及格
拿到题目先查一下壳,看一下信息 发现是一个ELF文件,64位的 用IDA Pro 64 打开这个文件 然后点击F5进行伪代码转换 可以看到有五个if判断,第一个argc ! 5这个判断并没有起太大作用,主要是下面四个if判断 根据题目…...
