1 时间相关API 1.1 Date类java.util.Date类表示特定的瞬间,精确到毫秒。
继续查阅Date类的描述,发现Date拥有多个构造函数,只是部分已经过时,我们重点看以下两个构造函数
public Date()
:从运行程序的此时此刻到时间原点经历的毫秒值,转换成Date对象,分配Date对象并初始化此对象,以表示分配它的时间(精确到毫秒)。public Date(long date)
:将指定参数的毫秒值date,转换成Date对象,分配Date对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即1970年1月1日00:00:00 GMT)以来的指定毫秒数。tips: 由于中国处于东八区(GMT+08:00)是比世界协调时间/格林尼治时间(GMT)快8小时的时区,当格林尼治标准时间为0:00时,东八区的标准时间为08:00。
简单来说:使用无参构造,可以自动设置当前系统时间的毫秒时刻;指定long类型的构造参数,可以自定义毫秒时刻。
常用方法
Date类中的多数方法已经过时,常用的方法有:
public long getTime()
把日期对象转换成对应的时间毫秒值。public void setTime(long time)
把方法参数给定的毫秒值设置给日期对象小结:Date表示特定的时间瞬间,我们可以使用Date对象对时间进行操作。
java.text.SimpleDateFormat
是日期/时间格式化类,我们通过这个类可以帮我们完成日期和文本之间的转换,也就是可以在Date对象与String对象之间进行来回转换。
格式化 :按照指定的格式,把Date对象转换为String对象。解析 :按照指定的格式,把String对象转换为Date对象。 1.2.1 构造方法 由于DateFormat为抽象类,不能直接使用,所以需要常用的子类java.text.SimpleDateFormat
。这个类需要一个模式(格式)来指定格式化或解析的标准。构造方法为:
public SimpleDateFormat(String pattern)
:用给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat。参数pattern是一个字符串,代表日期时间的自定义格式。 1.2.2 格式规则常用的格式规则为:
标识字母(区分大小写) 含义 y 年 M 月 d 日 H 时 m 分 s 秒
备注:更详细的格式规则,可以参考SimpleDateFormat类的API文档。
1.2.3 常用方法DateFormat类的常用方法有:
小结:DateFormat可以将Date对象和字符串相互转换。
1.3 Calendar类 1.3.1 概述java.util.Calendar类表示一个“日历类”,可以进行日期运算。它是一个抽象类,不能创建对象,我们可以使用它的子类:java.util.GregorianCalendar类。 有两种方式可以获取GregorianCalendar对象:直接创建GregorianCalendar对象; 通过Calendar的静态方法getInstance()方法获取GregorianCalendar对象 1.3.2 常用方法方法名 说明 public static Calendar getInstance() 获取一个它的子类GregorianCalendar对象。 public int get(int field) 获取某个字段的值。field参数表示获取哪个字段的值,可以使用Calender中定义的常量来表示: Calendar.YEAR : 年 Calendar.MONTH :月 Calendar.DAY_OF_MONTH:月中的日期 Calendar.HOUR:小时 Calendar.MINUTE:分钟 Calendar.SECOND:秒 Calendar.DAY_OF_WEEK:星期 public void set(int field,int value) 设置某个字段的值 public void add(int field,int amount) 为某个字段增加/减少指定的值
2 JDK8时间相关类JDK8时间类类名 作用 ZoneId 时区 Instant 时间戳 ZoneDateTime 带时区的时间 DateTimeFormatter 用于时间的格式化和解析 LocalDate 年、月、日 LocalTime 时、分、秒 LocalDateTime 年、月、日、时、分、秒 Duration 时间间隔(秒,纳,秒) Period 时间间隔(年,月,日) ChronoUnit 时间间隔(所有单位)
2.1 ZoneId 时区1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Set<String> zoneIds = ZoneId.getAvailableZoneIds(); System.out.println(zoneIds.size()); System.out.println(zoneIds);ZoneId zoneId = ZoneId.systemDefault(); System.out.println(zoneId);ZoneId zoneId1 = ZoneId.of("Asia/Pontianak" ); System.out.println(zoneId1);
2.2 Instant 时间戳1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 Instant now = Instant.now(); System.out.println(now);Instant instant1 = Instant.ofEpochMilli(0L ); System.out.println(instant1);Instant instant2 = Instant.ofEpochSecond(1L ); System.out.println(instant2);Instant instant3 = Instant.ofEpochSecond(1L , 1000000000L ); System.out.println(instant3);ZonedDateTime time = Instant.now().atZone(ZoneId.of("Asia/Shanghai" )); System.out.println(time); Instant instant4=Instant.ofEpochMilli(0L );Instant instant5 = Instant.ofEpochMilli(1000L );boolean result1=instant4.isBefore(instant5); System.out.println(result1);boolean result2 = instant4.isAfter(instant5); System.out.println(result2);Instant instant6 = Instant.ofEpochMilli(3000L ); System.out.println(instant6);Instant instant7 = instant6.minusSeconds(1 ); System.out.println(instant7);
2.3 ZoneDateTime 带时区的时间1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ZonedDateTime now = ZonedDateTime.now(); System.out.println(now);ZonedDateTime time1 = ZonedDateTime.of(2023 , 10 , 1 , 11 , 12 , 12 , 0 , ZoneId.of("Asia/Shanghai" )); System.out.println(time1);Instant instant = Instant.ofEpochMilli(0L );ZoneId zoneId = ZoneId.of("Asia/Shanghai" );ZonedDateTime time2 = ZonedDateTime.ofInstant(instant, zoneId); System.out.println(time2);ZonedDateTime time3 = time2.withYear(2000 ); System.out.println(time3);ZonedDateTime time4 = time3.minusYears(1 ); System.out.println(time4);ZonedDateTime time5 = time4.plusYears(1 ); System.out.println(time5);
1 2 3 4 5 6 7 8 9 10 11 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.5 LocalDate 年、月、日1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 LocalDate nowDate = LocalDate.now();LocalDate ldDate = LocalDate.of(2023 , 1 , 1 ); System.out.println("指定日期:" + ldDate); System.out.println("=============================" );int year = ldDate.getYear(); System.out.println("year: " + year);Month m = ldDate.getMonth(); System.out.println(m); System.out.println(m.getValue());int month = ldDate.getMonthValue(); System.out.println("month: " + 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()); System.out.println(ldDate.isBefore(ldDate)); System.out.println(ldDate.isAfter(ldDate));LocalDate withLocalDate = ldDate.withYear(2000 ); System.out.println(withLocalDate);LocalDate minusLocalDate = ldDate.minusYears(1 ); System.out.println(minusLocalDate);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.from(nowDate1); System.out.println("今天是你的生日吗? " + birMd.equals(nowMd));
2.6 LocalTime 时、分、秒1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 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 )); System.out.println(LocalTime.of(8 , 20 , 30 )); System.out.println(LocalTime.of(8 , 20 , 30 , 150 ));LocalTime mTime = LocalTime.of(8 , 20 , 30 , 150 ); System.out.println(nowTime.isBefore(mTime)); System.out.println(nowTime.isAfter(mTime)); System.out.println(nowTime.withHour(10 )); System.out.println(nowTime.plusHours(10 ));
2.7 LocalDateTime 年、月、日、时、分、秒1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 LocalDateTime nowDateTime = LocalDateTime.now(); System.out.println("今天是:" + nowDateTime); System.out.println(nowDateTime.getYear()); System.out.println(nowDateTime.getMonthValue()); System.out.println(nowDateTime.getDayOfMonth()); System.out.println(nowDateTime.getHour()); System.out.println(nowDateTime.getMinute()); System.out.println(nowDateTime.getSecond()); System.out.println(nowDateTime.getNano()); System.out.println("dayofYear:" + nowDateTime.getDayOfYear()); System.out.println(nowDateTime.getDayOfWeek()); System.out.println(nowDateTime.getDayOfWeek().getValue()); System.out.println(nowDateTime.getMonth()); System.out.println(nowDateTime.getMonth().getValue());LocalDate ld = nowDateTime.toLocalDate(); System.out.println(ld);LocalTime lt = nowDateTime.toLocalTime(); System.out.println(lt.getHour()); System.out.println(lt.getMinute()); System.out.println(lt.getSecond());
2.8 Duration 时间间隔(秒,纳秒)1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 LocalDateTime today = LocalDateTime.now(); System.out.println(today);LocalDateTime birthDate = LocalDateTime.of(2000 , 1 , 1 , 0 , 0 , 0 ); 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());
2.9 Period 时间间隔(年,月,日)1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 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());
2.10 ChronoUnit 时间间隔(所有单位)1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 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));
3 包装类 3.1 概述Java提供了两个类型系统,基本类型与引用类型,使用基本类型在于效率,然而很多情况,会创建对象使用,因为对象可以做更多的功能,如果想要我们的基本类型像对象一样操作,就可以使用基本类型对应的包装类,如下:
基本类型 对应的包装类(位于java.lang包中) byte Byte short Short int Integer long Long float Float double Double char Character boolean Boolean
3.2 Integer类Integer类概述
包装一个对象中的原始类型 int 的值
Integer类构造方法及静态方法
方法名 说明 public Integer(int value) 根据 int 值创建 Integer 对象(过时) public Integer(String s) 根据 String 值创建 Integer 对象(过时) public static Integer valueOf(int i) 返回表示指定的 int 值的 Integer 实例 public static Integer valueOf(String s) 返回保存指定String值的 Integer 对象 static string tobinarystring(int i) 得到二进制 static string toOctalstring(int i) 得到八进制 static string toHexstring(int i) 得到十六进制 static int parseInt(string s) 将字符串类型的整数转成int类型的整数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 String str1 = Integer.toBinaryString(100 ); System.out.println(str1);String str2 = Integer.toOctalString(100 ); System.out.println(str2);String str3 = Integer.toHexString(100 ); System.out.println(str3);int i = Integer.parseInt("123" ); System.out.println(i); System.out.println(i + 1 );String str = "true" ;boolean b = Boolean.parseBoolean(str); System.out.println(b);
2.3 装箱与拆箱基本类型与对应的包装类对象之间,来回转换的过程称为”装箱“与”拆箱“:
装箱 :从基本类型转换为对应的包装类对象。拆箱 :从包装类对象转换为对应的基本类型。用Integer与 int为例:
基本数值---->包装对象
1 2 Integer i = new Integer (4 );Integer iii = Integer.valueOf(4 );
包装对象---->基本数值
2.4 自动装箱与自动拆箱由于我们经常要做基本类型与包装类之间的转换,从Java 5(JDK 1.5)开始,基本类型与包装类的装箱、拆箱动作可以自动完成。例如:
1 2 3 Integer i = 4 ; i = i + 5 ;
2.5 基本类型与字符串之间的转换基本类型转换为String
转换方式 方式一:直接在数字后加一个空字符串 方式二:通过String类静态方法valueOf() 示例代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class IntegerDemo { public static void main (String[] args) { int number = 100 ; String s1 = number + "" ; System.out.println(s1); String s2 = String.valueOf(number); System.out.println(s2); System.out.println("--------" ); } }
String转换成基本类型
除了Character类之外,其他所有包装类都具有parseXxx静态方法可以将字符串参数转换为对应的基本类型:
public static byte parseByte(String s)
:将字符串参数转换为对应的byte基本类型。public static short parseShort(String s)
:将字符串参数转换为对应的short基本类型。public static int parseInt(String s)
:将字符串参数转换为对应的int基本类型。public static long parseLong(String s)
:将字符串参数转换为对应的long基本类型。public static float parseFloat(String s)
:将字符串参数转换为对应的float基本类型。public static double parseDouble(String s)
:将字符串参数转换为对应的double基本类型。public static boolean parseBoolean(String s)
:将字符串参数转换为对应的boolean基本类型。代码使用(仅以Integer类的静态方法parseXxx为例)如:
转换方式方式一:先将字符串数字转成Integer,再调用valueOf()方法 方式二:通过Integer静态方法parseInt()进行转换 注意:如果字符串参数的内容无法正确转换为对应的基本类型,则会抛出java.lang.NumberFormatException
异常。
2.6 底层原理建议:获取Integer对象的时候不要自己new,而是采取直接赋值或者静态方法valueOf的方式。因为在实际开发中,-128~127之间的数据,用的比较多。如果每次使用都是new对象,那么太浪费内存了。
所以,提前把这个范围之内的每一个数据都创建好对象,如果要用到了不会创建新的,而是返回已经创建好的对象。