Java常用类之 JDK 8之前的日期时间API 和 8中新日期时间API

Java常用类

三、JDK 8之前的日期时间API

JDK 8 之前日期和时间的API测试:

3.1、currentTimeMillis

public void test1(){
    
    
    long time = System.currentTimeMillis();
    //返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。
    //称为时间戳:精确到毫秒,基本不会重复
    System.out.println(time);
}

3.2、两个Date类的使用

java.util.Data类(父类)
*      |---java.sql.Date类(子类)
*
*      1.两个构造器的使用
*          >构造器一:Date():创建一个对应当前时间的Date对象
*          >构造器二:创建指定毫秒数的Date对象
*
*      2.两个方法的使用
*          >toString():显示当前的年、月、日时、分、秒
*          >getTime(): 获取当前Date对象对应的毫秒数(时间戳)
*
*      3.java.sql.Date对应着数据库中的日期类型的变量
*          >如何实例化  java.sql.Date date3 = new java.sql.Date(2341655156L);
*          >将java.util.Date对象转换为java.sql.Date对象:两种方法:① 强转; ② 使用date6.getTime()

详细代码如下:

public void test2(){
    
    
    //构造器一:Date():创建一个对应当前时间的Date对象
    Date date1 = new Date();
    System.out.println(date1.toString());//Fri May 05 22:46:50 CST 2023
    System.out.println(date1.getTime());//1683298010350

    //构造器二:创建指定毫秒数的Date对象
    Date date2 = new Date(1603298010050L);
    System.out.println(date2.toString());

    //实例化
    java.sql.Date date3 = new java.sql.Date(2341655156L);
    System.out.println(date3);//1970-01-28

    //将java.util.Date对象转换为java.sql.Date对象:
    //情况一:强转
    Date date4 = new java.sql.Date(2341655156L);
    java.sql.Date date5 = (java.sql.Date) date4;
    //情况二:使用getTime()
    Date date6 = new Date();
    java.sql.Date date7 = new java.sql.Date(date6.getTime());
    System.out.println(date7);

}

3.3、SimpleDateFormat

SimpleDateFormate的使用:SimpleDateFormate对日期Date类的格式化和解析

重点关注:

1.两个操作
1.1 格式化:日期--->字符串	
		   方法:
			① format()输出
1.2 解析:格式化的逆过程:字符串-->日期 
		 方法:
			① 用parse() 
			② sdf1.parse("2023-05-06 12:23:59"):要求字符串必须符合SimpleDateFormat识别的格式(通过构造器的参数体现)

2.SimpleDateFormate的实例化
	① 使用默认的构造器
	② 按照指定的格式进行可视化

具体代码如下:

public void test() throws ParseException {
    
    
    //----------------------实例化SimpleDateFormat:使用默认的构造器----------------------
    SimpleDateFormat sdf = new SimpleDateFormat();//空参构造器

    //格式化:日期--->字符串
    Date date = new Date();
    System.out.println(date);

    String format = sdf.format(date);
    System.out.println(format);//2023/5/6 12:19

    //解析:格式化的逆过程:字符串-->日期
    String str = "2023/5/6 12:19";
    Date date1 = sdf.parse(str); //用parse()
    System.out.println(date1);

    //----------------------按照指定的格式进行可视化----------------------
    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    //格式化
    String format1 = sdf1.format(date);
    System.out.println(format1);//2023-05-06 12:23:59

    //解析:要求字符串必须符合SimpleDateFormat识别的格式(通过构造器的参数体现)
    //否则,抛异常
    Date date2 = sdf1.parse("2023-05-06 12:23:59");
    System.out.println(date2);
}

3.4、Calendar日历类的使用

1.获取Calendar实例的方法

① 使用Calendar.getInstance()方法
Calendar calendar = Calendar.getInstance();//造Calendar日历类的对象

② 调用它的子类GregorianCalendar的构造器。很少使用

2.重点掌握几个常用方法:

1.get() int days = calendar.get(Calendar.DATE);
2.set() 重新设置天数
3.add(): 加或减几天
4.getTime(): 日历类--->Date
5.setTime(): Date--->日历类
public void testCalendar(){
    
    
    Calendar calendar = Calendar.getInstance();
    System.out.println(calendar.getClass());//获取该类

    //2.常用方法
    //get()
    int days = calendar.get(Calendar.DATE);
    System.out.println(days);
    System.out.println(calendar.get(Calendar.DAY_OF_MONTH));

    //set() 重新设置天数
    calendar.set(Calendar.DAY_OF_MONTH, 22);//修改日期,无返回值,将值本身进行修改
    int days2 = calendar.get(Calendar.DATE);
    System.out.println(days2);

    //add(): 加或减 几天
    calendar.add(Calendar.DAY_OF_MONTH, -3);
    int days3 = calendar.get(Calendar.DATE);
    System.out.println(days3);

    //getTime(): 日历类--->Date
    Date date = calendar.getTime();
    System.out.println(date);

    //setTime(): Date--->日历类
    Date date1 = new Date();
    calendar.setTime(date1);
    int days4 = calendar.get(Calendar.DATE);
    System.out.println(days4);
}

注意:

获取月份时:一月是0,二月是1,以此类推,12月是11

获取星期时:周日是1,周二是2 , 。。。。周六是7

四、JDK 8中新日期时间API

而Calendar面临的问题是:

  • 可变性:像日期和时间这样的类应该是不可变的。
  • 偏移性:Date中的年份是从1900开始的,而月份都从0开始。
  • 格式化:格式化只对Date有用,Calendar则不行。
  • 此外,它们也不是线程安全的;不能处理闰秒等。

因此,新的 java.time 中包含了所有关于本地日期(LocalDate)、本地时间 (LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime) 和持续时间(Duration)的类。

4.1、LocalDate、LocalTime、LocalDateTime的使用

说明:
1.LocalDateTime相较于其它两个,使用频率要高
2.类似于Calendar

1.重点掌握几个常用方法:

1.now():获取当前的日期、时间、日期+时间
2.of(): 设置只当的年、月、日、时、分、秒是没有偏移量的(获取指定的时间)
3.withXxx():设置相关的属性(体现不可变性)
4.+ 或 - 时间

具体如下:

public void test1(){
    
    
    //通过now()创建该类
    //now():获取当前的日期、时间、日期+时间
    LocalDate localDate = LocalDate.now();
    LocalTime localTime = LocalTime.now();
    LocalDateTime localDateTime = LocalDateTime.now();

    System.out.println(localDate);
    System.out.println(localTime);
    System.out.println(localDateTime);

    //of(): 设置只当的年、月、日、时、分、秒是没有偏移量的(获取指定的时间)
    LocalDateTime localDateTime1 = LocalDateTime.of(2023, 5, 7, 11, 23, 25);
    System.out.println(localDateTime1);

    //getXxx(): 获取一些属性
    System.out.println(localDateTime.getDayOfMonth());//7
    System.out.println(localDateTime.getHour());//11
    System.out.println(localDateTime.getDayOfYear());//127
    System.out.println(localDateTime.getNano());//221116700  纳秒
    System.out.println(localDateTime.getMonth());//MAY

    //体现不可变性
    //withXxx():设置相关的属性
    LocalDate localDate1 = localDate.withDayOfMonth(28);
    System.out.println(localDate);//不可变性
    System.out.println(localDate1);
    LocalDateTime withHour = localDateTime.withHour(4);//改成4点
    System.out.println(withHour);

    //+ 或 - 时间
    LocalDateTime months = localDateTime.plusMonths(2);//加 2 个月
    System.out.println(months);
    LocalDateTime localDateTime2 = localDateTime.minusMonths(2);
    System.out.println(localDateTime2);

}

4.2、Instant瞬时类

Instance的使用类似于java.util.Date类

1.重点掌握几个常用方法:

1.now(): 获取本初子午线对应的标准时间  Instant instant = Instant.now();
2.atOffset(ZoneOffset.ofHours(8)):添加时间的偏移量
3.toEpochMilli(): 获取自197011000秒(UTC)开始的毫秒数--->Date()getTime()
4.ofEpochMilli():通过给定的毫秒数,获取Instance实例 ---Date(long millis)

具体如下:

public void test2(){
    
    
    //now(): 获取本初子午线对应的标准时间
    Instant instant = Instant.now();
    System.out.println(instant);//2023-05-07T03:56:53.041850400Z

    //atOffset(ZoneOffset.ofHours(8)):添加时间的偏移量
    OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
    System.out.println(offsetDateTime);//2023-05-07T11:57:29.668196600+08:00

    //toEpochMilli(): 获取自1970年1月1日0时0分0秒(UTC)开始的毫秒数--->像Date()的getTime()
    long milli = instant.toEpochMilli();
    System.out.println(milli);//1683431993283

    //ofEpochMilli():通过给定的毫秒数,获取Instance实例 ---像Date(long millis)
    Instant instant1 = Instant.ofEpochMilli(1683431993283L);
    System.out.println(instant1);
}

4.3、DateTimeFormatter

DateTimeFormatter: 格式化或解析日期、时间, 类似于SimpleDateFormat

1.重点掌握几个常用方法:

方式一:预定义的标准格式。如ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
方式二:本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
方式三:重点!!!自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)

1.自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
2.格式化:format(LocalDateTime.now()
3.解析:parse("2023-05-07 12:27:07")

具体如下:

public void test3(){
    
    
    //方式一:预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
    DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;

    //重点:方式三:自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
    DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
    //格式化:format(LocalDateTime.now()
    String str1 = formatter3.format(LocalDateTime.now());
    System.out.println(str1);//2023-05-07 12:27:07
    //解析:parse("2023-05-07 12:27:07")
    TemporalAccessor accessor = formatter3.parse("2023-05-07 12:27:07");
    System.out.println(accessor);
}

猜你喜欢

转载自blog.csdn.net/Miss_croal/article/details/132951221