第一代日期时间类

java.util.Date:可以获取系统日期时间值
大多数人认为的计算机的标准时间是1970-1-1 0:0:0 0毫秒

获取当前系统日期时间

 @Test
    public void test() {
        Date date=new Date();
        System.out.println(date);
        //Wed Mar 23 18:12:18 CST 2022
    }

根据毫秒值得到一个整数值

  @Test
    public void test() {
        Date date=new Date(Long.MAX_VALUE);
        System.out.println(date);
        //Sun Aug 17 15:12:55 CST 292278994
    }

前系统时间距离1970-1-1 0:0:0 0毫秒的毫秒差值

    @Test
    public void test() {
        Date date=new Date();
        long time = date.getTime();//当前系统时间距离1970-1-1 0:0:0 0毫秒的毫秒差值
        System.out.println(time);
        //1648031006969
    }

举例过时方法

	@Test
    public void test() {
        Date date=new Date(2022,3,23);
        System.out.println(date);
        //Sun Apr 23 00:00:00 CST 3922
        //参数year(2022),表示距离1900年,过去了多少年
        //参数month(3),表示0-11的月份,0是1月
    }

日期格式化

java.text.DateFormat(抽象)类及其子类SimpleDateFormat:对日期进行格式化处理可以把字符串按照某个格式解析为日期时间对象。

把日期时间的Date对象格式化处理为具体格式的字符串。

    定义了以下模式字母(所有其他字符 'A' 到 'Z' 和 'a' 到 'z' 都被保留):
    字母  日期或时间元素  表示  示例
    G  Era 标志符  Text  AD
    y  年  Year  1996; 96
    M  年中的月份  Month  July; Jul; 07
    w  年中的周数  Number  27
    W  月份中的周数  Number  2
    D  年中的天数  Number  189
    d  月份中的天数  Number  10
    F  月份中的星期  Number  2
    E  星期中的天数  Text  Tuesday; Tue
    a  Am/pm 标记  Text  PM
    H  一天中的小时数(0-23)  Number  0
    k  一天中的小时数(1-24)  Number  24
    K  am/pm 中的小时数(0-11)  Number  0
    h  am/pm 中的小时数(1-12)  Number  12
    m  小时中的分钟数  Number  30
    s  分钟中的秒数  Number  55
    S  毫秒数  Number  978
    z  时区  General time zone  Pacific Standard Time; PST; GMT-08:00
    Z  时区  RFC 822 time zone  -0800
   @Test
    public void test() {
        Date date=new Date();
        System.out.println(date);//Wed Mar 23 18:46:52 CST 2022

        SimpleDateFormat sf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss SSS毫秒 E 这是这一年的D天");
        System.out.println(sf.format(date));
        //2022年03月23日 18:48:09 864毫秒 星期三 这是这一年的82天
    }

第二代日期时间类

JDK1.1
1、java.util.Calendar(抽象类):日历类型
Calendar是一个抽象类,无法直接new对象,有一个直接子类:GregorianCalendar (格里高利历日期)。
为了照顾大家,在Calendar类中提供了静态方法,来获取Calendar的子类的对象。
虽然解决了一部分第一代的问题,例如:1970与1900的问题等
但是Calendar使用很麻烦,而且还不支持SimpleDateFormat。
2、java.util.TimeZone:时区类
3、java.util.Locale:语言环境类

日历类

	@Test
    public void test() {
        Calendar calendar=Calendar.getInstance();//默认获取当前语言环境,当前时区的日历对象。
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH) + 1;//月份从0开始
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        
        int hour = calendar.get(Calendar.HOUR_OF_DAY);//24小时制
        //int hour = calendar.get(Calendar.HOUR);12小时制
        int minute = calendar.get(Calendar.MINUTE);
        int second = calendar.get(Calendar.SECOND);
        System.out.println(year +"-" + month +"-" + day +" "+ hour+":" + minute+":"+second);
        //2022-3-23 18:54:58
    }

指定时区

 	@Test
    public void test() {
        TimeZone timeZone = TimeZone.getTimeZone("America/Los_Angeles");
        Locale locale = Locale.US;
        Calendar calendar=Calendar.getInstance(timeZone,locale);//默认获取当前语言环境,当前时区的日历对象。
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH) + 1;//月份从0开始
        int day = calendar.get(Calendar.DAY_OF_MONTH);

        int hour = calendar.get(Calendar.HOUR_OF_DAY);//24小时制
        //int hour = calendar.get(Calendar.HOUR);12小时制
        int minute = calendar.get(Calendar.MINUTE);
        int second = calendar.get(Calendar.SECOND);
        System.out.println(year +"-" + month +"-" + day +" "+ hour+":" + minute+":"+second);
        //2022-3-23 3:59:55

		//可以修改时间
		calendar.set(Calendar.YEAR, 2008);
        year = calendar.get(Calendar.YEAR);
        System.out.println(year +"-" + month +"-" + day +" "+ hour+":" + minute+":"+second);
    }

第三代日期时间类

JDK1.8
解决一下问题:

可变性:象日期和时间这样的类对象应该是不可变的。Calendar类中可以使用三种方法更改日历字段:set()、add() 和 roll()。

  • 偏移性:Date中的年份是从1900开始的,而月份都是从0开始的。
  • 格式化:格式化只对Date有用,Calendar则不行。
  • 此外,它们也不是线程安全的,不能处理闰秒等。

在java.time包及其子包提供了日期,时间,瞬间和持续时间的主要API。
1、本地日期时间:LocalDate、LocalTime、LocalDateTime
2、指定时区日期时间:ZondId和ZonedDateTime
3、持续日期/时间:Period和Duration
4、DateTimeFormatter:日期时间格式化

预定义的标准格式。如:ISO_DATE_TIME;ISO_DATE
本地化相关的格式。如:ofLocalizedDate(FormatStyle.MEDIUM)
            FormatStyle是一个枚举类型
自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)

当前日期及时间

	@Test
    public void test() {
        LocalDate date=LocalDate.now();
        System.out.println(date);//2022-03-23  当前日期

        LocalTime time=LocalTime.now();
        System.out.println(time);//19:07:49.467  当前时间

        LocalDateTime dateTime=LocalDateTime.now();
        System.out.println(dateTime);//2022-03-23T19:07:49.467  当前具体时间

    }

指定日期,得到日期

  @Test
    public void test() {
        LocalDate date=LocalDate.of(2022,10,1);
        System.out.println(date);//2022-10-01
        
        System.out.println(LocalDate.now().getMonth());
        //MARCH  得到month的对象名
        
        System.out.println(LocalDate.now().getMonthValue());
        //3      得到month的值
    }

几天之后的日期

    @Test
    public void test() {
        LocalDate date=LocalDate.now();
        System.out.println(date);//2022-03-23

        LocalDate future=date.plusDays(100);
        System.out.println(future);//2022-07-01
    }

判断闰年

  	@Test
    public void test() {
        LocalDate date=LocalDate.now();
        System.out.println(date.isLeapYear());
    }

指定时区

   @Test
    public void test() {
        ZoneId zoneId=ZoneId.of("America/Los_Angeles");
        ZonedDateTime now = ZonedDateTime.now(zoneId);
        System.out.println(now);
        //2022-03-23T04:29:09.934-07:00[America/Los_Angeles]
        //-07是时区偏移
    }

查看所有时区

    @Test
    public void test() {
       Set<String> set=ZoneId.getAvailableZoneIds();
       for (String zoneId : set) {
           System.out.println(zoneId);
       }
    }

持续日期/时间

	@Test
    public void test() {
      LocalDate date=LocalDate.now();
      LocalDate birthday=LocalDate.of(2022,06,07);
      Period period = Period.between(date, birthday);
      System.out.println(period);//P2M15D  两个月15天

      LocalTime localTime=LocalTime.now();
      LocalTime shopping=LocalTime.of(20,0,0);
      Duration duration=Duration.between(localTime,shopping);
      System.out.println(duration);//PT21M57.949S 21分钟57秒949毫秒
    }

日期格式化

   @Test
    public void test() {
      LocalDateTime date=LocalDateTime.now();
      System.out.println(date);//默认 2022-03-23T19:40:31.749

      //日期时间格式的模板类
      DateTimeFormatter d1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
      System.out.println(d1.format(date));//2022年3月23日 下午07时43分23秒

      DateTimeFormatter d2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
      System.out.println(d2.format(date));//2022-3-23 19:45:13
        
      DateTimeFormatter d3 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
      System.out.println(d3.format(date));//22-3-23 下午7:45
      
      DateTimeFormatter d4 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).withZone(ZoneId.of("America/Los_Angeles"));
      System.out.println(d4.format(date));//2022年3月23日 星期三 下午07时48分43秒 PT   要指定时区
      
	  DateTimeFormatter d5 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss SSS毫秒 E 这是这一年的D天");
      System.out.println(d5.format(date));//2022年03月23日 19:50:49 061毫秒 星期三 这是这一年的82天
    }
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐