java时间日期API

一、JDK8.0以前

public class DateTimeTest {

    /*
    java.util.Date类
           |-----java.sql.Date类
    1.两个构造器的使用
        >构造器一;Date():创建一个对应当前时间的Date对象
        >构造器二:创建指定毫秒数的Date对象
    2.两个方法的使用
      >toString():显示当前的年、月、日、时、分、秒
      >getTime():获取当前Date对象对应的毫秒数。(时间戳)

    3.java.sql.Date对应着数据库中的日期类型的变量
      >如何实例化
      >如何将java.util.Date对象转换为java.sql.Date对象
     */
    @Test
    public void test2(){
        //构造器一;Date():创建一个对应当前时间的Date对象
        Date date1 = new Date();//
        System.out.println(date1.toString());
        System.out.println(date1.getTime());//

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

        //创建java.sql.Date对象
        java.sql.Date date3 = new java.sql.Date(3565456358995l);
        System.out.println(date3);

        //如何将java.util.Date对象转换为java.sql.Date对象
        //情况一:
//        Date date4 = new java.sql.Date(55488464646464848l);
//        java.sql.Date date5 = (java.sql.Date) date4;
        //情况二;
        Date date6 = new Date();
        java.sql.Date date7 = new java.sql.Date(date6.getTime());

    }
    //1.System类中的currentTimeMillis();
    @Test
    public void test1(){
        long time = System.currentTimeMillis();
        System.out.println(time);
    }
}

 2.java.text.SimpleDateFormat类

SimpleDateFormat对日期Date类的格式化和解析
1.两个操作:
1.1 格式化:日期 ----> 字符串
1.2 解析:格式化的逆过程,字符串 ----> 日期

2.SimpleDateFormat的实例化:new + 构造器
//*********按照指定的方式格式化和解析:调用带参的构造器****************
//        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy.MMMM.dd GGG hh:mm aaa");
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        //格式化
        String format1 = sdf1.format(date);
        System.out.println(format1);
        //解析:要求字符串必须是符合SimpleDateFormat识别的格式(通过构造器参数体现),
        //否则,抛异常
        Date date2 = sdf1.parse("2019-02-18 11:25:25");
        System.out.println(date2);

练习:

/*
    练习一:字符串“2020-09-08”转换为java.sql.Date

    练习二:“三天打鱼两天晒网”  1990-01-01 xxxx-xx-xx 打鱼?晒网?
    举例;2020-09-08 ? 总天数
    总天数 % 5 ==1,2,3:打鱼
    总天数 % 5 ==4,0:晒网
    总天数的计算?
    方式一:(date2.getTime() - date1.getTime())/(1000 * 60 * 60 * 24) + 1
    方式二:1990-01-01 ---> 2019-12-31 + 2020-01-01 ---> 2020-09-08
     */
    @Test
    public void testExer() throws ParseException {
        String birth = "2020-09-08";
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
        Date date = sdf1.parse(birth);
        java.sql.Date barthDate = new java.sql.Date(date.getTime());
        System.out.println(barthDate);
    }

3.Calendar日历类(抽象类)


@Test
    public void testCalendar(){
        //1.实例化
        //方式一:创建其子类(GregorianCalendar)的对象
        //方式二:调用其静态方法getInstance()
        Calendar calendar = Calendar.getInstance();

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

        //set()
        calendar.set(Calendar.DAY_OF_MONTH,22);
        int days1 = calendar.get(Calendar.DAY_OF_YEAR);
        System.out.println(days1);

        //add()
        calendar.add(Calendar.DAY_OF_MONTH,3);
        int days2 = calendar.get(Calendar.DAY_OF_YEAR);
        System.out.println(days2);

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

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

日期时间API的迭代:

第一代:jdk 1.0 Date类

第二类; jdk 1.1 Calendar类,一定程度上替换Date类

第三代: jdk 1.8 提出了新的一套API

前两代存在的问题;

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

java 8 中新的日期时间API涉及到的包

 

 4.LocalDate、LocalTime、LocalDateTime

说明:

①:分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的本地日期或时间,并不包含当前的时间信息,也不包含与时区相关的信息。

②、LocalDateTime相较于LocalDate、LocalTime,使用频率高

③、类似于Calender

常用方法:

 

 

@Test
    public void test1(){
        //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(2020, 10, 6, 13, 2, 32);
        System.out.println(localDateTime1);

        //getXxx():获取相关的属性
        System.out.println(localDateTime.getDayOfMonth());
        System.out.println(localDateTime.getDayOfWeek());
        System.out.println(localDateTime.getMonth());
        System.out.println(localDateTime.getMonthValue());
        System.out.println(localDateTime.getMinute());

        //体现不可变形
        //withXxx():设置相关的属性
        LocalDate localDate1 = localDate.withDayOfMonth(22);
        System.out.println(localDate);
        System.out.println(localDate1);

        LocalDateTime localDateTime2 = localDateTime.withHour(4);
        System.out.println(localDateTime);
        System.out.println(localDateTime2);

        //不可变性
        LocalDateTime localDateTime3 = localDateTime.plusMonths(3);
        System.out.println(localDateTime);
        System.out.println(localDateTime3);

        LocalDateTime localDateTime4 = localDateTime.minusDays(6);
        System.out.println(localDateTime);
        System.out.println(localDateTime4);
    }

5.时间点:Instant

说明:

①、时间线上的一个瞬时点。概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒数。

②、类似于java.util.Date类

常用方法:

 

 

@Test
    public void test2(){
        //now():获取本初子午线对应的标准时间
        Instant instant = Instant.now();
        System.out.println(instant);
        //添加时间的偏移量
        OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
        System.out.println(offsetDateTime);

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

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

6.日期时间格式化类:DateTimeFormatter

说明:

①、格式化或解析日期、时间

②、类似于SimpleDateFormat

常用方法:

①、实例化方式:

预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME

本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)

自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)

②、常用方法:

 

 

 @Test
    public void test3(){
//        方式一: 预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
        DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
        //格式化:日期 ---->字符串
        LocalDateTime localDateTime = LocalDateTime.now();
        String str1 = formatter.format(localDateTime);
        System.out.println(localDateTime);
        System.out.println(str1);
        //解析:字符串 --->日期
        TemporalAccessor parse = formatter.parse("2022-01-20T23:03:19.8530589");
        System.out.println(parse);
//        方式二: 本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
        DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
        //格式化
        String str2 = formatter1.format(localDateTime);
        System.out.println(str2);
//        方式三: 自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
        DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
        //格式化
        String str4 = formatter2.format(LocalDateTime.now());
        System.out.println(str4);
        //解析
        TemporalAccessor accessor = formatter2.parse("2022-01-20 11:19:27");
        System.out.println(accessor);
    }

7、其他API

ZoneId :该类中包含了所有的时区信息,一个时区的ID,如 Europe/Paris

 ZonedDateTime :一个在ISO-8601日历系统时区的日期时间,如 2007-12-03T10:15:30+01:00 Europe/Paris。

其中每个时区都对应着ID,地区ID都为“{区域}/{城市}”的格式,例如:Asia/Shanghai等

Clock :使用时区提供对当前即时、日期和时间的访问的时钟。

持续时间:Duration,用于计算两个“时间”间隔

日期间隔:Period,用于计算两个“日期”间隔

TemporalAdjuster : 时间校正器。有时我们可能需要获取例如:将日期调整到“下一个工作日”等操作。

emporalAdjusters : 该类通过静态方法(firstDayOfXxx()/lastDayOfXxx()/nextXxx())提供了大量的常用T emporalAdjuster 的实现

//ZoneId:类中包含了所有的时区信息
// ZoneId的getAvailableZoneIds():获取所有的ZoneId
Set<String> zoneIds = ZoneId.getAvailableZoneIds();
for (String s : zoneIds) {
System.out.println(s);
}
// ZoneId的of():获取指定时区的时间
LocalDateTime localDateTime = LocalDateTime.now(ZoneId.of("Asia/Tokyo"));
System.out.println(localDateTime);
//ZonedDateTime:带时区的日期时间
// ZonedDateTime的now():获取本时区的ZonedDateTime对象
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println(zonedDateTime);
// ZonedDateTime的now(ZoneId id):获取指定时区的ZonedDateTime对象
ZonedDateTime zonedDateTime1 = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));
System.out.println(zonedDateTime1);

//Duration:用于计算两个“时间”间隔,以秒和纳秒为基准
LocalTime localTime = LocalTime.now();
LocalTime localTime1 = LocalTime.of(15, 23, 32);
//between():静态方法,返回Duration对象,表示两个时间的间隔
Duration duration = Duration.between(localTime1, localTime);
System.out.println(duration);
System.out.println(duration.getSeconds());
System.out.println(duration.getNano());
LocalDateTime localDateTime = LocalDateTime.of(2016, 6, 12, 15, 23, 32);
LocalDateTime localDateTime1 = LocalDateTime.of(2017, 6, 12, 15, 23, 32);
Duration duration1 = Duration.between(localDateTime1, localDateTime);
System.out.println(duration1.toDays());

 

//Period:用于计算两个“日期”间隔,以年、月、日衡量
LocalDate localDate = LocalDate.now();
LocalDate localDate1 = LocalDate.of(2028, 3, 18);
Period period = Period.between(localDate, localDate1);
System.out.println(period);
System.out.println(period.getYears());
System.out.println(period.getMonths());
System.out.println(period.getDays());
Period period1 = period.withYears(2);
System.out.println(period1);

 

// 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);

与传统日期处理的转换

 

 

 
posted @ 2022-01-22 15:38  15python  阅读(76)  评论(0编辑  收藏  举报