学习10[常用类]
JDK8之前的日期时间API测试
1.System类中的currentTimeMillis()
2.java.util.Date类和java.util.Date
3.SimpleDateFormat
4.Calendar
-
System类中的currentTimeMillis()
用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差
称为时间戳
此方法适于计算时间差
long time = System.currentTimeMillis();
System.out.println(time);//1633966657021
-
Date类两个构造器的使用:
-
java.util.Date类
-
构造器一:Date();
创建一个对应当前时间的Date对象
Date date1 = new Date();
System.out.println(date1.toString());
//Mon Oct 11 23:50:11 CST 2021
-
构造器二:创建指定毫秒数的Date对象
1633967701698L
Date date2 = new Date(1633967701698l);
System.out.println(date2.toString());
//Mon Oct 11 23:55:01 CST 2021
还有它的子类:java.sql.Date类
两个方法的使用
-
toString():显示当前的年月日时分秒
-
getTime():获取当前Date对象的毫秒数(时间戳)
System.out.println(date1.getTime());//1633967701698
-
子类java.sql.Date对应着数据库中的日期类型的变量
如何实例化:创建java.sql.Date对象
java.sql.Date date3 = new java.sql.Date(345678368494L);
System.out.println(date3);
//1980-12-15只打印年月日
-
sql.Date----->util.Date对象:多态
-
util.Date----->sql.Date对象p470
情况一:强转√
Date date4=new java.sql.Date(5678976534567L);
java.sql.Date date5=(java.sql.Date)date4;
情况二:
Date date6=new Date();
java.sql.Date date7=new java.sql.Date(date6.getTime());
//用getTime()方法找到time,把毫秒数扔到构造器里作为参数
-
SimpleDateFormat:
SimpleDateFormat的实例化
//SimpleDateFormat的实例化
SimpleDateFormat sdf = new SimpleDateFormat();对日期Date类的格式化和解析
两个操作:
-
格式化:日期--->字符串
format()
-
解析:格式化的逆过程,字符串--->日期
parse()
使用默认的构造器时:
格式固定:21-10-17 上午1:10,
解析固定:Sat Dec 17 01:00:00 CST 2011
使用带参构造器时:
按照指定的方式格式化和解析构造器
-
练习一:
字符串“2020-09-08”转换为java.sql.Date
String birth="2020-09-08";
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = sdf1.parse(birth);//util下的Date
java.sql.Date date=new java.sql.Date(date1.getTime());
System.out.println(date);//sql下的Date
练习二:
三天打鱼两天晒网 1990-01-01
2020-09-08打渔?晒网?
方式一:
(date2.getTime()-date2.getTime())/(1000*60 *60 *24)+1
方式二:
总天数%5==1,2,3:打渔
总天数%5==4,0:晒网
总天数的计算:
1990-01-01---->2019-12-31+
2020-01-01----->2020-09-08
-
Calendar日历类(抽象类)的使用
一、实例化
方式一:创建其子类(GregorianCalendar)的对象
方式二:调用其静态方法getInstance()
Calendar calendar = Calendar.getInstance();
两个方法是一样的:
System.out.println(calendar.getClass());
//对象是哪个类造的:class java.util.GregorianCalendar
二、常用方法
-
get()
当前时间是这个月的第几天:
int days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);//17
-
set()
返回值为void:改本身
calendar.set(Calendar.DAY_OF_MONTH,2);
days=calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);//2
-
add():
返回值为void:改本身
calendar.add(Calendar.DAY_OF_MONTH,3);
days=calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);//5
-
getTime()
日历类---->Date
Date date2 = calendar.getTime();
System.out.println(date2);
//Tue Oct 05 17:52:03 CST 2021
-
setTime()
Date---->日历类
Date date3 = new Date();
calendar.setTime(date3);
days=calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);//17
注意:
获取月份时:
一月是0,二月是1……
获取星期时:
周日是1,周一是2
习题
-
部分反转
-
查找字符串出现几次
-
寻找最大的相同子字符串
-
存在多个长度相同的最大子字符串
此时先返回String[ ],后面可以用集合中的ArrayList替换
输出:[hello,kabcd]
-
程序输出
IDEA中Debug
JDK8中新日期时间API
以前面临的问题:
可变性:
像日期和时间这样的类应该是不可变的
偏移性:
Date date = new Date(2020-1900, 9-1, 8);
System.out.println(date);
格式化:
格式化只对Date有用,Calendar则不行
不是线程安全的,不能处理闰秒
LocalDate、LocalTime、LocalDateTime的使用
说明 :
-
LocalDateTime的使用频率高
一、实例化
-
now()
获取当前的日期、时间、日期和时间
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDate);//2021-10-18
System.out.println(localTime);//10:11:35.725
System.out.println(localDateTime);//2021-10-18T10:11:35.725
-
of()
设置指定的年月日时分秒,没有偏移量
LocalDateTime localDateTime1 = LocalDateTime.of(2020, 6, 12, 3, 5, 4);
System.out.println(localDateTime1);//2020-06-12T03:05:04
二、方法
-
getXxx():获取相关属性
没有偏移值
System.out.println(localDate.getDayOfWeek());//MONDAY
-
withXxx():设置相关属性
体现不可变性
LocalDate localDate1 = localDate.withDayOfMonth(23);
System.out.println(localDate);//2021-10-18
System.out.println(localDate1);//2021-10-23
-
plusXxx():加
LocalDateTime localDateTime2 = localDateTime.plusMonths(4);
System.out.println(localDateTime);//2021-10-18T10:38:48.102
System.out.println(localDateTime2);//2022-02-18T10:38:48.102
-
minusXxx():减
instant的使用
类似java.util.Date类
一、实例化
-
now():获取本初子午线对应的标准时间
Instant instant = Instant.now();
System.out.println(instant);
//2021-10-18T02:57:19.525Z
有8个小时时间差
添加时间的偏移量:
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);//2021-10-18T11:01:11.190+08:00
(instant小写)
-
ofEpochMilli()
通过给定的毫秒数,获取Instant实例
Instant instant1 = Instant.ofEpochMilli(1634526344321l);
System.out.println(instant1);//2021-10-18T03:05:44.321Z
二、方法
-
toEpochMilli()
获取自1970年1月1日0时0分0秒(UTC)开始的毫秒数
类似Date类的getTime()
long milli = instant.toEpochMilli();
System.out.println(milli);//1634526344321
DateTimeFormatter类
用来格式化或解析日期、时间
类似SimpleDateFormat
一、预定义的标准格式
DateTimeFormatter formatter=DateTimeFormatter.ISO_DATE_TIME;
-
格式化:日期---->字符串
format();
LocalDateTime localDateTime = LocalDateTime.now();
String str = formatter.format(localDateTime);
System.out.println(localDateTime);//2021-10-18T11:26:22.153
System.out.println(str);
//2021-10-18T11:26:22.153
-
解析:字符串---->日期
parse();
TemporalAccessor parse = formatter.parse("2021-10-18T11:26:22.153");
System.out.println(parse);
//{},ISO resolved to 2021-10-18T11:26:22.153
二、本地化相关的格式
-
ofLocalizedDate();
FormatStyle.FULL/FormatStyle.LONG/
FormatStyle.MEDIUM/FormatStyle.SHORT:
适用于LocalDate
LocalDateTime localDateTime = LocalDateTime.now();DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG);
-
格式化
String str=dateTimeFormatter.format(localDateTime);
System.out.println(str);//2021年10月18日
格式不同:
-
解析
-
ofLocalizedDateTime();
FormatStyle.LONG/FormatStyle.MEDIUM/FormatStyle.SHORT:
适用于LocalDateTime
三、自定义的格式(重点)
ofPatter("yyyy-MM-dd hh:mm:ss E")
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh-mm-ss");
-
格式化
String str = dateTimeFormatter.format(LocalDateTime.now());
System.out.println(str);//2021-10-18 11-57-53
-
解析
TemporalAccessor accessor = dateTimeFormatter.parse("2021-10-18 11-57-53");
System.out.println(accessor);//{SecondOfMinute=53, MinuteOfHour=57, MicroOfSecond=0, MilliOfSecond=0, NanoOfSecond=0, HourOfAmPm=11},ISO resolved to 2021-10-18
Java比较器
一、说明:
Java中的对象,正常情况下,只能进行比较==或!=,不能使用<,>的
但是在开发场景中,我们需要对多个对象进行排序,言外之意,就需要比较对象的大小
如何实现?
使用两个接口中的任何一个:Comparable、Comparator
二、Comparable接口的使用
Comparable接口的使用举例:自然排序
-
像String、包装类等实现了Comparable接口,重写了ComparableTo(obj)方法,给出了比较两个对象大小的方式
-
像String、包装类重写了comparableTo(obj)方法,进行从小到大的排列
//Comparable接口的使用举例
String arr[]=new String[]{"AA","DD","RR","EE","FF"};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
-
重写comparableTo(obj)的规则:
如果当前对象this大于形参对象obj,则返回正整数,
如果当前对象this小于形参对象obj,则返回负数
如果当前对象this小于形参对象obj,则返回零
-
对于自定义类来说,如果需要排序,我们可以让自定义类实现Comparable接口,重写comparableTo(obj)方法,在comparableTo(obj)方法中指明如何排序
-
Comparator接口使用:定制排序
-
背景:
当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用Comparator的对象来排序
-
重写compare(Object o1,Object o2)方法,比较o1和o2的大小:
如果方法返回正整数,则表示o1大于o2;返回0,相等;返回负整数,则表示o1小于o2
-
String arr[]=new String[]{"AA","DD","RR","EE","FF"};Arrays.sort(arr, new Comparator<String>() { //按照字符串从大到小排列
三、Comparable接口与Comparator的使用的对比:
Comparable接口的方式一旦指定,可以保证Comparable接口实现类的对象在任何位置都可以比较大小
Comparator接口属于临时性比较
其他常用类的使用
-
native long currentTimeMills()
-
void exit(int status)
-
void gc()
-
String getProperty(String key)
-
System类
-
Math类
-
BigInteger与BigDecimal
System类
String javaVersion = System.getProperty("java.version");System.out.println(javaVersion);//1.8.0_281
String javaHome = System.getProperty("java.home");System.out.println(javaHome);//E:\JDK8\jre
String osName = System.getProperty("os.name");System.out.println(osName);//Windows 10
String osVersion = System.getProperty("os.version");System.out.println(osVersion);//10.0
String userName = System.getProperty("user.name");System.out.println(userName);//1111
String userVersion = System.getProperty("user.version");System.out.println(userVersion);//null
String userDir = System.getProperty("user.dir");System.out.println(userDir);//E:\javaSE
Math类
BigInteger与BigDecimal
integer类作为int的包装类,能存储2^31-1
Long存储2^63-1
BigInteger可以表示不可变的任意精度的整数
BigDecimal对数字要求精度非常高

浙公网安备 33010602011771号