13、可变字符串类和日期相关类
1 可变字符串类(重点)
1.1 基本概念
由于String类描述的字符串内容是个常量不可改变,当需要在Java代码中描述大量类似的字符串时,
只能单独申请和存储,此时会造成内存空间的浪费。为了解决上述问题,
可以使用java.lang.StringBuilder类和java.lang.StringBuffer类来描述字符序列可以改变的字符串,
如:"ab"。
StringBuffer类是从jdk1.0开始存在,属于线程安全的类,因此效率比较低。
StringBuilder类是从jdk1.5开始存在,属于非线程安全的类,效率比较高。
1.2、StringBuilder类常用的构造方法
1.3、StringBuilder类常用的成员方法
注意
作为参数传递的话,方法内部String不会改变其值,StringBuffer和StringBuilder会改变其值。
1.4、返回值的设计
StringBuilder的很多方法的返回值均为StringBuilder类型。
这些方法的返回语句均为:return this。
由此可见,这些方法在对StringBuilder所封装的字符序列进行改变后又返回了该对象的引用。
基于这样设计的目的在于可以连续调用。
2、Java8之前的日期相关类(熟悉)
2.1、System类的概述
(1)基本概念
Java.lang.System类中提供了一些有用的类字段和方法。
(2)常用的方法
2.2、Date类的概述
(1)基本概念
java.util.Date类主要用于描述特定的瞬间,也就是年月日时分秒,可以精确到毫秒。
(2)常用的方法
2.3、SimpleDateFormat类的概述
(1)基本概念
java.text.SimpleDateFormat类主要用于实现日期和文本之间的转换。
(2)常用的方法
2.4、Calendar类的概述
(1)基本概念
java.util.Calender类主要用于描述特定的瞬间,取代Date类中的过时方法实现全球化。
该类是个抽象类,因此不能实例化对象,其具体子类针对不同国家的日历系统,
其中应用最广泛的是GregorianCalendar(格里高利历),对应世界上绝大多数国家/地区使用的标准日历系统。
(2)常用的方法
3、Java8中的日期相关类(熟悉)
3.1 Java8日期类的由来
JDK 1.0中包含了一个java.util.Date类,但是它的大多数方法已经在JDK 1.1引入Calendar类之后被弃用了。
而Calendar并不比Date好多少。它们面临的问题是:
Date类中的年份是从1970开始的,而月份都从0开始。
格式化只对Date类有用,对Calendar类则不能使用。
非线程安全等。
3.2 Java8日期类的概述
Java 8通过发布新的Date-Time API来进一步加强对日期与时间的处理。
java.time包:该包日期/时间API的基础包。
java.time.chrono包:该包提供对不同日历系统的访问。
java.time.format包:该包能够格式化和解析日期时间对象。
java.time.temporal包:该包包含底层框架和扩展特性。
java.time.zone包:该包支持不同时区以及相关规则的类。
3.3 LocalDate类的概述
(1)基本概念
java.time.LocalDate类主要用于描述年-月-日格式的日期信息,该类不表示时间和时区信息。
(2)常用的方法
// 只能表示 年月日
LocalDate now = LocalDate.now(); // 获取当前时间
System.out.println(now);
// 表示指定时间
LocalDate date = LocalDate.of(2020, 12, 20);
System.out.println(date);
int year = date.getYear();// 获取年份
Month month = date.getMonth(); // 获取月份 英文
int m = date.get(ChronoField.MONTH_OF_YEAR);// 获取月份 int
int dayOfMonth = date.getDayOfMonth(); // 获取日期
System.out.println(year + "/" + month + "/" + dayOfMonth);
System.out.println(year + "/" + m + "/" + dayOfMonth);
3.4 LocalTime类的概述
(1)基本概念
java.time.LocalTime 类主要用于描述时间信息,可以描述时分秒以及纳秒。
(2)常用的方法
LocalTime now = LocalTime.now(); // 获取系统当前时间
System.out.println(now);
// 查看可用的时区
Set<String> zoneIds = ZoneId.getAvailableZoneIds();
System.out.println(zoneIds);
// 获取指定时区的时间
LocalTime now1 = LocalTime.now(ZoneId.of("America/Marigot"));
System.out.println(now1);
LocalTime time = LocalTime.of(10, 30, 40); // 表示指定时间
System.out.println(time);
// 获取小时
int hour = now.getHour();
int hour2 = now.get(ChronoField.HOUR_OF_DAY);
//获取分钟
int minute = now.getMinute();
int minute2 = now.get(ChronoField.MINUTE_OF_HOUR);
// 获取秒
int second = now.getSecond();
int second2 = now.get(ChronoField.SECOND_OF_MINUTE);
System.out.println(hour + "-" + minute + "-" + second);
System.out.println(hour2 + "-" + minute2 + "-" + second2);
3.5 LocalDateTime类的概述
(1)基本概念
java.time.LocalDateTime类主要用于描述ISO-8601日历系统中没有时区的日期时间,
如2007-12- 03T10:15:30。
(2)常用的方法
//获取系统当前时间
LocalDateTime now = LocalDateTime.now();
System.out.println(now);
// 获取指定时间
LocalDateTime localDateTime = LocalDateTime.of(2020, 1, 23, 12, 30, 50);
System.out.println(localDateTime);
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime1 = localDate.atTime(localTime);
System.out.println(localDateTime1);
LocalDateTime localDateTime2 = localTime.atDate(localDate);
System.out.println(localDateTime2);
// 修改时间 localDateTime 2020-01-23T12:30:50 ==> 2023-12-12 12:12:12
localDateTime = localDateTime.withYear(2023);
localDateTime = localDateTime.withMonth(12);
localDateTime = localDateTime.withDayOfMonth(12);
localDateTime = localDateTime.withHour(12);
localDateTime = localDateTime.withMinute(12);
localDateTime = localDateTime.withSecond(12);
System.out.println(localDateTime);
// 增加3个月 减去1年
localDateTime = localDateTime.plusMonths(3);
localDateTime = localDateTime.minusYears(1);
System.out.println(localDateTime); // 2023-3-12
3.6 Instant类的概述
(1)基本概念
java.time.Instant类主要用于描述瞬间的时间点信息。
(2)常用的方法
Instant now = Instant.now();
System.out.println(now);
long epochSecond = now.getEpochSecond(); // 获取秒数
System.out.println(epochSecond);
long milli = now.toEpochMilli(); // 获取毫秒数
System.out.println(milli);
3.7 DateTimeFormatter类的概述
(1)基本概念
java.time.format.DateTimeFormatter类主要用于格式化和解析日期。
(2)常用的方法
LocalDateTime localDateTime = LocalDateTime.of(2023,2,12,16,30,58);
System.out.println(localDateTime);
String dateStr1 = localDateTime.format(DateTimeFormatter.ISO_DATE_TIME); // 默认 2023-02-12T16:30:58
System.out.println(dateStr1);
String dateStr2 = localDateTime.format(DateTimeFormatter.BASIC_ISO_DATE); // 20230212
System.out.println(dateStr2);
// 自定义日期格式化
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String dateStr3 = dtf.format(localDateTime);
System.out.println(dateStr3);
//将字符串 转换为 日期
LocalDateTime time = LocalDateTime.parse(dateStr3 , dtf);
System.out.println(time);
LocalDateTime parse = LocalDateTime.parse(dateStr1);
System.out.println(parse);
LocalDate parse2 = LocalDate.parse(dateStr2 , DateTimeFormatter.BASIC_ISO_DATE);
System.out.println(parse2);