Java 高级编程 学习打卡 第四天
1、将字符串”2017-08-16”转换为对应的java.sql.Date类的对象。(使用JDK8之前或JDK8中的API皆可)
2、解释何为编码?解码? 何为日期时间的格式化?解析?
编码:字符串——>字节
解码:字节——>字符串
格式化:日期——>字符串
解析:字符串——>日期
3、自定义Person类如下,如何实现自然排序(按姓名从小到大排序),代码说明
4、提供定制排序涉及到的接口的实现类对象,并按Person类的年龄从大到小排序
5、JDK 8之前和JDK8中日期、时间相关的类分别有哪些?
2021年4月28日
【学习打卡】Java高级 第一天
【学习打卡】Java高级 第二天
【学习打卡】Java高级 第三天
【学习打卡】Java高级 第四天
第一代:jdk 1.0 Date类
第二代:jdk 1.1 Calendar类,一定程度上替换Date类
第三代:jdk 1.8 提出了新的一套API
可变性:像日期和时间这样的类应该是不可变的。
偏移性:Date中的年份是从1900开始的,而月份都从0开始。
格式化:格式化只对Date有用,Calendar则不行。
此外,它们也不是线程安全的;不能处理闰秒等。
1、说明:
① 分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的本地日期或时间,并不包含当前的时间信息,也不包含与时区相关的信息。
② LocalDateTime相较于LocalDate、LocalTime,使用频率要高
③ 类似于Calendar
2、常用方法:
1、说明:
① 时间线上的一个瞬时点。 概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC开始的秒数。)
② 类似于 java.util.Date类
2、常用方法:
1、说明:
① 格式化或解析日期、时间
② 类似于SimpleDateFormat
2、常用方法:
① 实例化方式:
预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
② 常用方法:
特别的:自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
// 重点:自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
String s = formatter.format(LocalDateTime.now());
System.out.println(s);
//2021-05-02 08:49:24
TemporalAccessor accessor = formatter.parse("2021-05-02 08:46:52");
System.out.println(accessor);
/*
{HourOfAmPm=8, MicroOfSecond=0, SecondOfMinute=52, MilliOfSecond=0,
MinuteOfHour=46, NanoOfSecond=0},ISO resolved to 2021-05-02
*/
1、带时区的日期时间:ZonedDateTime / ZoneId
// ZoneId:类中包含了所的时区信息
//获取所有的ZoneId
Set<String> zoneIds = ZoneId.getAvailableZoneIds();
for (String zoneId : zoneIds) {
System.out.println(zoneId);
}
//获取“America/Toronto”时区对应的时间
LocalDateTime localDateTime = LocalDateTime.now(ZoneId.of("America/Toronto"));
System.out.println(localDateTime);
//获取本时区的ZonedDateTime对象
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println(zonedDateTime);
//获取“America/Toronto”时区的ZonedDateTime对象
ZonedDateTime time = ZonedDateTime.now(ZoneId.of("America/Toronto"));
System.out.println(time);
3、日期间隔:Period,用于计算两个“日期”间隔,以年、月、日衡量
LocalDate startDate = LocalDate.of(2000, 9, 20);
LocalDate endDate = LocalDate.of(2020, 12, 29);
Period period = Period.between(startDate, endDate);
System.out.println(period);//P20Y3M9D
System.out.println(period.getDays());//9
System.out.println(period.getMonths());//3
System.out.println(period.getYears());//20
4、日期时间校正器:TemporalAdjuster
//获取当前日期的下一个星期天是哪天
TemporalAdjuster temporalAdjuster = TemporalAdjusters.next(DayOfWeek.SUNDAY);
LocalDateTime localDateTime = LocalDateTime.now().with(temporalAdjuster);
System.out.println(localDateTime);
//获取下一个工作日是哪天
LocalDate localDate = LocalDate.now().with(new TemporalAdjuster() {
@Override
public Temporal adjustInto(Temporal temporal) {
LocalDate date = (LocalDate) temporal;
if(date.getDayOfWeek().equals(DayOfWeek.FRIDAY)) {
return date.plusDays(3);
}else if(date.getDayOfWeek().equals(DayOfWeek.SATURDAY)){
return date.plusDays(2);
}else{
return date.plusDays(1);
}
}
});
System.out.println(localDate);
Java中的对象,正常情况下,只能进行比较:== 或 != 。不能使用 > 或 < 的,但是在开发场景中,我们需要对多个对象进行排序,言外之意,就需要比较对象的大小。使用Comparable 或 Comparator。
1、像String、包装类等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两个对象大小的方式。
2、像String、包装类重写compareTo()方法以后,进行了从小到大的排列
3、重写compareTo(obj)的规则:
如果当前对象this大于形参对象obj,则返回正整数,
如果当前对象this小于形参对象obj,则返回负整数,
如果当前对象this等于形参对象obj,则返回零。
4、对于自定义类来说,如果需要排序,我们可以让自定义类实现Comparable接口,重写compareTo(obj)方法。在compareTo(obj)方法中指明如何排序
public class Goods implements Comparable {
private String name;
private double price;
/**
*
* 指明商品比较大小的方式
* 按照价格从低到高排序
* 再按照商品名称从高到低排序
*
*/
@Override
public int compareTo(Object o) {
if(o instanceof Goods){
//方式一
Goods goods = (Goods) o;
if(this.price> goods.price){
return 1;
}else if(this.price<goods.price){
return -1;
}else{
//return 0;
return this.name.compareTo(goods.name);
}
//方式二
//return Double.compare(this.price,goods.price);
}
throw new RuntimeException("传入的数据类型不一致");
}
}
1、背景:
当元素的类型没实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用 Comparator 的对象来排序
2、重写compare(Object o1,Object o2)方法,比较o1和o2的大小:
如果方法返回正整数,则表示o1大于o2;
如果返回0,表示相等;
返回负整数,表示o1小于o2。
public class Book {
private String name;
private double price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
/*
指明书比较大小的方式
按照书名从低到高排序
再按照价格从高到低排序
*/
Comparator comparator = new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Book && o2 instanceof Book) {
Book book1 = (Book) o1;
Book book2 = (Book) o2;
if (book1.getName().equals(book2.getName())) {
return Double.compare(book1.getPrice(), book2.getPrice());
} else {
return book1.getName().compareTo(book2.getName());
}
}
throw new RuntimeException("输入的数据类型不一致");
}
};
}
Comparable接口的方式一旦一定,保证Comparable接口实现类的对象在任何位置都可以比较大小。
Comparator接口属于临时性的比较。
System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。该类位于java.lang包。
由于该类的构造器是private的,所以无法创建该类的对象,也就是无法实例化该类。其内部的成员变量和成员方法都是static的,所以也可以很方便的进行调用。
成员变量
System类内部包含in、out和err三个成员变量,分别代表标准输入流(键盘输入),标准输出(显示器)和标准错误输出流(显示器)
成员方法:
native long currentTimeMillis()
void exit(int status)
void gc()
String getProperty(String key)
java.lang.Math提供了一系列静态方法用于科学计算。其方法的参数和返回值类型一般为double型。
说明:
① java.math包的BigInteger可以表示不可变的任意精度的整数。