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

【JAVA入门】Day21 - 时间类

【JAVA入门】Day21 - 时间类


文章目录

  • 【JAVA入门】Day21 - 时间类
    • 一、JDK7前的时间相关类
      • 1.1 Date
      • 1.2 SimpleDateFormat
      • 1.3 Calendar
    • 二、JDK8新增的时间相关类
      • 2.1 Date 相关类
        • 2.1.1 ZoneId 时区
        • 2.1.2 Instant 时间戳
        • 2.1.3 ZoneDateTime 带时区的时间
      • 2.2 DateTimeFormat 相关类
        • 2.2.1 DateTimeFormatter 时间的格式化和解析类
      • 2.3 Calendar 相关类
        • 2.3.1 LocalDate、LocalTime、LocalDateTime
      • 2.4 JDK8 新增的三个工具类


        Java 中的时间有一些相关类,它们都与时间的编程息息相关。

一、JDK7前的时间相关类

类名作用
Date时间类
SimpleDateFormat格式化时间
Calender日历类

        世界上的时间,是有一个统一的计算标准的。
        曾经的世界时间标准被称作 格林尼治时间 / 格林威治时间 (Greenwich Mean Time),简称GMT。GMT 的计算核心是:地球自转一天是24小时,太阳直射时为正午12点。但是由于误差太大,现在 GMT 已经被舍弃。
        现在的世界时间标准是利用原子钟规定的,利用铯原子的振动频率计算出来的时间,作为世界标准时间(UTC)。
        中国地处东八区,要在世界标准时间的基础上 + 8小时。

1.1 Date

        Date 类是 JDK 写好的一个 Javabean 类,用来描述时间,精确到毫秒。
        利用空参构造创建的对象,默认表示为系统当前时间
        利用有参构造创建的对象,表示为指定的时间

方法作用
public Date()创建Date对象,表示系统当前时间
public Date(long date)创建Date对象,表示指定时间
public void setTime(long time)设置/修改毫秒值
public long getTime()获取时间对象的毫秒值

【练习】学习使用Date类。

package DateClass;import java.util.Date;
import java.util.Random;public class DateDemo2 {public static void main(String[] args) {//需求一:打印一年后的时间extracted();//需求二:比较两个Date对象哪个在前哪个在后extracted1();}private static void extracted() {//1.打印时间原点一年后的时间Date d1 = new Date(0L);//2.获取d1的毫秒值long time = d1.getTime();//3.加上一年后的毫秒值time = time + 1000L * 60 * 60 * 24 * 365;//4.把计算后的时间毫秒值,设置回d1中d1.setTime(time);//5.打印System.out.println(d1);}private static void extracted1() {Random r = new Random();//创建两个时间对象Date d1 = new Date(r.nextInt());Date d2 = new Date(r.nextInt());System.out.println(d1);System.out.println(d2);long time1 = d1.getTime();long time2 = d2.getTime();if(time1 > time2) {System.out.println("d2在前,d1在后");} else if(time2 > time1) {System.out.println("d1在前,d2在后");} else {System.out.println("两时间一样");}}}
}

1.2 SimpleDateFormat

         Date 类只能以默认的格式展示,不符合人们的阅读习惯。
        SimpleDateFormat 可以把日期格式化;也可以解析日期,即把字符串表示的时间编程 Date 对象。

构造方法说明
public SimpleDateFormat()构造一个SimpleDateFormat对象,使用默认格式
public SimpleDateFormat(String pattern)构造一个SimpleDateFormat对象,使用指定的格式
常用方法说明
public final String format(Date date)格式化(日期对象 -> 字符串)
public Date parse(String source)解析(字符串 -> 日期对象)

         格式化的时间形式的常用模式对应关系如下:
在这里插入图片描述
【练习1】练习使用SimpleDateFormat。

package DateClass;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class DateDemo3 {public static void main(String[] args) throws ParseException {//需求一:格式化时间method1();//需求二:解析字符串method2();}private static void method2() throws ParseException {//1.定义一个字符串用来表示时间String str = "2023-11-11 11:11:11";//2.利用空参构造创建SimpleDateFormat对象//其创建的格式参数要和字符串的格式完全一致SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//解析字符串,变为时间对象Date date = sdf.parse(str);//打印毫秒值System.out.println(date.getTime());}private static void method1() {//1.利用空参构造创建SimpleDateFormat对象,默认格式SimpleDateFormat sdf = new SimpleDateFormat();Date d1  = new Date(0L);String str = sdf.format(d1);System.out.println(str);       //1970/1/1 上午8:00//2.利用带参构造创建SimpleDateFormat对象,指定格式SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");String str2 = sdf2.format(d1);System.out.println(str2);       //1970年01月01日 08:00:00//3.格式2SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 EE");String str3 = sdf3.format(d1);System.out.println(str3);       //1970年01月01日 08时00分00秒 周四}
}

【练习2】把一个日期转换为另一种格式。

package DateClass;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class DateDemo4 {public static void main(String[] args) throws ParseException {/*2000-11-11*/String str = "2000-11-11";//1.解析字符串为日期SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date date = sdf.parse(str);//2.格式化日期为年月日SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日");String result = sdf1.format(date);//3.打印System.out.println(result);}
}

【练习3】判断两个同学是否秒杀成功。

package DateClass;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class DateDemo5 {public static void main(String[] args) throws ParseException {/*需求:秒杀活动:2023年11月11日 0:0:0开始时间:2023年11月11日 0:10:0小贾下单付款时间:2023年11月11日 0:01:00小皮下单付款时间:2023年11月11日 0:11:00计算两个人有没有参加成功*///1.比较两个时间String startStr = "2023年11月11日 0:0:0";String endStr = "2023年11月11日 0:10:0";String orderStr1 = "2023年11月11日 0:01:0";String orderStr2 = "2023年11月11日 0:11:00";//2.解析上面的时间,得到Date对象SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");Date startDate = sdf.parse(startStr);Date endDate = sdf.parse(endStr);Date orderDate1 = sdf.parse(orderStr1);Date orderDate2 = sdf.parse(orderStr2);//3.得到所有时间的毫秒值long startTime = startDate.getTime();long endTime = endDate.getTime();long orderTime1 = orderDate1.getTime();long orderTime2 = orderDate2.getTime();//4.判断if((startTime <= orderTime1)&&(orderTime1 <= endTime)) {System.out.println("小贾同学秒杀成功了!");}else{System.out.println("小贾同学秒杀失败了...");}if((startTime <= orderTime2)&&(orderTime2 <= endTime)) {System.out.println("小皮同学秒杀成功了!");}else{System.out.println("小皮同学秒杀失败了...");}}
}

1.3 Calendar

         Calendar 就是日历类,它是时间类的补充,可以单独修改、获取事件中的年,月,日。
         值得注意的是,Calendar 是一个抽象类,它不能直接创建对象。
         我们需要通过一个静态方法来获取当前时间的日历对象。

public static Calendar getInstance()

         Calendar 中常用的方法有这些:

方法名说明
public final Date getTime()获取日期对象
public final setTime(Date date)给日历设置日期对象
public long getTimeInMillis()拿到时间的毫秒值
public void setTimeInMillis(long millis)给日历设置时间毫秒值
public int get(int field)取得日历中某个字段的信息
public void set(int field,int value)修改日历中的某个字段信息
public void add(int field,int amount)为某个字段增加/减少指定的值

         下面通过一个练习,熟悉一下这些方法。

package DateClass;import java.util.Calendar;
import java.util.Date;public class CalenderDemo1 {public static void main(String[] args) {//1.获取日历对象//Calender是一个抽象类,不能直接new,而是通过一个静态方法获取子类对象Calendar c = Calendar.getInstance();//底层原理://会根据系统的不同时区来获取不同的日历对象//把时间中的纪元,年,月,日,时,分,秒,星期,等等放到一个数组当中//2.修改一下日历代表的时间为时间原点//获取的时间信息有细节// 月份范围:0~11,0代表一月,11代表十二月// 星期:星期日是第一天,值为1;星期六的值为7Date d = new Date(0L);c.setTime(d);//3.获取日期中某个字段信息//参数为int类型//0:纪元 1:年 2:月 3:一年中的第几周 ...//Java当中,把索引数字都定义为了常量int year = c.get(Calendar.YEAR);int month = c.get(Calendar.MONTH) + 1;int date = c.get(Calendar.DAY_OF_MONTH);int week = c.get(Calendar.DAY_OF_WEEK);System.out.println(year + ", " + month + ", "+ date+ ", " + getWeek(week));//4.修改日历中某个字段c.set(Calendar.YEAR, 2000);c.set(Calendar.MONTH,12);//月份12是指13月,这是不存在的//系统会自动把年份调成次年//5.为某个字段增加/减少值c.add(Calendar.MONTH, -1);}//传入对应的数字:1~7//返回对应的星期//查表法:在方法中让数据跟索引产生对应关系public static String getWeek(int index) {String[] arr = {"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};return arr[index];}
}

二、JDK8新增的时间相关类

         JDK8 新增的时间相关类,解决了 JDK7 代码麻烦的问题,而且在安全层面下有了突破。
         JDK7 在多线程环境下会导致数据安全问题产生,而 JDK8 的时间日期对象都是不可变的,解决了这个问题。
         JDK8 主要新增了以下四种类:
在这里插入图片描述

2.1 Date 相关类

2.1.1 ZoneId 时区

         时区类常用方法如下。
在这里插入图片描述

package DateClass;import java.time.ZoneId;
import java.util.Set;public class CalenderDemo2 {public static void main(String[] args) {/*时区*///1.获取所有的时区名称Set<String> zoneIds = ZoneId.getAvailableZoneIds();System.out.println(zoneIds);System.out.println(zoneIds.size());//2.获取当前系统的默认时区ZoneId zoneId = ZoneId.systemDefault();System.out.println(zoneId);//3.获取指定的时区ZoneId zoneId1 = ZoneId.of("Asia/Aqtau");System.out.println(zoneId1);}
2.1.2 Instant 时间戳

        时间戳是一种新的计算时间方法,它可以精确到时间的纳秒值(标准时间)。
在这里插入图片描述

package DateClass;import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;public class DateDemo6 {public static void main(String[] args) {//1.获取当前时间的Instant对象(标准时间)Instant now = Instant.now();System.out.println(now);            //2024-08-16T10:35:23.164490400Z//2.根据(秒/毫秒/纳秒)获取Instant对象//获取原初时间戳Instant instant1 = Instant.ofEpochMilli(0L);System.out.println(instant1);       //1970-01-01T00:00:00Z//获取相较于原初时间一秒后的时间戳Instant instant2 = Instant.ofEpochSecond(1L);System.out.println(instant2);       //1970-01-01T00:00:01Z//获取1秒+1000000000纳秒后的时间Instant instant3 = Instant.ofEpochSecond(1L, 1000000000L);System.out.println(instant3);       //1970-01-01T00:00:02Z//3.指定时区//指定时区后再获得当前系统时间,中国在东八区,会自动加上8个小时ZonedDateTime zonedDateTime = Instant.now().atZone(ZoneId.of("Asia/Shanghai"));System.out.println(zonedDateTime);    //2024-08-16T18:45:01.710355900+08:00[Asia/Shanghai]//4.isXxx 判断Instant instant4 = Instant.ofEpochMilli(0L);Instant instant5 = Instant.ofEpochMilli(1000L);boolean result1 = instant4.isBefore(instant5);System.out.println(result1);            //trueboolean result2 = instant4.isAfter(instant5);System.out.println(result2);            //false//5.增减时间Instant instant6 = Instant.ofEpochMilli(3000L);System.out.println(instant6);           //1970-01-01T00:00:03ZInstant instant7 = instant6.minusSeconds(1L);System.out.println(instant7);           //1970-01-01T00:00:02ZInstant instant8 = instant6.plusMillis(5000L);System.out.println(instant8);           //1970-01-01T00:00:08Z}
}
2.1.3 ZoneDateTime 带时区的时间

        带时区的时间就是带上时区的时间。
在这里插入图片描述

package DateClass;import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;public class DateDemo7 {public static void main(String[] args) {//1.获取当前带时区的时间对象ZonedDateTime now = ZonedDateTime.now();System.out.println(now);//2.获取指定的带时区时间对象//年月日时分秒纳秒方式指定ZonedDateTime time1 = ZonedDateTime.of(2023,10,1,11,12,12,0, ZoneId.of("Asia/Shanghai"));System.out.println(time1);//通过Instant + 时区的方式获取指定时间对象Instant instant = Instant.ofEpochMilli(0L);ZoneId zoneId = ZoneId.of("Asia/Shanghai");ZonedDateTime time2 = ZonedDateTime.ofInstant(instant, zoneId);System.out.println(time2);      //1970-01-01T08:00+08:00[Asia/Shanghai]//3.withXxx 修改时间系列的方法,可以单独修改年月日等ZonedDateTime time3 = time2.withYear(2000);System.out.println(time3);      //2000-01-01T08:00+08:00[Asia/Shanghai]//4.减少时间ZonedDateTime time4 = time3.minusYears(1);System.out.println(time4);//5.增加时间ZonedDateTime time5 = time3.plusYears(1);System.out.println(time5);//细节://JDK8新增的时间对象都是不可变的//如果我们进行任何形式的修改,调用者本身都不会改变,而是会产生一个新的时间}
}

2.2 DateTimeFormat 相关类

2.2.1 DateTimeFormatter 时间的格式化和解析类

        两个方法用来时间格式化和解析。被解析的时间对象可以是ZonedDateTime (带时区的时间类对象)。
在这里插入图片描述

package DateClass;import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;public class DateDemo8 {public static void main(String[] args) {//获取时间对象ZonedDateTime time = Instant.now().atZone(ZoneId.of("Asia/Shanghai"));//生成对象DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EE a");//格式化时间对象System.out.println(dtf1.format(time));}
}

2.3 Calendar 相关类

2.3.1 LocalDate、LocalTime、LocalDateTime

在这里插入图片描述
        这三个类是这种关系,LocalDateTime 能表示的最全,年月日时分秒都可以,LocalDate 只能表示年月日,LocalTime 只能表示时分秒。LocalDate 和 LocalTime 之间可以互转。
在这里插入图片描述
        LocalDate 类用法如下。

package DateClass;import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.MonthDay;public class LocalDateDemo {public static void main(String[] args) {//1.获取当前时间的日历对象(包含年月日)LocalDate nowDate = LocalDate.now();//2.获取指定的时间的日历对象LocalDate ldDate = LocalDate.of(2023, 1, 1);System.out.println("指定日期:" + ldDate);System.out.println("===============================");//3.get系列方法获取日历中的每一个属性值//获取年int year = ldDate.getYear();System.out.println("year:" + year);//获取月//方式一:通过Month对象获取Month m = ldDate.getMonth();System.out.println(m);System.out.println(m.getValue());//方式二:用int变量接收int month = ldDate.getMonthValue();System.out.println(month);//获取日int day = ldDate.getDayOfMonth();System.out.println("day:" + day);//获取一年的第几天int dayOfYear = ldDate.getDayOfYear();System.out.println("dayOfYear:" + dayOfYear);//获取星期DayOfWeek dayOfWeek = ldDate.getDayOfWeek();System.out.println(dayOfWeek);System.out.println(dayOfWeek.getValue());//is方法表判断System.out.println(ldDate.isBefore(ldDate));System.out.println(ldDate.isAfter(ldDate));//with开头方法表示修改,只能修改年月日//修改传回的是一个新的对象LocalDate withLocalDate = ldDate.withYear(2000);System.out.println(withLocalDate);System.out.println(withLocalDate == ldDate); //false//minus减少年月日LocalDate minusLocalDate = ldDate.minusYears(1);System.out.println(minusLocalDate);//plus增加年月日LocalDate plusLocalDate = ldDate.plusDays(1);System.out.println(plusLocalDate);//------------------------------//判断今天是否是你的生日LocalDate birDate = LocalDate.of(2000, 1, 1);LocalDate nowDate1 = LocalDate.now();//月日对象MonthDay birMd = MonthDay.of(birDate.getMonthValue(), birDate.getDayOfMonth());MonthDay nowMd = MonthDay.of(nowDate1.getMonthValue(), nowDate1.getDayOfMonth());System.out.println("今天是你的生日吗?" + birMd.equals(nowMd));}
}

        LocalTime 类用法如下。

package DateClass;import java.time.LocalTime;public class LocalTimeDemo {public static void main(String[] args) {//获取本地时间的日历对象(时分秒)LocalTime nowTime = LocalTime.now();System.out.println("今天的时间:" + nowTime);int hour = nowTime.getHour(); //时System.out.println("hour:" + hour);int minute = nowTime.getMinute();   //分System.out.println("minute:" + minute);int second = nowTime.getSecond();   //秒System.out.println("second:" + second);int nano = nowTime.getNano();       //纳秒System.out.println("nano:" + nano);System.out.println("------------------------");System.out.println(LocalTime.of(8, 20, 30)); //时分秒LocalTime mTime = LocalTime.of(8, 20, 30, 150);//is系列方法System.out.println(nowTime.isBefore(mTime));System.out.println(nowTime.isAfter(mTime));//with系列方法,只能修改时分秒System.out.println(nowTime.withHour(10));//minus系列System.out.println(nowTime.minusHours(10));//plus系列System.out.println(nowTime.plusHours(10));}
}

2.4 JDK8 新增的三个工具类

        它们是:

  • Duration:时间间隔(秒,纳秒)
  • Period:时间间隔(年,月,日)
  • ChronoUnit:时间间隔(所有单位)

        Period - 计算年月日之间的时间间隔。

package DateClass;import java.time.LocalDate;
import java.time.Period;public class TimeUtils {public static void main(String[] args) {//当前本地年月日LocalDate today = LocalDate.now();System.out.println(today);//生日的年月日LocalDate birthDate = LocalDate.of(2000, 1, 1);System.out.println(birthDate);//时间间隔是多少:第二个参数减去第一个参数Period period = Period.between(birthDate, today);System.out.println("相差的时间间隔对象:" + period);System.out.println(period.getYears());System.out.println(period.getMonths());System.out.println(period.getDays());//转化为总共差几个月System.out.println(period.toTotalMonths());}
}

        Duration - 计算时分秒之间的时间间隔

package DateClass;import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Period;public class TimeUtils {public static void main(String[] args) {//当前本地年月日LocalDateTime today = LocalDateTime.now();System.out.println(today);//出生日期的时间对象LocalDateTime birthDate = LocalDateTime.of(2000,1,1,0,00,00);System.out.println(birthDate);Duration duration = Duration.between(birthDate,today);System.out.println("相差的时间间隔对象:" + duration);System.out.println("========================");System.out.println(duration.toDays());System.out.println(duration.toHours());System.out.println(duration.toMinutes());System.out.println(duration.toMillis());System.out.println(duration.toNanos());}
}

        ChronoUnit - 计算年月日时分秒的时间间隔。

package DateClass;import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;public class ChronoUnitDemo {public static void main(String[] args) {//当前时间LocalDateTime today = LocalDateTime.now();System.out.println(today);//生日时间LocalDateTime birthDate = LocalDateTime.of(2000,1,1,0,0,0);System.out.println(birthDate);System.out.println("相差的年数:" + ChronoUnit.YEARS.between(birthDate, today));System.out.println("相差的月数:" + ChronoUnit.MONTHS.between(birthDate, today));System.out.println("相差的周数:"+ ChronoUnit.WEEKS.between(birthDate, today));System.out.println("相差的天数:"+ ChronoUnit.DAYS.between(birthDate, today));System.out.println("相差的时数:"+ ChronoUnit.HOURS.between(birthDate, today));System.out.println("相差的分数:"+ ChronoUnit.MINUTES.between(birthDate, today));System.out.println("相差的秒数:"+ ChronoUnit.SECONDS.between(birthDate, today));System.out.println("相差的毫秒数:"+ ChronoUnit.MILLIS.between(birthDate, today));System.out.println("相差的微秒数:"+ ChronoUnit.MICROS.between(birthDate, today));System.out.println("相差的纳秒数:"+ ChronoUnit.NANOS.between(birthDate, today));System.out.println("相差的半天数:"+ ChronoUnit.HALF_DAYS.between(birthDate, today));System.out.println("相差的十年数:"+ ChronoUnit.DECADES.between(birthDate, today));System.out.println("相差的世纪(百年)数:"+ ChronoUnit.CENTURIES.between(birthDate, today));System.out.println("相差的千年数:"+ ChronoUnit.MILLENNIA.between(birthDate, today));System.out.println("相差的纪元数:"+ ChronoUnit.ERAS.between(birthDate, today));}
}

相关文章:

【JAVA入门】Day21 - 时间类

【JAVA入门】Day21 - 时间类 文章目录 【JAVA入门】Day21 - 时间类一、JDK7前的时间相关类1.1 Date1.2 SimpleDateFormat1.3 Calendar 二、JDK8新增的时间相关类2.1 Date 相关类2.1.1 ZoneId 时区2.1.2 Instant 时间戳2.1.3 ZoneDateTime 带时区的时间 2.2 DateTimeFormat 相关…...

SQL server数据库备份和还原

新手小白都懂的sql server数据库备份和还原 一、备份 1.打开sql server数据库找到 2.展开找到对应的数据库文件 鼠标右击—任务–备份 3.复制名称 4.复制完点击添加 5.点击添加完之后再次点击查找路径 6.分别两个路径 原路径和新路径 &#xff08;新路径是找到原路径新建了一…...

B站搜索建库架构优化实践

前言 搜索是B站的重要基础功能&#xff0c;需要对包括视频、评论、图文等海量的站内优质资源建立索引&#xff0c;处理来自用户每日数亿的检索请求。离线索引数据的正确、高效产出是搜索业务的基础。我们在这里分享搜索离线架构整体的改造实践&#xff1a;从周期长&#xff0c;…...

XSS反射实战

目录 1.XSS向量编码 2.xss靶场训练&#xff08;easy&#xff09; 2.1第一关 2.2第二关 方法一 方法二 2.3第三关 2.4第四关 2.5第五关 2.6第六关 2.7第七关 第一种方法&#xff1a; 第二种方法&#xff1a; 第三个方法&#xff1a; 2.8第八关 1.XSS向量编码 &…...

远程消息传递的艺术:NSDistantObject在Objective-C中的妙用

标题&#xff1a;远程消息传递的艺术&#xff1a;NSDistantObject在Objective-C中的妙用 引言 在Objective-C的丰富生态中&#xff0c;NSDistantObject扮演着至关重要的角色&#xff0c;特别是在处理分布式系统中的远程消息传递。它允许对象之间跨越不同地址空间进行通信&…...

指向派生类的基类指针、强转为 void* 再转为基类指针、此时调用虚函数会发生什么?

指向派生类的基类指针、强转为 void* 再转为基类指针、此时调用虚函数会发生什么&#xff1f; 1、无论指针类型怎么转&#xff0c;类对象内存没有发生任何变化&#xff0c;还是vfptr指向虚函数表&#xff0c;下面是成员变量&#xff0c;这在编译阶段就已经确定好了&#xff1b…...

操作系统(Linux实战)-进程创建、同步与锁、通信、调度算法-学习笔记

1. 进程的基础概念 1.1 进程是什么&#xff1f; 定义&#xff1a; 进程是操作系统管理的一个程序实例。它包含程序代码及其当前活动的状态。每个进程有自己的内存地址空间&#xff0c;拥有独立的栈、堆、全局变量等。操作系统通过进程来分配资源&#xff08;如 CPU 时间、内…...

react的setState中为什么不能用++?

背景&#xff1a; 在使用react的过程中产生了一些困惑&#xff0c;handleClick函数的功能是记录点击次数&#xff0c;handleClick函数被绑定到按钮中&#xff0c;每点击一次将通过this.state.counter将累计的点击次数显示在页面上 困惑&#xff1a; 为什么不能直接写prevStat…...

2.2算法的时间复杂度与空间复杂度——经典OJ

本博客的OJ标题均已插入超链接&#xff0c;点击可直接跳转~ 一、消失的数字 1、题目描述 数组nums包含从0到n的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗&#xff1f; 2、题目分析 &#xff08;1&#xff09;numsS…...

【CentOS 】DHCP 更改为静态 IP 地址并且遇到无法联网

文章目录 引言解决方式标题1. **编辑网络配置文件**&#xff1a;标题2. **确保配置文件包含以下内容**&#xff1a;特别注意 标题3. **重启网络服务**&#xff1a;标题4. **检查配置是否生效**&#xff1a;标题5. **测试网络连接**&#xff1a;标题6. **检查路由表**&#xff1…...

Linux 操作系统 --- 信号

序言 在本篇内容中&#xff0c;将为大家介绍在操作系统中的一个重要的机制 — 信号。大家可能感到疑惑&#xff0c;好像我在使用 Linux 的过程中并没有接触过信号&#xff0c;这是啥呀&#xff1f;其实我们经常遇到过&#xff0c;当我们运行的进程当进程尝试访问非法内存地址时…...

黑马前端——days09_css

案例 1 页面框架文件 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compati…...

【Python爬虫】技术深度探索与实践

目录 引言 第一部分&#xff1a;Python爬虫基础 1.1 网络基础 1.2 Python爬虫基本流程 第二部分&#xff1a;进阶技术 2.1 动态网页抓取 2.2 异步编程与并发 2.3 反爬虫机制与应对 第三部分&#xff1a;实践案例 第四部分&#xff1a;法律与道德考量 第五部分&#x…...

智启万象|挖掘广告变现潜力,保障支付安全便捷

谷歌致力于为开发者提供 先进的广告变现与支付解决方案 一起回顾 2024 Google 开发者大会 了解如何利用谷歌最新工具和功能 提高变现收入&#xff0c;优化用户体验&#xff0c;保障交易安全 让变现更上一层楼 广告检查器是谷歌 AdMob 平台最新推出的高级测试工具&#xff0c;开…...

函数递归,匿名、内置行数,模块和包,开发规范

一、递归与二分法 一&#xff09;递归 1、递归调用的定义 递归调用&#xff1a;在调用一个函数的过程中&#xff0c;直接或间接地调用了函数本身 2、递归分为两类&#xff1a;直接与间接 #直接 def func():print(from func)func()func() # 间接 def foo():print(from foo)bar…...

Springboot3 整合swagger

一、pom.xml <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-api</artifactId><version>2.1.0</version></dependency> 二、application.yml # SpringDoc配置 # springdoc:swa…...

查看同一网段内所有设备的ip

使用命令提示符&#xff08;CMD&#xff09;进行扫描 查看本机IP地址 首先通过 ipconfig /all 命令查看本机的IP地址&#xff0c;确定你的网段&#xff0c;例如 192.168.1.。 Ping网段内每个IP地址 接着使用循环命令&#xff1a; for /L %i IN (1,1,254) DO ping -w 1 -n …...

Spark MLlib 特征工程(上)

文章目录 Spark MLlib 特征工程(上)特征工程预处理 Encoding:StringIndexer特征构建:VectorAssembler特征选择:ChiSqSelector归一化:MinMaxScaler模型训练总结Spark MLlib 特征工程(上) 前面我们一起构建了一个简单的线性回归模型,来预测美国爱荷华州的房价。从模型效果来…...

《SPSS零基础入门教程》学习笔记——03.变量的统计描述

文章目录 3.1 连续变量&#xff08;1&#xff09;集中趋势&#xff08;2&#xff09;离散趋势&#xff08;3&#xff09;分布特征 3.2 分类变量&#xff08;1&#xff09;单个分类变量&#xff08;2&#xff09;多个分类变量 3.1 连续变量 &#xff08;1&#xff09;集中趋势 …...

2024年杭州市网络与信息安全管理员(网络安全管理员)职业技能竞赛的通知

2024年杭州市网络与信息安全管理员&#xff08;网络安全管理员&#xff09;职业技能竞赛的通知 一、组织机构 本次竞赛由杭州市总工会牵头&#xff0c;杭州市人力资源和社会保障局联合主办&#xff0c;杭州市萧山区总工会承办&#xff0c;浙江省北大信息技术高等研究院协办。…...

SpringBoot参数校验详解

前言 在web开发时&#xff0c;对于请求参数&#xff0c;一般上都需要进行参数合法性校验的&#xff0c;原先的写法时一个个字段一个个去判断&#xff0c;这种方式太不通用了&#xff0c;Hibernate Validator 是 Bean Validation 规范的参考实现&#xff0c;用于在 Java 应用中…...

安全基础学习-SHA-1(Secure Hash Algorithm 1)算法

SHA-1(Secure Hash Algorithm 1)是一种密码学哈希函数,用于将任意长度的输入数据(消息)转换成一个固定长度的输出(哈希值或摘要),长度为160位(20字节)。SHA-1的主要用途包括数据完整性验证、数字签名、密码存储等。 1、SHA-1 的特性 定长输出:无论输入数据长度是多…...

leetcode350. 两个数组的交集 II,哈希表

leetcode350. 两个数组的交集 II 给你两个整数数组 nums1 和 nums2 &#xff0c;请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数&#xff0c;应与元素在两个数组中都出现的次数一致&#xff08;如果出现次数不一致&#xff0c;则考虑取较小值&#xff09;。可…...

基于YOLOv8的缺陷检测任务模型训练

文章目录 一、引言二、环境说明三、缺陷检测任务模型训练详解3.1 PCB数据集3.1.1 数据集简介3.1.2 数据集下载3.1.3 构建yolo格式的数据集 3.2 基于ultralytics训练YOLOv83.2.1 安装依赖包3.2.2 ultralytics的训练规范说明3.2.3 创建训练配置文件3.2.4 下载预训练模型3.2.5 训练…...

【upload]-ini-[SUCTF 2019]CheckIn-笔记

上传图片木马文件后看到&#xff0c;检查的文件内容&#xff0c;包含<? 一句话木马提示 检查的文件格式 用如下图片木马&#xff0c;加上GIF89a绕过图片和<?检查 GIF89a <script languagephp>eval($_POST[cmd])</script> .user.ini实际上就是一个可以由用…...

uniapp条件编译使用教学(#ifdef、#ifndef)

#ifdef //仅在xxx平台使用#ifndef //除了在xxx平台使用#endif // 结束 标识平台APP-PLUSAPPMP微信小程序/支付宝小程序/百度小程序/头条小程序/QQ小程序MP-WEIXIN微信小程序MP-ALIPAY支付宝小程序MP-BAIDU百度小程序MP-TOUTIAO头条小程序MP-QQQQ小程序H5H5APP-PLUS-NVUEApp nv…...

NXP i.MX8系列平台开发讲解 - 4.1.2 GNSS 篇(二) - 卫星导航定位原理

专栏文章目录传送门&#xff1a;返回专栏目录 Hi, 我是你们的老朋友&#xff0c;主要专注于嵌入式软件开发&#xff0c;有兴趣不要忘记点击关注【码思途远】 文章目录 关注星号公众号&#xff0c;不容错过精彩 作者&#xff1a;HywelStar Hi, 我是你们的老朋友HywelStar, 根…...

怎样在 SQL 中对一个包含销售数据的表按照销售额进行降序排序?

在当今数字化商业的浪潮中&#xff0c;数据就是企业的宝贵资产。对于销售数据的有效管理和分析&#xff0c;能够为企业的决策提供关键的支持。而在 SQL 中&#xff0c;对销售数据按照销售额进行降序排序&#xff0c;是一项基础但极其重要的操作。 想象一下&#xff0c;您面前有…...

DIAdem 与 LabVIEW

DIAdem 和 LabVIEW 都是 NI (National Instruments) 公司开发的产品&#xff0c;尽管它们有不同的核心功能和用途&#xff0c;但它们在工程、测试和测量领域中常常一起使用&#xff0c;以形成一个完整的数据采集、分析、处理和报告生成的解决方案。 1. 功能和用途 LabVIEW (Lab…...

UE虚幻引擎可以云渲染吗?应用趋势与挑战了解

虚幻云渲染技术是基于虚幻引擎的云端渲染技术&#xff0c;将虚幻引擎的渲染计算任务通过云计算的方式进行处理和渲染、并将渲染结果传输到终端设备上进行展示。虚幻引擎云渲染技术在近年来得到了迅猛的发展&#xff0c;并在各个领域得到了广泛的应用&#xff0c;包括游戏、电影…...

实战分享:DefenderUI在企业环境中的部署与应用

前言 想象一下&#xff0c;你的电脑就像一座坚固的城堡&#xff0c;但城门却时常被一些不速之客窥探甚至企图入侵&#xff1b;Defender&#xff0c;作为城堡自带的守护者&#xff0c;实力自然不容小觑&#xff1b;但你是否觉得它有时候太过低调&#xff0c;有些隐藏技能还没完…...

中英双语介绍金融经济中的鹰派 (Hawkish)和鸽派 (Dovish)

中文版 在金融和经济政策中&#xff0c;“鹰派”和“鸽派”是两种对货币政策和经济管理有不同立场的群体。 鹰派 (Hawkish) 鹰派倾向于担心通货膨胀的风险&#xff0c;通常支持较高的利率和更紧的货币政策&#xff0c;以防止经济过热和控制物价上涨。具体特征包括&#xff1…...

Android 开发中常用的布局类型及其选择指南

在 Android 开发过程中,选择正确的布局类型对于构建高效、美观且响应式的用户界面至关重要。本文将介绍 Android 中几种最常用的布局类型,并对比它们的特点和适用场景,帮助开发者们做出明智的选择。 1. LinearLayout - 线性布局 特点: LinearLayout 是最基本的布局类型之一…...

短视频SDK解决方案,降低行业开发门槛

美摄科技匠心打造了一款集前沿技术与极致体验于一体的短视频SDK解决方案&#xff0c;它不仅重新定义了短视频创作的边界&#xff0c;更以行业标杆级的短视频特效&#xff0c;让每一帧画面都闪耀不凡光芒。 【技术赋能&#xff0c;创意无限】 美摄科技的短视频SDK&#xff0c;…...

【C++】String常见函数用法

一、string类对象的常见构造 我们可采取以下的方式进行构造&#xff0c;以下是常用的接口&#xff1a; //生成空字符串 string; //拷贝构造函数 string(const string& str); //用C-string来构造string类对象 string(const char* s); //string类对象中包含n个字符c strin…...

LeetCode49.字母异位词分组

题目大意 给你一个字符串数组&#xff0c;请你将字母异位词组合在一起。可以按任意顺序返回结果列表。 字母异位词是由重新排列源单词的所有字母得到的一个新单词。 思路分析 示例 1: 输入: strs ["eat", "tea", "tan", "ate", &…...

Nginx日志按天分割

需求、日志按照天的单位进行分割存储。 如果你直接百度&#xff0c;可能会搜到很多教你用各种脚本或是三方插件来按天分割的&#xff0c;这边我用nginx服务本身来分割日志。 方法一 通过使用 $time_iso8601 变量和 map 指令&#xff0c;实现了日志文件按天分割的功能。以下是…...

文本摘要简介

文本摘要是从一段长文本中提取出最重要的信息&#xff0c;并生成一个简短而有意义的摘要。这个过程可以分为两种主要方法&#xff1a; 抽取式摘要&#xff08;Extractive Summarization&#xff09;&#xff1a;从原文中直接提取出关键句子或段落&#xff0c;组成摘要…...

3.MySQL面试题之Redis 和 Mysql 如何保证数据一致性?

Redis 和 MySQL 数据一致性是分布式系统中的一个常见挑战。保证数据一致性通常涉及几种策略&#xff0c;我会详细解释这些策略并提供相应的代码示例。 先更新数据库&#xff0c;再更新缓存 这种方法先更新 MySQL&#xff0c;然后更新或删除 Redis 缓存。 Transactional publ…...

浅谈TCP协议、UDP协议

一、介绍说明 TCP&#xff08;传输控制协议&#xff09; 面向连接&#xff1a;TCP在数据传输之前必须建立连接。这通过一个称为三次握手的过程来完成&#xff0c;确保连接的两端都准备好进行数据传输。 可靠性&#xff1a;TCP提供可靠的数据传输&#xff0c;确保数据包正确无…...

SQL业务题: 从不订购的客户

1️⃣题目 Customers 表&#xff1a; ---------------------- | Column Name | Type | ---------------------- | id | int | | name | varchar | ---------------------- 在 SQL 中&#xff0c;id 是该表的主键。 该表的每一行都表示客户的 ID 和名…...

怎么直接在PDF上修改内容?随心编辑PDF内容

PDF(Portable Document Format)作为一种专用于阅读而非编辑的文档格式&#xff0c;其设计的核心目的是保持文档格式的一致性&#xff0c;确保文档在不同平台和设备上都能以相同的布局和格式呈现。然而&#xff0c;在实际工作和生活中&#xff0c;我们经常需要对PDF文档进行编辑…...

聊天室项目测试报告

项目介绍 本项目是一个基于Spring Boot框架开发的聊天室应用。一个实时的文本消息交流平台&#xff0c;允许多个用户同时在线聊天。系统采用了Spring Boot作为后端框架&#xff0c;集成了WebSocket技术以实现消息的实时推送与接收提供一个简单、易用且功能完备的在线聊天环境。…...

语音识别(实时语音转录)——funasr的详细部署和使用教程(包括实时语音转录)

阿里达摩院开源大型端到端语音识别工具包FunASR&#xff1a; FunASR提供了在大规模工业语料库上训练的模型&#xff0c;并能够将其部署到应用程序中。工具包的核心模型是Paraformer&#xff0c;这是一个非自回归的端到端语音识别模型&#xff0c;经过手动注释的普通话语音识别…...

【网络编程】TCP机械臂测试

通过w(红色臂角度增大)s&#xff08;红色臂角度减小&#xff09;d&#xff08;蓝色臂角度增大&#xff09;a&#xff08;蓝色臂角度减小&#xff09;按键控制机械臂 注意&#xff1a;关闭计算机的杀毒软件&#xff0c;电脑管家&#xff0c;防火墙 1&#xff09;基于TCP服务器…...

笔记:在WPF中如何注册控件级全局事件和应用程序级全局事件

一、目的&#xff1a;在WPF中如何注册控件级全局事件和应用程序级全局事件 二、实现 应用程序级全局事件 //注册应用程序级全局事件 EventManager.RegisterClassHandler(typeof(Button), Button.ClickEvent, new RoutedEventHandler(ic_event_Click)); 如上代码既会注册全局…...

【Linux系列】telnet使用入门

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

音视频相关知识

H.264编码格式 音频 PCM就是要把声音从模拟信号转换成数字信号的一种技术&#xff0c;他的原理简单地说就是利用一个固定的频率对模拟信号进行采样。 pcm是无损音频音频文件格式...

数据结构--第七天

递归 -递归的概念 递归其实就是一种解决问题的办法&#xff0c;在C语言中&#xff1a;递归就是函数自己调用自己 -递归的思想 递归的思考方式就是把大事化小的过程 递归的递就是递推的意思&#xff0c;归就是回归的意思 &#xff08;递归是少量的代码完成大量的运算&#xff09…...

代码随想录Day34:62.不同路径、63.不同路径II、343.整数拆分、96.不同的二叉搜索树

62. 不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&…...