Java 基础知识04 Date、Calendar、LocalDateTime、SimpleDateFormat详细使用以及String字符串常用方法
1.Date
Date类表示特定的瞬间,精确到毫秒。
对于Date,很多方法已经过时迁移到了Calendar类上,但是这是最初的时间类,有2种方法可以创建Date对象(需要掌握)。
1.1 构造方法
(1) public Date()
创建一个代表系统当前日期的Date对象
分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒)。
Date date = new Date(); System.out.println(date);
控制台输出:
Wed Feb 23 15:11:07 CST 2022
(2)public Date(long date)
根据给定的毫秒值创建日期对象。
long time = System.currentTimeMillis(); Date date = new Date(time); System.out.println(date);
控制台输出:
Wed Feb 23 15:14:58 CST 2022
1.2 日期转毫秒值
public long getTime()
通过getTime方法可以将一个日期类型转换为long类型的毫秒值
Date date = new Date(); System.out.println(date.getTime());
控制台输出:
1645600802325
1.3 毫秒值转日期
public void setTime(long time)
long time = System.currentTimeMillis(); Date date = new Date(); date.setTime(time); System.out.println(date);
控制台输出:
Wed Feb 23 15:24:14 CST 2022
2.Calendar
在实际项目当中,我们经常会涉及到对时间的处理,例如登陆网站,我们会看到网站首页显示XXX,欢迎您!今天是XXXX年。。。。
对于这些经常需要处理的问题,Java中提供了Calendar这个专门用于对日期进行操作的类,那么这个类有什么特殊的地方呢,首先我们来看Calendar的声明
public abstract class Calendar extends Object implements Serializable, Cloneable, Comparable<Calendar>
该类被abstract所修饰,说明不能通过new的方式来获得实例,对此,Calendar提供了一个类方法getInstance,以获得此类型的一个通用的对象,getInstance方法返回一个Calendar对象(该对象为Calendar的子类对象),其日历字段已由当前日期和时间初始化:
2.1 获取年、月、日、时、分、秒
public static void main(String[] args) { Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); //Calendar在月份上的常数值从Calendar.JANUARY开始是0,到Calendar.DECEMBER的11,所以如果想要显示传回值的真正意涵,可以如下撰写: //String[] months = {"一月", "二月", "三月", "四月","五月", "六月", "七月", "八月","九月", "十月", "十一月", "十二月"}; int month=calendar.get(Calendar.MONTH)+1; int day=calendar.get(Calendar.DAY_OF_MONTH); // 获取时 int hour = calendar.get(Calendar.HOUR); // int hour = calendar.get(Calendar.HOUR_OF_DAY); // 24小时表示 // 获取分 int minute = calendar.get(Calendar.MINUTE); // 获取秒 int second = calendar.get(Calendar.SECOND); // 星期,英语国家星期从星期日开始计算 int weekday = calendar.get(Calendar.DAY_OF_WEEK)-1; System.out.println("现在是" + year + "年" + month + "月" + day + "日" + hour + "时" + minute + "分" + second + "秒" + "星期" + weekday); }
控制台输出:
现在是2022年2月23日4时34分13秒星期3
3.LocalDateTime
之前在做项目的过程中,对日期时间类没有一个系统的了解,总是在用的时候去搜索一下,解决问题即完事,久而久之,导致对这个概念特别模糊。直到近期,做项目的过程中使用了mybatis-plus框架,这个框架自动生成映射文件的工具会将MySQL中的datetime类型转化成Java中的LocalDateTime类型,由于几次都出现了转化错误、转化繁琐的问题,因此,就打算详细的了解一下Java中的时间类的相关知识
Java的Date,Calendar类型使用起来并不是很方便,而且Date类有着线程不安全等诸多弊端。同时若不进行封装,会在每次使用时特别麻烦。于是Java8推出了线程安全、简易、高可靠的时间包。并且数据库中也支持LocalDateTime类型,在数据存储时候使时间变得简单。Java8这次新推出的包括三个相关的时间类型:LocalDateTime年月日时分秒;LocalDate日期;LocalTime时间;三个包的方法都差不多。
public final class LocalDateTime extends Object implements Temporal, TemporalAdjuster, ChronoLocalDateTime<LocalDate>, Serializable
3.1 获取当前时间
方法说明:从指定时区的系统时钟获取当前的日期时间。
public static LocalDateTime now()
使用案例:
System.out.println(LocalDateTime.now());
控制台输出:
2022-02-23T16:35:41.042
3.2 格式化日期(常用)
案例1:方法说明:使用指定的格式化程序格式化此日期时间。
public String format(DateTimeFormatter formatter)
使用案例:
public static void main(String[] args) { //java1.7 Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); System.out.println(sdf.format(date)); //java1.8 LocalDateTime localDateTime = LocalDateTime.now(); System.out.println(localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"))); }
控制台输出:
2022-02-23 04:38:15 2022-02-23 04:38:15
案例2:
public static void main(String[] args) { String stp = DateTimeFormatter.ofPattern("yyyyMMdd HHmmss").format(LocalDateTime.now()); System.out.println(stp); }
3.3 自定义localDateTime日期
方法说明:从年,月,日,小时,分钟和秒获得LocalDateTime
的实例
public static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second)
使用案例:
System.out.println(LocalDateTime.of(2017, 7, 13, 16, 22, 50));
控制台输出:
2017-07-13T16:22:50
3.4 获取年月日时分秒
使用案例:
public static void main(String[] args) { //java 1.8 LocalDateTime ldt = LocalDateTime.now(); System.out.println(LocalDateTime.now()); //年 System.out.println(ldt.getYear()); //月(英文)1-12 //System.out.println(ldt.getMonth()); //月(中文)1-12 System.out.println(ldt.getMonthValue()); //日(以年计算)1-365 //System.out.println(ldt.getDayOfYear()); //日(以月计算)1-30 System.out.println(ldt.getDayOfMonth()); //时 System.out.println(ldt.getHour()); //分 System.out.println(ldt.getMinute()); //秒 System.out.println(ldt.getSecond()); }
控制台输出:
2022-02-23T17:08:29.493 2022 2 23 17 8 29
3.5 给当前日期添加2小时
方法说明:
public LocalDateTime plusHours(long hours)
使用案例:
System.out.println(LocalDateTime.now().plusHours(2));
效果图:
3.6 给当前日期减少2小时
方法说明:
public LocalDateTime minusHours(long hours)
使用案例:
System.out.println(LocalDateTime.now().minusHours(2));
控制台输出:
2022-02-23T15:41:33.320
3.7 比较两个日期大小
方法说明:
public boolean isAfter(ChronoLocalDateTime<?> other) public boolean isBefore(ChronoLocalDateTime<?> other)
使用案例:
public static void main(String[] args) { LocalDateTime time = LocalDateTime.of(2017, 7, 12, 15, 12, 12); //判断是否在time时间之前 System.out.println(LocalDateTime.now().isBefore(time)); //判断是否在time时间之后 System.out.println(LocalDateTime.now().isAfter(time)); }
控制台输出:
false true
3.8 工具类DateUtil
public class DateUtil { /** * 获取前days天的日期 * @param days * @return */ public static LocalDateTime getMinusDays(int days){ LocalDateTime now =LocalDateTime.now(); LocalDateTime minusDays = now.minusDays(days); return minusDays; } /** * 获取指定日期的最小时间 * @param localDateTime * @return */ public static String getStartTimeOfDay(LocalDateTime localDateTime){ LocalDateTime minusTimeEnd = LocalDateTime.of(localDateTime.toLocalDate(), LocalTime.MIN); return minusTimeEnd.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); } /** * 获取指定日期的最大时间 * @param localDateTime * @return */ public static String getEndTimeOfDay(LocalDateTime localDateTime){ LocalDateTime minusTimeEnd = LocalDateTime.of(localDateTime.toLocalDate(), LocalTime.MAX); return minusTimeEnd.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); } /** * 获取日期 * @param localDateTime * @return */ public static String getDate(LocalDateTime localDateTime){ return localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); } public static String getDateByFormatter(LocalDateTime localDateTime,String formatter){ return localDateTime.format(DateTimeFormatter.ofPattern(formatter)); } }
3.9 SimpleDateFormat
3.9.1 将String类型的日期格式转为标准的Date类型的格式
接口说明:
public Date parse(String var1) throws ParseException
具体案例:
public static void main(String[] args) { try { String createDate="20210918"; SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyyMMdd"); Date date = simpleDateFormat.parse(createDate); System.out.println(date); } catch (Exception e) { e.printStackTrace(); } }
执行结果:
3.9.2 将标准的Date类型数据转换为String类型的日期格式
接口说明:
public final String format(Date var1)
具体案例:
public static void main(String[] args) { try { Date date1 = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String datetime = sdf.format(date1); System.out.println(datetime); } catch (Exception e) { e.printStackTrace(); } }
执行结果:
4.String类常用方法汇总
(1)删除字符串的头尾空白符
public String trim()
(2)从指定位置截取字符串
public String substring(int beginIndex, int endIndex)
注意:
beginIndex -- 起始索引(包括), 索引从 0 开始。
endIndex -- 结束索引(不包括)。
(3)根据匹配给定的正则表达式来拆分字符串
public String[] split(String regex, int limit)
参数:<1>regex -- 正则表达式分隔符。 <2>limit -- 分割的份数(参数2往往可以省略)
注意: . 、 | 和 * 等转义字符,必须得加 \\。
2.字符串转为Arraylist集合的自定义方法
private static ArrayList<String> stringToArrayList(String str) { //1.String.substring() 从指定位置开始到指定位置结束截取字符串 String strTemp=str.substring(1,str.length()-1); //2.String.split() 字符串拆分 String[] strResult=strTemp.split(", "); ArrayList<String> resultList=new ArrayList<>(); for (int i = 0; i <strResult.length ; i++) { resultList.add(strResult[i]); } return resultList; }
注意:该方法输入为以下格式(ArrayList.toString后就会得到以下形式的字符串):
[可燃爆粉尘作业场所, 喷涂作业场所, 涉氨制冷企业, 有限空间作业场所]
输出为ArrayList集合的形式。
5.StringUtils工具类
maven依赖:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.1</version> </dependency>
(1)isNotBlank方法
public static boolean isNotBlank(String str)
判断某字符串是否不为空且长度不为0且不由空白符(whitespace)构成,等于!isBlank(String str)
System.out.println(StringUtils.isNotBlank(null)); System.out.println(StringUtils.isNotBlank("")); System.out.println(StringUtils.isNotBlank(" ")); System.out.println(StringUtils.isNotBlank("/b")); System.out.println(StringUtils.isNotBlank("bob")); System.out.println(StringUtils.isNotBlank(" bob "));
控制台输出:
参考文献:https://www.cnblogs.com/huangminwen/p/6041168.html
https://blog.csdn.net/liboyang71/article/details/75085326----推荐
https://blog.csdn.net/kingboyworld/article/details/75808108