62从零开始学Java之时间相关的类都有哪些?
作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦
千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者
前言
我们在开发时,除了数字、数学这样的常用API之外,还有日期时间类,更是会被经常使用。比如我们项目中必备的日志功能,需要记录异常等信息产生的时间。还有数据库中的表,也经常需要带有日期时间字段,用于记录本条数据产生和更新的时间。另外当我们需要对某段代码进行调优时,也往往需要知道本段代码的执行时间是多长。诸如此类,项目中有很多地方都需要用到日期和时间,所以今天壹哥必须带各位来学习一下相关的API有哪些。
---------------------------------------------前戏已做完,精彩即开始-------------------------------------------
全文大约【5400】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富的案例及配图视频,让你更好地理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考......
配套开源项目资料
Github:
GitHub - SunLtd/LearnJava
Gitee:
从零开始学Java: 从零开始学Java系列稀土掘金专栏地址:https://juejin.cn/column/7175082165548351546CSDN专栏地址:https://yiyige.blog.csdn.net/article/details/129377219?spm=1001.2014.3001.5502
一. 概念简介
在开始学习今天的知识之前,壹哥有必要先给大家讲解一下与今天内容相关的一些概念,否则可能会让一些小白产生迷惑。
1. 日期和时间的区别
首先我们得搞清楚,日期和时间的概念并不一样。日期是指某一天,它不是连续变化的,可以说是离散的。而时间有两种概念,一种是不带日期的时间,如10:30:01;另一种是带日期的时间,如2023-01-01 15:11:40。只有带日期的时间,才能唯一确定某个时刻,而不带日期的时间是无法确定一个唯一时刻的。
2. 本地时间
本地时间其实就是每个地方,当前所在国家所采用的标准时间。比如我们国家就是采用的北京时间,只要是在中国大陆,我们说晚上8:00见,这个8:00指的就是北京时间。即使我们国家的时区,其实包括了从东五区到东九区共5个时区,但我们全国都是统一采用的东八区的区时,这样各地区人员之间的交流才不会产生歧义。但如果是在别的国家,那这个本地时间,就是他们国家的标准区时了,所以每个国家的标准区时可能是不同的。
3. 时区表示法
我们初中学地里的时候,就学过时区的概念,壹哥这里就不多讲了。在计算机中,如果我们想准确地确定一个时间,需要把本地时间和时区结合在一起才行。其中时区有如下几种表示方式:
- GMT或UTC加时区偏移表示法:如GMT+08:00 或 UTC+08:00,就表示东八区的时间。因为北京时区是东八区,领先UTC 8个小时,所以将UTC装换成北京时间时,要加上8小时。GMT(Greenwich Mean Time)是格林威治标准时间,UTC(Universal Time Coordinated)是世界统一时间或世界标准时间,GMT和UTC其实基本是等价的,它们都是英国伦敦的本地时间。但UTC使用了更精确的原子钟计时,每隔几年会有一个闰秒,不过我们在开发时可以忽略两者的误差,因为计算机的时钟在联网时会自动与时间服务器同步时间。
- 时区缩写表示法:如CST是China Standard Time的缩写,即中国标准时间。但CST也是美国中部时间Central Standard Time USA的缩写,因此有些缩写容易产生混淆,开发时尽量不要使用缩写形式。
- 洲/城市表示法:如Asia/Shanghai,表示上海所在地的时区。我们要特别注意,城市名称并不是任意的城市,而是由国际标准组织规定的城市。
4. 本地化
本地化并不只包括时间这一种信息,还包括一个国家或地区所采用的日期、时间、数字、货币等各种信息的格式,开发时通常使用Locale进行表示。Locale由“语言_国家”的字母缩写构成,如“zh_CN”就表示“中文+中国”,“en_US”表示“英文+美国”。其中语言是小写,国家是大写。
而对于不同国家或地区的Locale日期部分来说,如中国和美国的本地时间表示方式如下:
- zh_CN:2023-01-24
- en_US:01/24/2023
5. 夏令时
夏令时(Daylight Saving Time:DST),也叫夏时制,又称“日光节约时制”,是一种为了节约能源而人为规定地方时间的制度。一般在天亮早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。
我们国家曾经实行过一段时间夏令时,但在1992年就废除了,不过美国人到现在还在使用。所以涉及到跨国应用开发时,相关时间的换算可能会有点复杂。因为涉及到夏令时,相同的时区,如果表示的方式不同,转换出的时间也是不同的。
6. Epoch Time时间起点
Epoch Time是一个固定的通用时间,即世界标准时间(UTC) 1970-01-01 00:00:00 UTC,它是计算机里时间开始的起点,该起点被记为0,而1970年以前的时间被认为是负数。我们知道,现实世界的时间谁也不知道是从什么时候开始的,但是计算机发明的时间并不长,为了方便大家进行各种开发和计算,于是国际标准委员会就给计算机设置了一个时间的起点。以这个时间为起点,每过去一秒,该数值就加1,这样我们就可以算出对应的公历时间日期(不包括闰秒)。Epoch Time在不同的编程语言中,会有几种不同的存储方式:
- 以秒为单位的整数:1574208900,缺点是精度只能到秒;
- 以毫秒为单位的整数:1574208900123,最后3位表示毫秒数;
- 以秒为单位的浮点数:1574208900.123,小数点后表示零点几秒。
7. 时间戳
时间戳(timestamp),也称为Unix时间 或 POSIX时间,它是一种时间表示方式。表示从1970年1月1日0时0分0秒(格林尼治时间)开始,一直到现在所经过的秒数或毫秒数。在Java一般是用long类型来存储该值,但在别的编程语言中有可能是使用float类型。比如1574208900就表示从1970年1月1日零点开始,到2019年11月20日8点15分截止,一共经历了1574208900秒,所以换算成北京时间就是:1574208900 = 北京时间2019-11-20 8:15:00。如果我们要获取当前的时间戳,在Java中可以使用System.currentTimeMillis()方法。
从本质上来说,时间戳就是个时间差值,其值与时区无关。比如在UTC标准下,时间起点的时间戳就是timestamp = 0 = 1970-1-1 00:00:00 UTC+0:00
,此时对应的北京时间是timestamp = 0 = 1970-1-1 08:00:00 UTC+8:00
了解了以上这些基本概念之后,我们就可以继续往下学习今天其他的内容了。
二. Date日期时间类
1. 简介
如果我们想在Java中获取当前的时间,可以使用 java.util.Date类 和 java.util.Calendar类来实现。其中,Date类封装了系统的日期和时间信息,Calendar类则会根据系统的日历来填充Date对象。
java.util.Date是一个表示日期和时间的类,代表了系统特定的时间戳。它是按照UTC时间显示的,可以精确到毫秒,源码内部使用long类型进行时间的存储。我们要注意与java.sql.Date区分,后者是用在数据库中的类,且是按照本地时区显示的。Date对象表示的时间,其默认顺序是星期、月、日、小时、分、秒、年。
2. 构造方法
java.util.Date类给我们提供了多个构造方法,如下图所示:
但是一般在开发时,我们常用的也没有这么多,一般使用时如下形式:
- Date():创建Date对象并初始化,该对象可以获取本地的当前时间,该时间会精确到毫秒。
- Date(long date):构造一个Date对象,并接受一个从1970年1月1日起的毫秒数作为参数。
3. 常用API方法
当我们构造出来一个Date对象之后,就可以使用它的一些API方法进行时间的操作了,这些常用的API方法如下:
序号 | 方法和描述 |
boolean after(Date date) | 若调用该方法的Date对象,在指定的日期之后,则返回true,否则返回false。 |
boolean before(Date date) | 若调用此方法的Date对象,在指定的日期之前,则返回true,否则返回false。 |
int compareTo(Date date) | 比较调用此方法的Date对象和指定的日期。若两者相等则返回0,若该对象 在指定日期之前则返回负数,若该对象在指定日期之后则返回正数。 |
boolean equals(Object date) | 若调用该方法的Date对象,和指定日期相等时则返回true,否则返回false。 |
long getTime( ) | 返回自1970年1月1日 00:00:00 GMT以来的毫秒数。 |
void setTime(long time) | 用从1970年1月1日00:00:00 以后的time毫秒数,设置时间和日期。 |
String toString( ) | 把该Date对象转换成dow mon dd hh:mm:ss zzz yyyy格式的字符串,其中 dow是指一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。 |
4. 使用方法
4.1 基本使用
接下来我们先通过一个简单的案例,来演示一下Date的基本用法。
import java.util.Date;/*** @author 一一哥Sun*/
public class Demo01 {public static void main(String[] args) {//获取当前时间的时间戳long currentTimeMillis = System.currentTimeMillis();System.out.println("时间戳="+currentTimeMillis);//获取当前时间对象Date date=new Date();//Sat Feb 11 12:04:03 IRKT 2023System.out.println("当前时间="+date);//转为字符串:Sat Feb 11 12:04:03 IRKT 2023System.out.println("当前时间="+date.toString());//转换为本地时区:2023年2月11日 下午12:04:03System.out.println("当前时间,Locale="+date.toLocaleString());//转换为GMT时区:11 Feb 2023 04:04:03 GMTSystem.out.println("当前时间,GMT="+date.toGMTString());}
}
如果我们想获取当前时间的时间戳,可以使用System.currentTimeMillis()方法。构造出Date对象之后,我们可以直接打印该对象,就能展示出当前时间,但是这个格式并不一定符合我们中国人的阅读习惯,后面我们可以对日期进行格式化操作。
4.2 其他用法
除了上面这些基本用法之外,Date还有其他的一些用法。
import java.util.Date;/*** @author 一一哥Sun*/
public class Demo01 {public static void main(String[] args) {//获取当前时间对象Date date=new Date();//获取年月日System.out.println("年="+(date.getYear() + 1900)); // 必须加上1900System.out.println("月="+(date.getMonth() + 1)); // 0~11,必须加上1System.out.println("日="+date.getDate()); // 1~31,不能加1System.out.println("时="+date.getHours()); // 0~23System.out.println("分="+date.getMinutes()); // 0~59,不能加1System.out.println("秒="+date.getSeconds()); // 0~59,不能加1System.out.println("时间戳="+date.getTime()); // 时间戳,毫秒值//计算自己已经活了多少天,1990年01月31日//构造对象的另一个方法,已过时。year:要减去1900,月份从0开始,0-11;日期是1-31Date d1 = new Date(1990-1900, 2-1, 31);Date d2 = new Date();long time = d2.getTime() - d1.getTime();System.out.println("已活天数="+time/1000/60/60/24);}
}
另外我们还要注意,getYear()方法返回的年份必须加上1900;getMonth()方法返回的月份是0~11,分别表示1~12月,所以要加1;而getDate()方法返回的日期范围是1~31,就不能加1。
在打印本地时区表示的日期和时间时,不同的计算机可能会有不同的展示结果,后面我们可以使用SimpleDateFormat设置出我们想要的日期时间格式。
4.3 统计时间差
有时候我们要统计某个功能的执行时间,此时就可以用该功能结束时的时间,减去开始时的时间,得到一个时间差,这就是该功能的执行时间。
import java.util.Date;/*** @author 一一哥Sun*/
public class Demo03 {public static void main(String[] args) {//获取当前时间对象//开始时间Date startDate=new Date();for(int i=0;i<100000;i++) {System.out.println("循环次数"+i);}//结束时间Date endDate=new Date();//计算时间差long time = endDate.getTime() - startDate.getTime();System.out.println("10w次循环的执行时间是 "+time+" 毫秒");}
}
5. 配套视频
与本节内容配套的视频链接如下:
External Player - 哔哩哔哩嵌入式外链播放器
三. Calendar日历类
1. 简介
Calendar类是Java时间类Date的扩展。相比Date,它拥有更强大的功能,主要是多了可以做简单日期和时间运算的功能,且在实现方式上也比Date类更复杂一些。Calendar可以用来计算日期,比如说计算下个月的日期,或者两个月前的日期等。
Calendar类是一个抽象类,我们在实际使用时需要实现特定的子类,一般使用getInstance()方法创建即可。Calendar类有几个主要的子类,包括java.util.GregorianCalendar和java.util.TimeZone。其中GregorianCalendar类提供了标准的日历系统,可以用来计算未来或过去某天的日期。TimeZone类则可以用来在不同的时区之间,转换日期和时间。
2. Calendar常量字段
Calendar中有以下几个常用的常量字段,用于表示不同的意义。
常量 | 描述 |
Calendar.YEAR | 年份 |
Calendar.MONTH | 月份 |
Calendar.DATE | 日期 |
Calendar.DAY_OF_MONTH | 日期,和上面的字段意义完全相同 |
Calendar.HOUR | 12小时制的小时 |
Calendar.HOUR_OF_DAY | 24小时制的小时 |
Calendar.MINUTE | 分钟 |
Calendar.SECOND | 秒 |
Calendar.DAY_OF_WEEK | 星期几 |
3. Calendar常用方法
除了以上常用的常量字段之外,Calendar还有一些常用的方法,如下表所示:
方法 | 描述 |
void add(int field, int amount) | 根据日历的规则,为给定的日历字段 field 添加或减去指定的时间量 amount |
boolean after(Object when) | 判断此 Calendar 表示的时间是否在指定时间 when 之后,并返回判断结果 |
boolean before(Object when) | 判断此 Calendar 表示的时间是否在指定时间 when 之前,并返回判断结果 |
void clear() | 清空 Calendar 中的日期时间值 |
int compareTo(Calendar anotherCalendar) | 比较两个 Calendar 对象表示的时间值(从格林威治时间 1970 年 01 月 01 日 00 时 00 分 00 秒至现在的毫秒偏移量),大则返回 1,小则返回 -1,相等返回 0 |
int get(int field) | 返回指定日历字段的值 |
int getActualMaximum(int field) | 返回指定日历字段可能拥有的最大值 |
int getActualMinimum(int field) | 返回指定日历字段可能拥有的最小值 |
int getFirstDayOfWeek() | 获取一星期的第一天。根据不同的国家地区,返回不同的值 |
static Calendar getInstance() | 使用默认时区和语言坏境获得一个日历 |
static Calendar getInstance(TimeZone zone) | 使用指定时区和默认语言环境获得一个日历 |
static Calendar getInstance(TimeZone zone,Locale aLocale) | 使用指定时区和语言环境获得一个日历 |
Date getTime() | 返回一个表示此 Calendar 时间值(从格林威治时间1970 年 01 月 01 日 00 时 00 分 00 秒至现在的毫秒偏移量)的 Date 对象 |
long getTimeInMillis() | 返回此 Calendar 的时间值,以毫秒为单位 |
void set(int field, int value) | 为指定的日历字段设置给定值 |
void set(int year, int month, int date) | 设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值 |
void set(int year, int month, int date, int hourOfDay,int minute, int second) | 设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、 MINUTE 和 SECOND 的值 |
void setFirstDayOfWeek(int value) | 设置一星期的第一天是哪一天 |
void setTimeInMillis(long millis) | 用给定的 long 值设置此 Calendar 的当前时间值 |
Calendar对象可以调用set()方法将日历翻到任何一个时间,当参数 year取负数时表示是公元前。调用 get()方法可以获取年、月、日等时间信息,field参数的值是前面讲过的Calendar静态常量。
4. 构建Calendar对象
Calendar类是抽象类,所以我们不能通过new的方式来构建Calendar对象。在实际使用时,我们一般是要实现特定的子类,经常是使用getInstance()方法进行创建。
import java.util.Calendar;/*** @author 一一哥Sun*/
public class Demo04 {public static void main(String[] args) {//默认是当前日期Calendar c1 = Calendar.getInstance();System.out.println("c1="+c1);//创建一个代表2023年2月2日的Calendar对象Calendar c2 = Calendar.getInstance();c2.set(2023, 2-1, 2);System.out.println("c2="+c2);}
}
5. 获取当前时间
获取到Calendar对象之后,我们可以获取到当前日期对象的年月日时分秒等信息。
import java.util.Calendar;/*** @author 一一哥Sun* V我领资料:syc_2312119590* 各平台都有壹哥的同名博客哦*/
public class Demo05 {public static void main(String[] args) {// 获取当前时间Calendar c = Calendar.getInstance();int y = c.get(Calendar.YEAR);//月份要加1int m = 1 + c.get(Calendar.MONTH);int d = c.get(Calendar.DAY_OF_MONTH);int w = c.get(Calendar.DAY_OF_WEEK);int hh = c.get(Calendar.HOUR_OF_DAY);int mm = c.get(Calendar.MINUTE);int ss = c.get(Calendar.SECOND);int ms = c.get(Calendar.MILLISECOND);//2023-2-11 7 18:10:59.847System.out.println(y + "-" + m + "-" + d + " " + w + " " + hh + ":" + mm + ":" + ss + "." + ms);}
}
我们要注意,Calendar是通过get()方法获取年月日等信息的,其中返回的年份不必转换,返回的月份仍要加1,返回的星期要特别注意,1~7分别表示周日、周一、……周六。
6. 设置时间
我们通过Calendar.getInstance()方法获取到Calendar对象后,获取到的其实就是当前时间。如果我们想设置某个特定的日期和时间,需要先用clear()方法清除掉之前所有的字段。
import java.util.Calendar;/*** @author 一一哥Sun*/
public class Demo06 {public static void main(String[] args) {// 设置时间Calendar c = Calendar.getInstance();// 清除所有c.clear();// 设置2023年c.set(Calendar.YEAR, 2023);// 设置2月(0~11)c.set(Calendar.MONTH, 1);// 设置2日c.set(Calendar.DATE, 2);// 设置时间c.set(Calendar.HOUR_OF_DAY, 21);c.set(Calendar.MINUTE, 22);c.set(Calendar.SECOND, 23);//Thu Feb 02 21:22:23 IRKT 2023System.out.println("date="+c.getTime());}
}
我们可以利用Calendar.getTime()方法,将一个Calendar对象转换成Date对象,后面我们就可以用SimpleDateFormat进行格式化操作了。
7. 配套视频
与本节内容配套的视频链接如下:
External Player - 哔哩哔哩嵌入式外链播放器
四. GregorianCalendar类
1. 简介
Java中除了有Calendar类实现了公历日历,还有一个子类GregorianCalendar。在GregorianCalendar类中,定义了两个字段:AD和BC,分别代表公历定义的两个时代。GregorianCalendar中的属性和方法与Calendar类似,壹哥就不再赘述了,接下来我们直接通过一个案例来进行展示其用法。
2. 基本用法
这里我们设计一个案例,来判断当前年份是闰年还是平年。
import java.util.Calendar;
import java.util.GregorianCalendar;/*** @author 一一哥Sun*/
public class Demo05 {public static void main(String[] args) {//定义一个月份数组String months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };int year;// 使用当前时间和日期,初始化Gregorian日历对象,默认为本地时间和时区GregorianCalendar gcalendar = new GregorianCalendar();// 显示当前时间和日期的信息System.out.print("Date:");System.out.print(months[gcalendar.get(Calendar.MONTH)]);System.out.print(" " + gcalendar.get(Calendar.DATE) + " ");System.out.println(year = gcalendar.get(Calendar.YEAR));System.out.print("Time:");System.out.print(gcalendar.get(Calendar.HOUR) + ":");System.out.print(gcalendar.get(Calendar.MINUTE) + ":");System.out.println(gcalendar.get(Calendar.SECOND));//判断当前年份是否为闰年if (gcalendar.isLeapYear(year)) {System.out.println("当前年份是闰年");} else {System.out.println("当前年份是平年");}}
}
------------------------------------------------正片已结束,来根事后烟----------------------------------------------
五. 结语
至此,壹哥就把Date和扩展类Calendar给大家讲解完毕,今天的内容其实并不难,大家需要把一些常用的构造方式及方法、常量记一下即可。如果你独自学习觉得有很多困难,可以加入壹哥的学习互助群,大家一起交流学习。
相关文章:
62从零开始学Java之时间相关的类都有哪些?
作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 我们在开发时,除了数字、数学这样的常用API之外,还有日期时间类,更…...
【Leetcode】买卖股票系列
121. 买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔…...
SLAM面试笔记(8) — 计算机视觉面试题
目录 问题1:目标检测的算法分类 问题2:卷积神经网络的组成 问题3:输入层的作用 问题4:卷积层作用 问题5:卷积核类型 问题6:11卷积核作用 问题7:卷积核是否越大越好 问题8:棋…...
聊聊MySQL面试常问名词回表、索引覆盖,最左匹配
文章目录 1. 前言2. 回表操作 Index Lookup2.1 什么是回表2.2 回表的成本2.3 如何避免回表 3. 索引覆盖 Covering Index3.1 什么是索引覆盖3.2 索引覆盖的优点3.3 如何使用索引覆盖 4. 最左匹配原则(Leftmost Prefix Match)4.1 什么是最左匹配原则4.2 最…...
【面试】C/C++面试八股
C/C面试八股 编译过程的四个阶段C和C语言的区别简单介绍一下三大特性多态的实现原理虚函数的构成原理虚函数的调用原理虚表指针在什么地方进行初始化的?构造函数为什么不能是虚函数为什么建议将析构函数设为虚函数虚函数和纯虚函数的区别抽象类类对象的对象模型内存…...
学习记忆——数学篇——算术——无理数
谐音记忆法 2 \sqrt{2} 2 ≈1.41421:意思意思而已;意思意思; 3 \sqrt{3} 3 ≈1.7320:—起生鹅蛋;一起生儿; 5 \sqrt{5} 5 ≈2.2360679:两鹅生六蛋(送)六妻舅;儿儿生…...
python协程和任务
协程概念引入 协程是我要重点去讲解的一个知识点. 它能够更加高效的利用CPU. 其实, 我们能够高效的利用多线程来完成爬虫其实已经很6了. 但是, 从某种角度讲, 线程的执行效率真的就无敌了么? 我们真的充分的利用CPU资源了么? 非也~ 比如, 我们来看下面这个例子. 我们…...
visual studio code配置anaconda3的python虚拟环境
参考: Visual Studio Code配置anconda3虚拟环境 - 知乎...
【Unity3D编辑器开发】Unity3D编辑器开发基础性框架结构【全面总结】
推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 嗨,大家好,我是恬静的小魔龙。 同学们…...
一座“城池”:泡泡玛特主题乐园背后,IP梦想照亮现实
“更适合中国宝宝体质”的主题乐园,被泡泡玛特造出来了。 9月26日,位于北京朝阳公园内的国内首个潮玩行业沉浸式 IP 主题乐园,也是泡泡玛特首个线下乐园——泡泡玛特城市乐园 POP LAND正式开园。 约4万平方米的空间中,泡泡玛特使…...
【什么是闭包? 闭包产生的原因? 闭包有哪些表现形式?】
JS闭包 什么是闭包?闭包产生的原因?闭包有哪些表现形式? 什么是闭包? 闭包是指一个函数可以访问并操作在其作用域之外的变量的能力。在 JavaScript 中,每当函数被创建时,就会创建一个闭包。 以下是一个简单的闭包示例…...
JackJson和FastJson
前言: fastjson是一款强大的json格式转换工具,我个人在开发中就非常喜欢用fastjson;但是由于某些原因,导致fastjson会有一些漏洞,因此在漏洞扫描后需要修复都是要求我们升级版本,或者替换为jackjson&#…...
SpringCloud学习一
单体应用存在的问题 随着业务的发展,开发变得越来越复杂。 修改、新增某个功能,需要对整个系统进行测试、重新部署。 一个模块出现问题,很可能导致整个系统崩溃。 多个开发团队同时对数据进行管理,容易产生安全漏洞。 各个模块…...
SpringBoot, EventListener事件监听的使用
1、背景 在开发工作中,会遇到一种场景,做完某一件事情以后,需要广播一些消息或者通知,告诉其他的模块进行一些事件处理,一般来说,可以一个一个发送请求去通知,但是有一种更好的方式,…...
课题学习(三)----倾角和方位角的动态测量方法(基于陀螺仪的测量系统)
一、内容介绍 该测量系统基于三轴加速度和三轴陀螺仪,安装在钻柱内部,随钻柱一起旋转,形成捷联惯性导航系统,安装如下图所示: 假设三轴加速度和陀螺仪的输出为: f b [ f x f y f z ] T f^b\begin{bmatrix}f_{x} …...
1876. 长度为三且各字符不同的子字符串
1876. 长度为三且各字符不同的子字符串 C代码:滑动窗口 // 存在三种字符,且不重复、子串数量 int countGoodSubstrings(char * s){int k 3;int hash[26] {0};int len 0;int l 0;int ans 0;for (int i 0; i < strlen(s); i) {hash[s[i] - a];if…...
Mall脚手架总结(一)——SpringSecurity实现鉴权认证
前言 在结束理论知识的学习后,荔枝开始项目学习,这个系列文章将围绕荔枝学习mall项目过程中总结的知识点来梳理。本篇文章主要涉及如何整合Spring Security和JWT实现鉴权认证的功能!希望能帮助到一起学习mall项目的小伙伴~~~ 文章目录 前言 …...
beego-简单项目写法--路径已经放进去了
Beego案例-新闻发布系统 1.注册 后台代码和昨天案例代码一致。,所以这里面只写一个注册的业务流程图。 **业务流程图 ** 2.登陆 业务流程图 登陆和注册业务和我们昨天登陆和注册基本一样,所以就不再重复写这个代码 但是我们遇到的问题是如何做代码的迁移&…...
Linux-CPU相关常用命令合集
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、cpu相关常用命令 二、cpuinfo 参数详细对照表 前言 本篇文章主要记录平时Linux-常用命令整理! 提示:以下是本篇文章正文内容&#…...
vue 百度地图/天地图设置铺满屏幕100%,解决空隙问题
设置100%无效,刷新依然右侧有空隙,解决:min-width: 100vw; <div class"aui-flex-col" style"width: 100%; height:100%"><div id"mapAllCon" style"width: 100%; min-width: 100vw; height: 10…...
第五章:最新版零基础学习 PYTHON 教程—Python 字符串操作指南(第六节 - Python 中字符串的逻辑运算符)
对于 python 中的字符串,布尔运算符(and、or、not)起作用。让我们考虑两个字符串,即 str1 和 str2,并在它们上尝试布尔运算符: Python3 str1 = str2 = geeks# 使用 repr 打印带引号的字符串# 返回 str1 print(repr(str1 and str2)) # 返回 str1 print(repr(str2 and…...
Bark Ai 文本转语音 模型缓存位置修改
默认缓存位置在:~/.cache 加入环境变量:XDG_CACHE_HOME,指定缓存位置 修改后新的位置为: D:\Ai\Bark\Bark Cache...
Docker 镜像的创建
目录 一、Docker镜像的创建 1、基于已有镜像创建 2、基于本地模板创建 3、基于dockerfile创建 3.1 dockerfile结构 3.2 构建镜像命令 二、镜像分层的原理 1、联合文件系统(UnionFS) 2、镜像加载的原理 三、Dockerfile 操作常用的指令 案例实验…...
【ORM】浅聊C#和Java的ORM底层框架
给自己一个目标,然后坚持一段时间,总会有收获和感悟! 国庆假期马上结束,闲暇时间,突然对Ado.Net这个词的由来感兴趣,然后就一顿复习了一遍,顺便也了解了下java关于ORM框架的底层是什么ÿ…...
windows redis 自启动 Redis服务无法启动报错1067问题
如果你的系统服务里面已经有redis服务并且无法启动,则使用下面的命令卸载此服务 ! 1、停止Redis服务: redis-server --service-uninstall 2、删除系统服务 sc delete redis 进入到你的Redis安装目录,我的在以下目录,谨记此时不…...
Ubuntu Server CLI专业提示
基础 网络 获取所有接口的IP地址 networkctl status 显示主机的所有IP地址 hostname -I 启用/禁用接口 ip link set <interface> up ip link set <interface> down 显示路线 ip route 将使用哪条路线到达主机 ip route get <IP> 安全 显示已登录的用户 w…...
Centos7升级OpenSSH9.1
最近遇到了服务器漏洞,需要对服务器的OpenSSH版本进行升级,查阅了相关资料,总结出了一套比较简单的方案。中间遇到的个别问题也进行了记录,供大家参考。 下载准备 从https://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/opens…...
linux——信号
目录 一.信号的保存 二.信号集操作 1.信号集 2.信号集操作函数 3.sigprocmask 4.sigpending 三. 信号的捕捉 1.内核态和用户态 2. sigaction 四.可重入函数 五.SIGCHLD信号 一.信号的保存 实际执行信号的处理动作称为信号递达(Delivery)。信号从产生到递达之间的状…...
wordpress数据库连接文件/广州seo快速排名
1.k8s高可用架构解析 2.基本环境配置 Kubeadm安装方式自1.14版本以后,安装方法几乎没有任何变化,此文档可以尝试安装最新的k8s集群,centos采用的是7.x版本 K8S官网:https://kubernetes.io/docs/setup/ 最新版高可用安装:https://kubernetes.io/docs/setup/production-e…...
做网站绿色和什么颜色搭配/网站推广优化排名公司
挺通俗易懂的一篇好文。 一句话,utf8是对unicode字符集进行编码的一种编码方式。 很久以前保存的,别人写的但是很明了很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物。他…...
企业网站优化公司有哪些/发布广告的平台免费
select条件查询的格式如下: SELECT查询列表 FROM 表名 WHERE筛选条件;根据筛选条件可以分为以下几类: 1.按照条件按表达式进行筛选 常用条件运算符如下:> 、<、、!、<>、<、> 2.按照逻辑表达式进行筛选 …...
知果果网站谁做的/网站首页seo关键词布局
存储过程相关权限create_routinealter_routineexecute视图相关权限视图及存储过程用户权限的处理和检查sed -e s/DEFINER[ ]*[ ]*[^*]*\*/\*/ abc.sql > abc.new.sqlegrep -in "definer|set " abc.new.sql导入存储过程时,应检查并修改为正确数据库用户…...
做字幕网站有哪些/推广产品的方法和步骤
文/美美教育说俗话说:学好数理化,走遍全天下。理工类知识一直以来都是用途很广泛的,从每年的高考志愿中我们也不难看出,工科类院校的报考人数居高不下。一直以来我们都习惯把理科和工科统称为“理工科”,但实际上他们二…...
找网站/线下推广方式
给定一个整数 n ,返回 n! 结果中尾随零的数量。 提示 n! n * (n - 1) * (n - 2) * … * 3 * 2 * 1 示例 1: 输入:n 3 输出:0 解释:3! 6 ,不含尾随 0 示例 2: 输入:n 5 输出&a…...