注意:LocalDate是一个不可变日期对象,好处:线程安全,可以记住刚开始的时间点,无论多少人修改也不会发生改变。当用户调用修改时,会产生新的Localdate日期对象。类似于String.
Java日期时间--API
package review_d1_localdatetime; import java.time.DayOfWeek; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; public class LocalDateTimeDemo1 { public static void main(String[] args) { //不可变日期对象 LocalDate ld = LocalDate.now();//获取现在日期信息 System.out.println(ld); System.out.println(ld.getYear()); System.out.println(ld.getMonthValue()); System.out.println(ld.getDayOfMonth()); System.out.println(ld.getDayOfYear()); DayOfWeek dayOfWeek = ld.getDayOfWeek(); System.out.println(dayOfWeek.getValue());//一周德第几题 System.out.println(ld.getDayOfWeek());//星期几 //修改localDate日期信息 LocalDate ld2 = ld.withMonth(12); System.out.println(ld2); System.out.println(ld);//不可变日期对象 LocalTime lt = LocalTime.now(); System.out.println(lt); LocalDate ld3 = ld.plusDays(10); System.out.println(ld3); LocalDate ld4 = ld.minusDays(12); System.out.println(ld4); //指定日期到某一天。判断两个日期关系 LocalDate ld5 = LocalDate.of(2023, 12, 12); System.out.println(ld.isBefore(ld5));//在之前 System.out.println(ld.isAfter(ld5));//在之后 System.out.println("============"); LocalDateTime ldt = LocalDateTime.now(); System.out.println(ldt); } }
提示:以下是本篇文章正文内容,下面案例可供参考
一、LocalTime和LocalDate 和LocalDateTime对象
简述:1LocalDate 和LocalDateTime , LocalTime可以相互转换,合久必分分久必合。
2 LocalDate和 LocalDateTime , LocalTime都可以使用parse方法来解析时间。
3 LocalDate和 LocalDateTime , LocalTime都是不可变日期对象。都可以使用提供的方法来获取日期信息以及修改,加减 等操作得到新的日期对象。
// LocalDate找到某个人生日 LocalDate ld01 = LocalDate.of(2000, 2, 15);//获取一个时间段,目前是获取一个人的生日 LocalDate now1 = LocalDate.now();//获取当下时间的年月日信息 MonthDay m3 = MonthDay.of(ld01.getMonth(), now1.getDayOfMonth());//拿出现在的月日 MonthDay m4 = MonthDay.of(ld01.getMonth(), ld01.getDayOfMonth());//拿出出生的月日 boolean b = m3.equals(m4); boolean after = !m3.isAfter(m4);//在之后吗? System.out.println(after); System.out.println(b); //LocalDateTime和LocalTime,localDate之间的相互转换 LocalDateTime of = LocalDateTime.of(now1, lt); LocalTime lt2 = of.toLocalTime(); LocalDate ld02 = of.toLocalDate(); System.out.println(lt2); System.out.println(ld02);
二:Zoneid对象
//获取Java支持的所有时区 Set<String> availableZoneIds = ZoneId.getAvailableZoneIds(); System.out.println(availableZoneIds); //获取"Asia/Aqtau"的默认时间 //把某个时区封装成zoneId对象 ZoneId id1 = ZoneId.of("Asia/Aqtau"); //获取某个时区的ZonedDateTime对象。 ZonedDateTime time = ZonedDateTime.now(id1); System.out.println("时间是"+time); //获取世界标准时间的ZonedDateTime对象。 ZonedDateTime now1 = ZonedDateTime.now(Clock.systemUTC()); System.out.println("世界标准时间"+now1); //获取系统默认时区的ID信息 ZoneId zoneId1 = ZoneId.systemDefault(); String id = zoneId1.getId(); System.out.println(id);
三:Instant对象
Instant now1 = Instant.now();//创建Instant对象 System.out.println(now);//得到此刻时间信息 System.out.println(now.getEpochSecond());//获取此刻总秒数 System.out.println(now.getNano());//获取不到一秒的纳秒数 //Instant作用是做代码的性能分析,或者记录用户的操作时间点
四:DateTimeFormatter格式化器
//博文 掌握JDK 8新增的DateTimeFormatter格式化器的用法。 DateTimeFormatter dtf01 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");//创建了一个时间格式化器 String ti="2023-02-10 12:21:22"; LocalDateTime ls = LocalDateTime.parse(ti, dtf01); System.out.println(ls); //把字符串时间类型转换成LocalDateTime类型,解析时间 LocalDateTime localDateTime = LocalDateTime.now(); String ss = localDateTime.format(dtf01); System.out.println(ss); //把LocalDateTime时间类型转换成了String类型时间格式,对时间进行格式化
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
五:Period和Duration
//博文 掌握Period的作用:计算机两个日期相差的年数,月数、天数。 //利用period对象获取两个日期对象相差的年数月数和天数(大时间) LocalDate start1 = LocalDate.of(2023, 11, 11); LocalDate end1 = LocalDate.now(); Period period1 = Period.between(start1, end1);//用Period调用between方法得到一个period对象 // period1,然后利用其获取到相差的int类型年月日信息并输出。缺点是他只能用LocalDate类型只能获取年月日不够精确 System.out.println(period1.getYears()); System.out.println(period1.getMonths()); System.out.println(period1.getDays()); //利用Duration可以获取到两个LocalDateTime时间类型的所有相差的日时分秒信息并输出(小时间) //获取两个时间信息 LocalDateTime start2 = LocalDateTime.of(2022, 11, 13, 11, 47, 59); LocalDateTime end2 = LocalDateTime.of(2024, 6, 7, 9, 0, 0); //创建duration对象 Duration duration = Duration.between(start2,end2); System.out.println("距离高考还有:"+duration.toDays()+"天 "+duration.toHoursPart()+"时 "+duration.toMinutesPart()+"分钟 "+duration.toSecondsPart()+"秒 "); }
5.1、训练题
1.需求:输入一个时间,返回格式如图所示
1.1代码
package review_d1_localdatetime; import java.time.DayOfWeek; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Scanner; public class Demo { public static void main(String[] args) { System.out.println("请录入日期字符串:(格式:2015-10-20)"); String s = new Scanner(System.in).next(); //System.out.println(s); DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate parse = LocalDate.parse(s, dtf); int year = parse.getYear(); int i = parse.getDayOfWeek().getValue(); String str=""; switch (i){ case 1->str="星期一"; case 2->str="星期二"; case 3->str="星期三"; case 4->str="星期四"; case 5->str="星期五"; case 6->str="星期六"; case 7->str="星期日"; } int dayOfYear = parse.getDayOfYear(); DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy年-MM月-dd日"); String s1 = dtf2.format(parse); System.out.println(s1+"是"+str+",是"+year+"年的第"+dayOfYear+"天"); LocalDate now = LocalDate.now(); } }
2.需求:制作一个计时器
请在素材的seckill项目的指定位置补全相关的代码, 实现秒杀倒计时的功能!秒杀开始时间为:明天的06时0分0秒。
2.2代码
package com.itheima.d1_object.Student.d9_homework; //请在素材的seckill项目的指定位置补全相关的代码, // 实现秒杀倒计时的功能!秒杀开始时间为:明天的06时0分0秒。
package com.itheima.d1_object.Student.d9_homework.demo1.task; import java.time.Duration; import java.time.LocalDateTime; import java.util.TimerTask; public class TimeTask extends TimerTask { // 定义秒杀开始时间 private LocalDateTime startTime; // 秒杀开始时间 // 构造方法,对秒杀开始时间进行初始化 public TimeTask() { // 1、初始化开始时间是明天6点钟。 startTime = LocalDateTime.of(2023,11,13, 6, 0,0); } @Override public void run() { // 每一秒执行一次该方法 // 2、获取当前系统的时间点 LocalDateTime now = LocalDateTime.now(); // 3、输出当前倒计时信息。(时间差信息) Duration duration = Duration.between(now, startTime); // 4、拿时间信息。 System.out.println(duration.toHoursPart() + ":" + duration.toMinutesPart() + ":" + duration.toSecondsPart()); } }
public static void main(String[] args) { // 创建一个定时器对象 Timer timer = new Timer() ; timer.schedule(new TimeTask(), 0 , 1000); // 每隔1秒执行一次 }
一:Object和Objects对象
1:概述
Object主要用到了两个方法,1是equals方法,用来比较两个对象的地址是否一样,
2是tostring方法,开发中,父类toString的意义,为了让子类重写,以便返回内容。
Objects也可以使用以上两种方法,不过Objects的equals方法比Object的更加的安全可靠,可以避免空指针异常,还能给正常的结果。
2:代码
1:Object
public static void main(String[] args) { // 目标:掌握Object类常用方法:toString,equals的使用。 Student s1 = new Student("顾建平", 23, '男'); // System.out.println(s1.toString()); // 注意:直接输出对象,默认会调用toString // 开发中直接输出对象,并不想看对象的所谓地址,更想看对象内容。 // 因此,开发中,父类toString的意义,为了让子类重写,以便返回内容。 System.out.println(s1); System.out.println("---------------------------------------"); Student o1 = new Student("刘永帅", 20, '男'); Student o2 = new Student("刘永帅", 20, '男'); // equals默认就是用来比较两个对象的地址是否一样!一样才是true,反之! // 存在的意义是为了让子类重写,以便子类可以自己指定相等的比较规则:比如内容一样就返回true System.out.println(o1.equals(o2)); System.out.println(o1 == o2); }
2:Objects
public static void main(String[] args) { // 目标:掌握Objects类提供的常用方法。 String name1 = null; String name2 = "西门吹牛"; // System.out.println(name1.equals(name2)); // 使用上面:Objects的equals方法更加的安全可靠,可以避免空指针异常,还能给正常的结果 // 原因:多了一个非空校验,必须不是null,才会比较内容 System.out.println(Objects.equals(name1, name2)); // 判断对象是否是null System.out.println(Objects.isNull(name1)); // true System.out.println(name1 == null); // true // 判断对象是否不是null System.out.println(Objects.nonNull(name2)); // true System.out.println(name2 != null); // true }
二:包装类
1:概述
主要是把基本类型的数据转换成引用类型。基本数据类型对象化
2:代码
public static void main(String[] args) { // 目标:认识包装类,再搞清楚他的应用场景。 // 1、基本作用:可以基本类型的对象化。 Integer it = 12; // 自动装箱:可以把基本类型的数据直接转换成对象给包装类型的变量记住 int it2 = 35; Integer it3 = it2; // 自动装箱 System.out.println(it3); int it4 = it3; // 自动拆箱:可以把包装类型的变量直接赋值给基本类型的变量。 System.out.println(it4); // 包装类的特点:可以接收默认值null,除此之外包装类还多了很多功能 Integer i = null; Integer i2 = 0; Integer i3 = 232; int i4 = 0; System.out.println("----------------------------------------------"); // a、包装类可以把基本类型的数据变成字符串。 int a = 23; String aStr = Integer.toString(a); // "23" System.out.println(aStr + 1); Integer a2 = 23; String a2Str = a2.toString(); System.out.println(a2Str + 1); int a3 = 23; String a3Str = a3 + ""; // "23" System.out.println(a3Str + 1); // b、包装类也可以把字符串类型的数值转换成对应的基本数据类型参与运算。(真的很有用) String s1 = "99"; // int t1 = Integer.parseInt(s1); int t1 = Integer.valueOf(s1); System.out.println(t1 + 1); String s2 = "23.5"; // double t2 = Double.parseDouble(s2); double t2 = Double.valueOf(s2); System.out.println(t2 + 0.5); }
三:StringBuilder和stringjoiner
1:概述
StringBuilder是一个可以操作字符串的容器,可以对字符串进行处理,比如reverse反转,append增加元素,tostring转换String类型lenght获取长度。String是一个不可变字符串,每次变化都会产生一个新的字符串,而StringBuilder里的字符串是一个可变的容器用来操作大量字符串更高效,更节省内存。Stringjoiner与其类似,但是他可以制定拼接规则。
2:代码
public static void main(String[] args) { // 目标:学会使用StringBuilder: 操作字符串数据的。 // 1、创建StringBuilder对象,封装字符串数据。 StringBuilder sb=new StringBuilder(); // sb = "" // StringBuilder sb2 = new StringBuilder("黑马"); // sb = "黑马" // System.out.println(sb); // System.out.println(sb2); // 2、调用方法append拼接字符串数据进去 sb.append("黑马").append(666).append(true).append(99.5); System.out.println(sb); // 3、反转内容 sb.reverse(); System.out.println(sb); // 4、获取长度 System.out.println(sb.length()); // 5、把StringBuilder对象转换成String类型。 // StringBuilder只是一种操作字符串的手段。 // String才是目的。 String rs = sb.toString(); System.out.println(rs); }
public static void main(String[] args) { // 目标:理解StringBuilder的操作性能较好。 // String str = ""; // for (int i = 0; i < 1000000 ; i++) { // str += "abc"; // } // System.out.println(str); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 1000000; i++) { sb.append("abc"); } System.out.println(sb); }
public static void main(String[] args) { // 目标:掌握StringBuilder的应用。 int[] arr = {11, 22, 33, 23}; String result = getArrayData(arr); System.out.println(result); } public static String getArrayData(int[] arr){ if(arr == null){ return null; } // 1、创建一个StringBuilder对象,准备拼接内容。 StringBuilder sb = new StringBuilder(); sb.append("["); // 2、遍历这个数组中的每个数据开始拼接 for (int i = 0; i < arr.length; i++) { sb.append(arr[i]).append(i == arr.length - 1 ? "" : ", "); } sb.append("]"); // 3、返回数据 return sb.toString(); }
public static void main(String[] args) { // 目标:学会使用StringJoiner int[] arr = {11, 22, 33, 23}; String result = getArrayData(arr); System.out.println(result); } public static String getArrayData(int[] arr) { if (arr == null) { return null; } // 1、创建一个StringJoiner对象,准备拼接内容。 // 参数一:间隔符号 // 参数二:开始符号 // 参数三:结束符号 StringJoiner sj = new StringJoiner(", ", "[", "]"); // 2、遍历这个数组中的每个数据开始拼接 for (int i = 0; i < arr.length; i++) { sj.add(arr[i] + ""); } // 3、返回数据 return sj.toString(); }
四:BigDecimal
1:概述
BigDecimal用于解决浮点型运算的精度问题的。主要处理double类型的数据
bigdecimal类主要是用来精确计算,可以接受string类型的数据,进行计算时需要将double类型数据转换成String类型才能封装成一个bigdecimal的对象,然后由对象调用加减乘除方法进行运算,除法可以指定保留几位小数以及保留方法
2:代码
public static void main(String[] args) { // 目标:掌握BigDecimal用于解决浮点型运算的精度问题的。 double a = 0.1; double b = 0.2; double c = a + b; System.out.println(c); System.out.println("--------------------------------------"); // 1、把浮点型数据a包装成BigDecimal对象。 // 得到BigDecimal对象的方案: // 第一种:public BigDecimal(String val) // 第二种:public static BigDecimal valueOf(double val) // BigDecimal a1 = new BigDecimal(Double.toString(a)); BigDecimal a1 = BigDecimal.valueOf(a); // BigDecimal b1 = new BigDecimal(Double.toString(b)); BigDecimal b1 = BigDecimal.valueOf(b); // 2、调用它的方法,得到精确的结果 BigDecimal c1 = a1.add(b1); // 加 // BigDecimal c1 = a1.subtract(b1); // 减 // BigDecimal c1 = a1.multiply(b1); // 乘法 // BigDecimal c1 = a1.divide(b1); // 除法 System.out.println(c1); // 3、创建BigDecimal对象 实现精度控制 BigDecimal i = new BigDecimal("0.1"); BigDecimal j = new BigDecimal("0.3"); /** * 参数一:除数 * 参数二:保留位数 * 参数三:舍入模式 */ BigDecimal k = i.divide(j, 2, RoundingMode.HALF_UP); System.out.println(k); }
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了Java关于时间api的应用以及格式。