Hutool之DateUtil:让Java日期处理变得更加简单
前言
在Java开发中,日期和时间的处理是一个常见问题。为了简化这个过程,许多开发者会使用第三方工具包,如Hutool。Hutool是一个Java工具包,提供了许多实用的功能,其中之一就是日期处理。日期时间工具类是Hutool的核心包之一,提供针对JDK中Date和Calendar对象的封装,封装对象如下:
封装对象 | 说明 |
---|---|
DateUtil | 针对日期时间操作提供一系列静态方法 |
DateTime | 提供类似于Joda-Time中日期时间对象的封装,继承自Date类,并提供更加丰富的对象方法。 |
FastDateFormat | 提供线程安全的针对Date对象的格式化和日期字符串解析支持。 |
DateBetween | 计算两个时间间隔的类,除了通过构造新对象使用外,相关操作也已封装在DateUtil和DateTime的相关方法中。 |
TimeInterval | 一个简单的计时器类,常用于计算某段代码的执行时间,提供包括毫秒、秒、分、时、天、周等各种单位的花费时长计算。 |
DatePattern | 提供常用的日期格式化模式,包括String类型和FastDateFormat两种类型。 |
Quarter | 季度枚举 |
Month | 月份枚举 |
Week | 周枚举 |
DateUnit | 日期时间单位,表示某个时间单位对应的毫秒数,常用于计算时间差。 |
一、概述
1.1 工具简介
Hutool 的 DateUtil 工具类是 Hutool 工具库中用于日期和时间处理的核心类之一,提供了许多静态方法,用于方便地处理常见的日期和时间操作。考虑到 Java 本身对日期时间的支持有限,并且 Date 和 Calendar 对象的并存导致各种方法使用混乱和复杂,故使用此工具类做了封装。这其中的封装主要是日期和字符串之间的转换,以及提供对日期的定位。
1.2 引入依赖
在使用Hutool工具之前,我们需要将Hutool添加到项目的依赖中。如果使用Maven构建项目,可以在 pom.xml 文件中添加以下依赖:
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>${hutool.version}</version>
</dependency>
Hutool-all 是一个 Hutool 的集成打包产品,由于考虑到“懒人”用户及分不清各个模块作用的用户,“无脑”引入 hutool-all 模块是快速开始和深入应用的最佳方式。如果你想像 SpringBoot 一样引入 Hutool,再由子模块决定用到哪些模块,你可以在父模块中加入:
<dependencyManagement><dependencies><dependency><groupId>cn.hutool</groupId><artifactId>hutool-bom</artifactId><version>${hutool.version}</version><type>pom</type><!-- 注意这里是import --><scope>import</scope></dependency></dependencies>
</dependencyManagement>
然后再在子模块中就可以引入自己需要的模块了:
<dependencies><dependency><groupId>cn.hutool</groupId><artifactId>hutool-core</artifactId></dependency>
</dependencies>
二、基本使用示例
2.1 计算生日
方法 | 部分参数 | 作用 |
---|---|---|
age(Date birthday, Date dateToCompare) | birthday:生日 dateToCompare:需要对比的日期 | 计算相对于dateToCompare的年龄,常用于计算指定生日在某年的年龄 |
ageOfNow(String birthDay) | birthDay:生日,标准日期字符串 | 生日转为年龄,计算法定年龄 |
ageOfNow(Date birthDay) | birthDay:生日 | 生日转为年龄,计算法定年龄 |
getChineseZodiac(int year) | 计算生肖,只计算1900年后出生的人 | |
getZodiac(int month, int day) | 通过生日计算星座 |
2.2 获取时间属性
2.2.1 获取当前时间
Hutool 提供了多种方式获取当前时间,例如当前时间戳、当前日期字符串等等。
方法 | 部分参数 | 作用 |
---|---|---|
DateTime date() | 将当前时间转换为DateTime对象 | |
DateTime date(Calendar calendar) | 根据已有 Calendar 转换为 DateTime对象 | |
DateTime dateSecond() | 当前时间,转换 DateTime 对象,忽略毫秒部分 | |
String now() | 当前时间,格式 yyyy-MM-dd HH:mm:ss | |
String today() | 当前日期,格式 yyyy-MM-dd | |
long current() | 当前时间的时间戳 | |
long currentSeconds() | 当前时间的时间戳(秒) |
2.2.2 获取当前时间属性
方法 | 部分参数 | 作用 |
---|---|---|
int getLastDayOfMonth(Date date) | 获得本月的最后一天 | |
int thisDayOfMonth() | 当前日期所在月份的第几周 | |
int thisDayOfWeek() | 当前日期是星期几 | |
int thisHour(boolean is24HourClock) | is24HourClock - 是否24小时制 | 当前日期的小时数部分 |
int thisMinute() | 当前日期的分钟数部分 | |
int thisMillisecond() | 当前日期的毫秒数部分 | |
int thisMonth() | 当前月份,从0开始计数 | |
int thisSecond() | 当前日期的秒数部分 | |
int thisWeekOfMonth() | 当前日期所在月份的第几周 | |
int thisWeekOfYear() | 当前日期所在年份的第几周 | |
thisYear | 今年 |
// 当前时间
Date date = DateUtil.date();
System.out.println(date);// Calendar转Date
System.out.println(DateUtil.date(Calendar.getInstance()));// 时间戳转Date
System.out.println(DateUtil.date(System.currentTimeMillis()));// 当前时间字符串,格式:yyyy-MM-dd HH:mm:ss
System.out.println(DateUtil.now());// 当前日期字符串,格式:yyyy-MM-dd
System.out.println(DateUtil.today());
2.2.3 获取时间部分属性
方法 | 部分参数 | 作用 |
---|---|---|
DateTime date() | 将当前时间转换为DateTime对象 | |
int year(Date date) | 获得年的部分 | |
int month(Date date) | 获得月份,从0开始计数 | |
int hour(Date date, boolean is24HourClock) | is24HourClock - 是否24小时制 | 获得指定日期的小时数部分 |
int minute(Date date) | 获得指定日期的分钟数部分 | |
int second(Date date) | 获得指定日期的秒数部分 | |
int millisecond(Date date) | 获得指定日期的毫秒数部分 |
Date date = DateUtil.date();// 获得年的部分
int year = DateUtil.year(date);// 获得月份,从0开始计数
int month = DateUtil.month(date);// 获得月份枚举
DateUtil.monthEnum(date).getValue();
2.2.4 获取指定时间属性
方法 | 部分参数 | 作用 |
---|---|---|
int dayOfMonth(Date date) | 获得指定日期是这个日期所在月份的第几天 | |
int dayOfWeek(Date date) | 获得指定日期是星期几,1表示周日,2表示周一 | |
dayOfWeekEnum | 获得指定日期是星期几 | |
int dayOfYear(Date date) | 获得指定日期是这个日期所在年的第几天 | |
int quarter(Date date) | 获得指定日期所属季度,从1开始计数 | |
String yearAndQuarter(Date date) | 获得指定日期年份和季节。例如[20131]表示2013年第一季度 | |
int lengthOfMonth(int month,boolean isLeapYear) | isLeapYear - 是否闰年 | 获得指定月份的总天数 |
int lengthOfYear(int year) | 获得指定年份的总天数 | |
int millisecond(Date date) | 获得指定日期的毫秒数部分 | |
int minute(Date date) | 获得指定日期的分钟数部分 |
2.3 获取某时间的开始、结束日期
有的时候我们需要获得每天的开始时间、结束时间,每月的开始和结束时间等等,DateUtil也提供了相关方法:
方法 | 部分参数 | 作用 |
---|---|---|
DateTime beginOfYear(Date date) | 获取某年的开始时间 | |
DateTime endOfYear(Date date) | 获取某年的结束时间 | |
DateTime beginOfQuarter(Date date) | 获取某季度的开始时间 | |
DateTime endOfQuarter(Date date) | 获取某季度的结束时间 | |
DateTime beginOfMonth(Date date) | 获取某月的开始时间 | |
DateTime endOfMonth(Date date) | 获取某月的结束时间 | |
DateTime beginOfWeek(Date date) | 获取某周的开始时间,周一为一周的开始 | |
beginOfWeek(Date date,boolean isMondayAsFirstDay) | isMondayAsFirstDay:是否周一做为一周的第一天 | 获取某周的开始时间 |
DateTime endOfWeek(Date date) | 获取某周的结束时间,周日为一周的结束 | |
endOfWeek(Date date,boolean isSundayAsLastDay) | isSundayAsLastDay:是否周日做为一周的最后一天 | 获取某周的结束时间 |
DateTime beginOfDay(Date date) | 获取某天的开始时间 | |
DateTime endOfDay(Date date) | 获取某天的结束时间 | |
beginOfHour(Date date) | 获取某小时的开始时间 | |
endOfHour(Date date) | 获取某小时的结束时间 | |
beginOfMinute(Date date) | 获取某分钟的开始时间 | |
endOfMinute(Date date) | 获取某分钟的结束时间 | |
beginOfSecond(Date date) | ||
DateTime beginOfSecond(Date date) | 获取秒级别的开始时间,即毫秒部分设置为0 |
String dateStr = "2022-11-09 22:33:23";
Date date = DateUtil.parse(dateStr);// 一天的开始,结果:2022-11-09 00:00:00
Date beginOfDay = DateUtil.beginOfDay(date);// 一天的结束,结果:2022-11-09 23:59:59
Date endOfDay = DateUtil.endOfDay(date);// 获取秒级别的开始时间,即毫秒部分设置为0
System.out.println(DateUtil.beginOfSecond(date));// 获取某周的开始时间
System.out.println(DateUtil.beginOfWeek(date));
2.4 日期时间计算
Hutool 提供了丰富的日期计算方法,例如获取某天的开始时间、结束时间,计算两个日期之间的天数、小时等等。
2.4.1 日期时间比较
方法 | 部分参数 | 作用 |
---|---|---|
int compare(Date date1,Date date2) | 日期比较。 如果date1 < date2,小于0,date1==date2返回0,date1 > date2 大于0 | |
boolean isIn(Date date,Date beginDate, Date endDate) | 当前日期是否在日期指定范围内 | |
boolean isSameDay(Date date1,Date date2) | 比较两个日期是否为同一天 | |
boolean isSameMonth(Date date1,Date date2) | 比较两个日期是否为同一月 | |
boolean isSameTime(Date date1,Date date2) | 比较两个日期的时间戳是否相同 | |
boolean isSameWeek(Date date1,Date date2) | 比较两个日期是否为同一周 |
2.4.2 日期时间偏移计算
日期或时间的偏移指针对某个日期增加或减少分、小时、天等等,达到日期变更的目的。Hutool也针对其做了大量封装:
方法 | 部分参数 | 作用 |
---|---|---|
offset(Date date, DateField dateField, int offset) | offset - 偏移量,正数为向后偏移,负数为向前偏移 | 获取指定日期偏移指定时间后的时间, 生成的偏移日期不影响原日期 |
offsetDay(Date date, int offset) | 偏移天 | |
offsetHour(Date date, int offset) | 偏移小时 | |
offsetMillisecond(Date date, int offset) | 偏移毫秒数 | |
offsetMinute(Date date, int offset) | 偏移分钟 | |
offsetMonth(Date date, int offset) | 偏移月 | |
offsetSecond(Date date, int offset) | 偏移秒数 | |
offsetWeek(Date date, int offset) | 偏移周 |
tring dateStr = "2022-11-09 22:33:23";
Date date = DateUtil.parse(dateStr);//结果:2022-11-11 22:33:23
Date newDate = DateUtil.offset(date, DateField.DAY_OF_MONTH, 2);//常用偏移,结果:2023-11-12 22:33:23
DateTime newDate2 = DateUtil.offsetDay(date, 3);//常用偏移,结果:22023-11-09 19:33:23
DateTime newDate3 = DateUtil.offsetHour(date, -3);
针对当前时间,提供了简化的偏移方法(例如昨天、上周、上个月等):
方法 | 部分参数 | 作用 |
---|---|---|
yesterday | 昨天 | |
tomorrow | 明天 | |
lastWeek | 上周 | |
nextWeek | 下周 | |
lastMonth | 上个月 | |
nextMonth | 下个月 |
2.4.3 计算两个时间之差
有时候我们需要计算两个日期之间的时间差(相差天数、相差小时数等等),Hutool将此类方法封装为between方法:
方法 | 部分参数 | 作用 |
---|---|---|
between(Date beginDate, Date endDate, DateUnit unit) | beginDate:起始日期 endDate:结束日期 unit:相差的单位 | 判断两个日期相差的时长,只保留绝对值 |
between(Date beginDate, Date endDate, DateUnit unit, boolean isAbs) | beginDate:起始日期 endDate:结束日期 unit:相差的单位 | 判断两个日期相差的时长 |
betweenMs(Date beginDate, Date endDate) | beginDate:起始日期 endDate:结束日期 | 判断两个日期相差的毫秒数 |
betweenDay(Date beginDate, Date endDate, boolean isReset) | beginDate:起始日期 endDate:结束日期 isReset:是否重置时间为起始时间 | 判断两个日期相差的天数。 |
betweenWeek(Date beginDate, Date endDate, boolean isReset) | beginDate:开始时间 endDate:结束时间 isReset:是否重置时间为起始时间 | 计算指定时间区间内的周数 |
betweenMonth | 计算两个日期相差月数。 | |
betweenYear | 计算两个日期相差年数。 |
String dateStr1 = "2022-11-09 22:33:23";
Date date1 = DateUtil.parse(dateStr1);String dateStr2 = "2022-12-09 23:33:23";
Date date2 = DateUtil.parse(dateStr2);// 相差一个月,31天
long betweenDay = DateUtil.between(date1, date2, DateUnit.DAY);Date startDate=DateUtil.parse("2021-04-20 02:00:00");
Date endDate=DateUtil.parse("2021-04-21 05:10:00");
long week=DateUtil.between(startDate,endDate,DateUnit.WEEK); //相差周数
long day=DateUtil.between(startDate,endDate,DateUnit.DAY); //相差天数
long hour=DateUtil.between(startDate,endDate,DateUnit.HOUR); //相差小时数
long minute=DateUtil.between(startDate,endDate,DateUnit.MINUTE);//相差分钟数
long second=DateUtil.between(startDate,endDate,DateUnit.SECOND);//相差秒数
long millis=DateUtil.between(startDate,endDate,DateUnit.MS); //相差毫秒数
2.5 日期解析
方法 | 部分参数 | 作用 |
---|---|---|
parse(CharSequence dateCharSequence) | 将日期字符串转换为 Date 对象 | |
parse(CharSequence dateStr, DateFormat dateFormat) | dateStr:Date字符串 dateFormat:格式化器 SimpleDateFormat | |
parse(CharSequence dateStr, DateParser parser) | dateStr:Date字符串 parser:格式化器 FastDateFormat | |
parse(CharSequence dateStr,DateParser parser,boolean lenient) | dateStr:Date字符串 parser:格式化器 FastDateFormat lenient:是否宽容模式 | |
parse(CharSequence dateStr, DateTimeFormatter formatter) | dateStr:Date字符串 formatter:格式化器 DateTimeFormatter | |
parse(CharSequence dateStr, String format) | dateStr:特定格式的日期 format:格式,例如yyyy-MM-dd | 将特定格式的日期转换为Date对象 |
parse(CharSequence dateStr, String format, Locale locale) | dateStr:特定格式的日期 format:格式,例如yyyy-MM-dd locale:区域信息 | 将特定格式的日期转换为Date对象 |
parse(String str, String… parsePatterns) | 通过给定的日期格式解析日期时间字符串 | |
parseDate(CharSequence dateCharSequence) | 解析日期字符串 | |
parseDateTime(CharSequence dateCharSequence) | 解析日期时间字符串 | |
parseLocalDateTime(CharSequence dateCharSequence) | 构建LocalDateTime对象 | |
parseTime(CharSequence dateCharSequence) | 解析时间,格式HH:mm:ss, | |
parseTimeToday(CharSequence dateCharSequence) | 解析时间,格式HH:mm或HH:mm:ss | |
parseUTC(String utcString) | 解析UTC时间 |
String dateStr = "2022-11-09";
Date date = DateUtil.parse(dateStr);Date date = DateUtil.parse(dateStr, "yyyy-MM-dd");
2.6 日期格式化
2.6.1 格式化日期时间
Hutool 对日期进行了非常详细的封装,可以有效避免我们自己的日期格式出现混乱的情况。而且 hutool 为我们提供了多个日期格式解析,转换成 yyyy-MM-dd HH:mm:ss
格式,同时我们可以引用这些日期格式:
方法 | 部分参数 | 作用 |
---|---|---|
format(Date date, DateFormat format) | 将 Date 对象格式化为指定的字符串 | |
format(Date date, String format) | 根据特定格式格式化日期 | |
formatChineseDate(Date date,boolean isUppercase,boolean withTime) | date - 被格式化的日期 isUppercase - 是否采用大写形式 withTime - 是否包含时间部分 | 格式化为中文日期格式。 |
formatDate(Date date) | 格式化日期部分(不包括时间) | |
formatDateTime(Date date) | 格式化日期时间 | |
formatHttpDate(Date date) | 格式化为Http的标准日期格式 | |
formatLocalDateTime | 格式化日期时间 | |
formatTime(Date date) | 格式化时间 |
String dateStr = "2023-11-09";
Date date = DateUtil.parse(dateStr);//结果 2017/03/01
String format = DateUtil.format(date, "yyyy/MM/dd");//常用格式的格式化,结果:2023-11-09
String formatDate = DateUtil.formatDate(date);//结果:2023-11-09 00:00:00
String formatDateTime = DateUtil.formatDateTime(date);//结果:00:00:00
String formatTime = DateUtil.formatTime(date);
2.6.2 格式化时间差
有时候我们希望看到易读的时间差,比如XX天XX小时XX分XX秒,此时使用DateUtil.formatBetween方法:
方法 | 部分参数 | 作用 |
---|---|---|
formatBetween(Date beginDate, Date endDate) | 格式化日期间隔输出,精确到毫秒 | |
formatBetween(Date beginDate, Date endDate, BetweenFormatter.Level level) | 格式化日期间隔输出 | |
formatBetween(long betweenMs) | 格式化日期间隔输出,精确到毫秒 | |
formatBetween(long betweenMs, BetweenFormatter.Level level) | 格式化日期间隔输出 |
【说明】BetweenFormatter 即格式化等级枚举,支持DAY(天)、HOUR(小时)、MILLISECOND(毫秒)、MINUTE(分钟)、SECOND(秒)等。
Date startDate=DateUtil.parse("2021-04-20 02:00:00");
Date endDate=DateUtil.parse("2021-04-21 05:10:00");//相差毫秒数
long millis=DateUtil.between(startDate,endDate,DateUnit.MS);
//相差1天(天)
String formatDay = DateUtil.formatBetween(millis, BetweenFormatter.Level.DAY);
//相差1天3小时(小时)
String formatHour = DateUtil.formatBetween(millis, BetweenFormatter.Level.HOUR);
//相差1天3小时10分(分钟)
String formatMinute = DateUtil.formatBetween(millis, BetweenFormatter.Level.MINUTE);
//相差1天3小时10分(秒)
String formatSecond = DateUtil.formatBetween(millis, BetweenFormatter.Level.SECOND);
//相差1天3小时10分(毫秒)
String formatMillis = DateUtil.formatBetween(millis, BetweenFormatter.Level.MILLISECOND);
2.7 其他
2.7.1 日期时间判断
Hutool 可以方便地判断日期是否在某个范围内、是否是周末等等。
方法 | 部分参数 | 作用 |
---|---|---|
boolean isAM(Date date) | 是否为上午 | |
boolean isLastDayOfMonth | 是否为本月最后一天 | |
boolean isLeapYear(int year) | 判断指定年份是否是闰年 | |
boolean isOverlap(Date realStartTime,Date realEndTime,Date startTime,Date endTime) | 检查两个时间段是否有时间重叠 | |
boolean isPM(Date date) | 是否为下午 | |
boolean isWeekend(Date date) | date - 判定的日期Date | 是否为周末(周六或周日) |
// 定义时间范围
Date startDate = DateUtil.parse("2025-04-01");
Date endDate = DateUtil.parse("2025-04-30");// 需要判断的日期
Date date = DateUtil.parse("2025-04-18");
// 判断日期是否在范围内
boolean isInRange = DateUtil.isIn(date, startDate, endDate);
System.out.println("isInRange = " + isInRange);// 判断是否是周末
boolean isWeekend = DateUtil.isWeekend(date);
System.out.println("日期是否是周末:" + isWeekend);
2.7.2 时间计时
方法 | 部分参数 | 作用 |
---|---|---|
String secondToTime(int seconds) | 秒数转为时间格式(HH:mm:ss) | |
long spendMs(long preTime) | 计时,常用于记录某段代码的执行时间,单位:毫秒 | |
long spendNt(long preTime) | 计时,常用于记录某段代码的执行时间,单位:纳秒 | |
timer() | 计算某个过程花费的时间,精确到毫秒 | |
timer(boolean isNano) | isNano - 是否使用纳秒计数,false则使用毫秒 | 计算某个过程花费的时间,精确到毫秒 |
int timeToSecond(String timeStr) | HH:mm:ss时间格式字符串转为秒数 |
三、总结
通过学习 Hutool 工具库中的 DateUtil 工具类,我们可以方便地处理日期和时间相关的操作。它提供了许多实用的方法,可以简化我们在日常开发中的日期处理工作,提高开发效率,减少出错的可能性。而且 DateUtil 在实现上进行了性能优化,对常见的日期和时间操作进行了高效处理,同时尽量避免了线程安全问题。
Hotool 不仅仅只有这一种工具类,还包含了其他许多工具类。在这里我作为一名Hutool的用户,我感谢Hutool的创作者和维护者们为我们带来如此强大便捷的工具库,希望Hutool功能越来越完善,为我们的开发工作带来更多的便利。同时也祝愿所有开发者没有BUG困扰,能够愉快地编写出高效、功能完善的程序。
相关文章:
Hutool之DateUtil:让Java日期处理变得更加简单
前言 在Java开发中,日期和时间的处理是一个常见问题。为了简化这个过程,许多开发者会使用第三方工具包,如Hutool。Hutool是一个Java工具包,提供了许多实用的功能,其中之一就是日期处理。日期时间工具类是Hutool的核心包…...
解锁古籍中的气候密码,探索GPT/BERT在历史灾害研究中的前沿应用;气候史 文本挖掘 防灾减灾;台风案例、干旱案例、暴雨案例
历史灾害文献分析方法论的研究,是连接过去与未来的关键桥梁。通过对古籍、方志、档案等非结构化文本的系统性挖掘与量化分析,不仅能够重建千年尺度的灾害事件序列(如台风、洪旱等),弥补仪器观测数据的时空局限性&#…...
DeepSeek-R3、GPT-4o 与 Claude-3.5-Sonnet 全面对比:性能、应用场景与技术解析
随着大模型技术的迅猛发展,国产模型正逐渐崭露头角,尤其是DeepSeek-R3的发布,更是在AI技术社区中引起广泛关注。而与此同时,国际领先的GPT-4o和Claude-3.5-Sonnet也在不断迭代升级,持续刷新业界对AI能力的认知。下文将…...
智能翻译播放器,让无字幕视频不再难懂
打工人们你们好!这里是摸鱼 特供版~ 今天给大家带来一款超牛的黑科技——Splayer,完全免费的智能翻译播放器,让你轻松看懂无字幕视频! 推荐指数:★★★★★ 软件简介 Splayer 是一款完全免费的智能翻译播放器&#…...
快手本地生活2024年GMV同增200%,“新线城市+AI”将成增长引擎
4月17日,“新线大市场,AI新机遇”快手本地生活2025聚力大会在沈阳召开。 会上,快手高级副总裁、本地生活事业部负责人笑古在聚力大会上表示,“新线城市AI”将成为快手本地生活的增长引擎。 据「TMT星球」了解,2024年…...
第七篇:系统分析师第三遍——1、2章
目录 一、目标二、计划三、完成情况四、意外之喜(最少2点)1.计划内的明确认知和思想的提升标志2.计划外的具体事情提升内容和标志 五、总结 一、目标 通过参加考试,训练学习能力,而非单纯以拿证为目的。 1.在复习过程中,训练快速阅读能力、掌…...
2025妈妈杯数学建模D题完整分析论文(共42页)(含模型建立、代码)
2025 年第十五届 MathorCup 数学建模D题完整分析论文 目录 摘要 一、问题分析 二、问题重述 三、模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1思路分析 4.1.2问题1模型建立 4.1.3问题1样例代码(MATLAB和Python) 4.1.4问题1结果…...
软考高级-系统架构设计师 论文范文参考(一)
文章目录 论SOA技术的应用论SOA在企业信息化中的应用论UP(统一过程方法)的应用论分布式数据库的设计与实现论改进Web服务器性能的有关技术论基于UML的需求分析论基于构件的软件开发论基于构件的软件开发(二) 论SOA技术的应用 摘要: 本人于…...
江湖路远,唯PUT可稳:Express 路由更新招式全解
前言 江湖传闻,后端开发如同修炼绝世武功:有人精通 POST 掌,横扫千军;有人修习 GET 指法,探查万象。而真正踏入高阶境界的高手,常常默默修炼一门冷门却威力极强的秘技,PUT 神功。 今日时机正好,你我相逢于码海江湖,不如来一场技术切磋,也许能悟出更新之道,功力再上…...
【k8s系列1】一主两从结构的环境准备
环境准备 虚拟机软件准备及安装,这里就不详细展开了,可以看文章:【一、虚拟机vmware安装】 linux环境准备及下载,下载镜像centOS7.9,以前也有写过这个步骤的文章,可以看:【二、安装centOS】 开始进入正题…...
通过特定协议拉起 electron 应用
在 Android 通过 sheme 协议可以拉起其他应用。 electron 应用也可以通过类似特定协议被拉起。 在同时有 web、客户端的应用里,可以通过这种方式在 web 拉起客户端。 支持拉起客户端 const PROTOCOL xxxif (process.defaultApp) {// 这里是开发环境,有…...
IDEA MyBatisCodeHelper Pro插件高版本解密
声明,该方法仅仅作为个人研究学习使用,请勿传播 版本说明 系统:macOS(Windows同理)IDE:IntelliJ IDEA 2024.4MyBatisCodeHelper Pro 3.4 环境准备 从插件市场下载MyBatisCodeHelper Pro 找到MyBatisCo…...
网站制作公司哪家好?如何选择靠谱的网站设计公司
在当今数字化时代,企业想要在互联网上立足,一个专业、美观且功能强大的网站是必不可少的。然而,面对众多的网站建设公司,如何选择一家真正适合自己需求的合作伙伴,成为了许多企业主和创业者面临的难题。毕竟࿰…...
Linux之基础命令
Linux作为开源操作系统的代表,以其高效、灵活和强大的命令行工具闻名。无论是系统管理、开发调试还是日常使用,掌握基础命令都是与Linux系统交互的必备技能。本文整理了20个最常用的Linux基础命令,帮助新手快速入门。 目录 目录与文件导航文…...
使用手机归属地查询API,使效率事半功倍
手机归属地查询API通过查询手机号码的归属地信息,为企业提供了一个高效、便捷的解决方案,帮助企业在竞争激烈的市场中脱颖而出。 代码示例 请求参数说明: 名称必填类型说明key是string个人中心查看phone是int手机号 返回参数说明: 名称类型说明phon…...
基于FPGA的AES加解密系统verilog实现,包含testbench和开发板硬件测试
目录 1.课题概述 2.系统测试效果 3.核心程序与模型 4.系统原理简介 4.1 字节替换(SubBytes) 4.2 行移位(ShiftRows) 4.3 列混合(MixColumns) 4.4 轮密钥加(AddRoundKey) 4.…...
【AI部署】腾讯云GPU -—SadTalker的AI数字人访问web服务—未来之窗超算中心
访问部署在Cloud Studio上的web服务 当你把该项目部署在本地时,访问该服务的请求地址为http://localhost:8080/hello;当你把该项目部署在Cloud Studio工作台启动时,要想访问到该服务,需要先在工作台右侧打开访问链接面板ÿ…...
Linux:命令行参数、环境变量
命令行参数 执行程序时,可以从命令行传值给 C 程序。这些值被称为命令行参数,它们对程序很重要,特别是当我们想从外部控制程序,而不是在代码内对这些值进行硬编码时,就显得尤为重要了。 在 C 语言中,命令…...
Linux CentOS 更改MySQL数据库目录位置
在 CentOS 系统上更改 MySQL(或 MariaDB)数据库目录位置(datadir)需要谨慎操作,以避免数据丢失或服务启动失败。以下是详细步骤: 1. 停止 MySQL/MariaDB 服务 bash 复制 sudo systemctl stop mysqld …...
Unity-微信截图功能简单复刻-03绘制空心矩形
思路-绘制空心矩形 拓展UGUI的Graphic类,实现拖拽接口。 开始拖拽时记录鼠标位置, 使用拖拽中的鼠标位置和记录的位置,计算矩形顶点,绘制矩形。 两个三角形合并为一个矩形,作为空心矩形的一条边,四个边合并为空心矩形…...
Flutter与FastAPI的OSS系统实现
作者:孙嘉成 目录 一、对象存储 二、FastAPI与对象存储 2.1 缤纷云S4服务API对接与鉴权实现 2.2 RESTful接口设计与异步路由优化 三、Flutter界面与数据交互开发 3.1 应用的创建 3.2页面的搭建 3.3 文件的上传 关键词:对象存储、FastAPI、Flutte…...
环境搭建与入门:Flutter SDK安装与配置
环境搭建与入门:Flutter SDK安装与配置 一、Flutter开发环境概述 1.1 Flutter开发环境组成 Flutter开发环境主要包含以下几个关键组件: Flutter SDK:Flutter的核心开发工具包Dart SDK:Flutter使用的编程语言环境IDE/编辑器&am…...
MATLAB 控制系统设计与仿真 - 35
MATLAB鲁棒控制器分析 所谓鲁棒性是指控制系统在一定(结构,大小)的参数扰动下,维持某些性能的特征。 根据对性能的不同定义,可分为稳定鲁棒性(Robust stability)和性能鲁棒性(Robust performance)。 以闭环系统的鲁棒性作为目标设计得到的…...
多模态记忆融合:基于LSTM的连续场景生成——突破AI视频生成长度限制
一、技术背景与核心挑战 2025年视频生成领域面临的关键难题是长时程连贯性——传统方法在生成超过5分钟视频时会出现场景跳变、物理规则不一致等问题。本研究提出时空记忆融合架构(ST-MFA),通过LSTM记忆门控与多模态对齐技术,在R…...
架构师面试(三十二):注册中心数据结构
问题 提到【注册中心】,我们对它的基本功能,肯定可以顺手拈来,比如:【服务注册】【服务发现】【健康检查】【变更通知】等。 透过这些基本功能,一个普适的注册中心的数据结构应该如何设计呢? 可以结合着…...
Oracle 19c新特性:OCP认证考试与职业跃迁的关键?
在数字化转型的浪潮中,Oracle 19c作为数据库领域的旗舰版本,不仅承载着技术革新的使命,更成为IT从业者职业进阶的“黄金跳板”。无论是企业级应用的高可用性需求,还是云原生架构的快速迭代,Oracle 19c的智能化与多模型…...
360蜘蛛IP完整版,360搜索引擎蜘蛛IP列表.pdf
360搜索的蜘蛛在访问网站时,都会带上带有360spider签名信息的UA,其形态为: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36; 360Spider 为满足站长朋友们的需求&a…...
C++_设计模式\_观察者模式(Observer Pattern)
👋 Hi, I’m liubo👀 I’m interested in harmony🌱 I’m currently learning harmony💞️ I’m looking to collaborate on …📫 How to reach me …📇 sssssdsdsdsdsdsdasd🎃 dsdsdsdsdsddfsg…...
23种设计模式全面解析
设计模式是解决软件设计中常见问题的经典方案。根据《设计模式:可复用面向对象软件的基础》(GoF),23种设计模式分为以下三类: 一、创建型模式(5种) 目标:解耦对象的创建过程&#x…...
学术AI工具推荐
一、基础信息对比 维度知网研学AI(研学智得AI)秘塔AIWOS AI开发公司同方知网(CNKI)上海秘塔网络科技Clarivate Analytics是否接入DeepSeek✅ 深度集成(全功能接入DeepSeek-R1推理服务)✅ 通过API接入DeepS…...
Agent的九种设计模式 介绍
Agent的九种设计模式 介绍 一、ReAct模式 原理:将推理(Reasoning)和行动(Acting)相结合,使Agent能够在推理的指导下采取行动,并根据行动的结果进一步推理,形成一个循环。Agent通过生成一系列的思维链(Thought Chains)来明确推理步骤,并根据推理结果执行相应的动作,…...
Python如何助力区块链网络安全?从攻击防范到智能合约审计
Python如何助力区块链网络安全?从攻击防范到智能合约审计 引言:区块链安全,真的安全吗? 区块链作为去中心化技术的代表,被誉为“不可篡改”的分布式账本。但事实真的如此吗?现实世界中,智能合约漏洞、私钥泄露、交易欺诈等安全问题层出不穷,让区块链网络安全成为一个关…...
磁流变式汽车减振器创新设计与关键技术研究
摘要 本文针对智能悬架系统的发展需求,深入探讨磁流变减振器(MR Damper)的核心设计原理与工程实现路径。通过建立磁场-流场耦合模型,优化磁路结构与控制策略,提出具有快速响应特性的新型磁流变减振器设计方案…...
Kafka 时间轮
Kafka存在大量的延迟操作,比如延迟删除、延迟拉取等。Kafka基于时间轮概念自定义了一个用于延迟操作的定时器。 JDK自带的Timer和DelayQueue缺陷 Timer和DelayQueue都可以插入多个定时任务,它们都使用一个优先级队列来管理任务,复杂度为O(l…...
加锁注意事项
结论: 1:加锁前不能有可能异常的代码结构,原因:没加锁,直接因为上边的异常走finall解锁,导致不必要的问题 2:加锁后,try之前。有异常代码,导致无法走到try进行解锁.后果&…...
Vue3+Vite+TypeScript+Element Plus开发-22.客制Table组件
系列文档目录 Vue3ViteTypeScript安装 Element Plus安装与配置 主页设计与router配置 静态菜单设计 Pinia引入 Header响应式菜单缩展 Mockjs引用与Axios封装 登录设计 登录成功跳转主页 多用户动态加载菜单 Pinia持久化 动态路由 -动态增加路由 动态路由-动态删除…...
hive的基础配置优化与数仓流程
1.HDFS副本数 dfs.replication(HDFS) 文件副本数,通常设为3,不推荐修改。 如果测试环境只有二台虚拟机(2个datanode节点),此值要修改为2。 2.Yarn基础配置 2.1NodeManager配置 2.1.1CPU配置 …...
制作一个简单的操作系统3
打印一个 hello 在 INT 10H 中断中的作用 INT 10H 是 BIOS 提供的中断, 当 AH 寄存器的值被设置为 0x0e 时,INT 10H 中断就会以 TTY 模式工作。 mov ah, 0x0e ;tty模式 mov al, H int 0x10 mov al, e int 0x10 mov al, l int 0x10 int 0x10 ; l is stil…...
linux ptrace 图文详解(六) gdb单步调试
目录 一、gdb单步调试介绍 二、单步调试原理 三、MDSCR_EL1对单步调试的支持、及起作用时机 四、代码实现 五、总结 (代码:linux 6.3.1,架构:arm64) One look is worth a thousand words. —— Tess Flanders …...
51、项⽬中的权限管理怎么实现的
答:权限管理有三个很重要的模块; (1)⽤⼾模块:可以给⽤⼾分配不同的⻆⾊ (2)⻆⾊模块:可以授于⽤⼾不同的⻆⾊,不同的⻆⾊有不同权限 (3)权限模块:⽤于管理系统中的权限接⼝,为⻆⾊提供对…...
第五章 SQLite数据库:4、SQLite 进阶用法:常见的约束、PRAGMA 配置、数据操作
SQLite PRAGMA PRAGMA 命令用于查询和设置 SQLite 数据库的环境配置,可以帮助管理数据库的行为和性能。 语法 查询 PRAGMA 值: PRAGMA pragma_name;设置 PRAGMA 值: PRAGMA pragma_name value;常见 PRAGMA 示例 1. auto_vacuum Pragma…...
Windows系统安装Boost库
安装Boost库 下载Boost库源码 Boost Downloads 从Boost官方网站下载源码。请访问Boost官网,选择适合您系统的版本进行下载。下载完成后,解压源文件到您选择的目录。 使用Bootstrap脚本准备编译 在Boost源码的根目录下,找到bootstrap.bat文件…...
2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(三级)答案 + 解析
青少年软件编程(Python)等级考试试卷(三级) 分数:100 题数:38 一、单选题(共25题,共50分) 1. 学校进行体育跳远期末考试,每人有三次机会,取最远的一次作为最后成绩,1班的成绩如下,CLASS1=[[‘李明’,150,152,147],[‘王红’,146,143,146],[‘刘岩’,148,152,150],[…...
Git 解决“Filename too long”问题
在 Windows 系统中使用 Git 时,遇到 Filename too long 错误通常是由于系统默认的路径长度限制(260 字符)导致的。以下是综合多种场景的解决方案: 一、快速解决方法 启用 Git 长路径支持 通过 Git 配置命令允许处理超长文件名&am…...
DeepSeek 助力 Vue3 开发:打造丝滑的日历(Calendar),日历_自定义单元格大小示例(CalendarView01_07)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
麦科信汽车诊断示波器在机车维修领域中的应用实例
麦科信汽车诊断示波器在机车维修领域中的应用实例 “Micsig SATO1004的错误帧统计功能与历史波形存储,让我们在诊断间歇性CAN故障时有了决定性武器。这不仅是工具升级,更是维修理念的革新。” — Ian Coffey, Mototek技术总监(欧洲ECU诊…...
Zookeeper 概述
Zookeeper 概述 Zookeeper 概述与使用指南什么是Zookeeper?Zookeeper的主要作用使用Zookeeper的框架典型使用场景1. 配置管理2. 分布式锁3. 服务注册与发现 Zookeeper的缺陷与其他协调服务的比较实际案例:Kafka使用Zookeeper最佳实践 Zookeeper 概述与使…...
leetcode 188. Best Time to Buy and Sell Stock IV
目录 题目描述 第一步,明确并理解dp数组及下标的含义 第二步,分析明确并理解递推公式 1.求dp[i][j].holding 2.求dp[i][j].sold 第三步,理解dp数组如何初始化 第四步,理解遍历顺序 代码 题目描述 这道题把第123题推广为一…...
Kubernetes》》k8s》》Namespace
Namespace 概述 Namespace(命名空间) 是 Kubernetes 中用于逻辑隔离集群资源的机制,可将同一集群划分为多个虚拟环境,适用于多团队、多项目或多环境(如开发、测试、生产)的场景。 核心作用: 资…...
如何在米尔-STM32MP257开发板上部署环境监测系统
本文将介绍基于米尔电子MYD-LD25X开发板(米尔基于STM35MP257开发板)的环境监测系统方案测试。 摘自优秀创作者-lugl4313820 一、前言 环境监测是当前很多场景需要的项目,刚好我正在论坛参与的一个项目:Thingy:91X 蜂窝物联网原型…...