Java中的日期类使用

日期时间API

  • 计算世界时间的标准主要有:
    • UTC
    • GMT
    • CST

System静态方法

System类提供的 public static long currentTimeMillis() 用来返回当前时间与 1970年1月1日0时0分0秒 之间以毫秒为单位的时间差。

long l = System.currentTimeMillis();
System.out.println(l);

Date类

java.util.Date类:

  • import java.util.Date;
    public class Main {
        public static void main(String[] args)  {
            Date date = new Date(); // 创建了对应当前时间的Date对象
    
            System.out.println(date.toString());// Thu Jan 14 18:10:32 CST 2021
    
            System.out.println(date.getTime()); // 返回毫秒数
    
            Date date1 = new Date(2001, 8, 19);// 创建指定年月日的Date对象
            System.out.println(date1.toString());
    
            Date date2 = new Date(1610619181448L);// 创建指定秒数的Date对象
            System.out.println(date2.toString());
        }
    }
    

java.sql.Date类:

  • 是对应数据库中的时间,为了专门匹配数据库中的。

  • import java.sql.Date;
    public class Main {
        public static void main(String[] args)  {
            Date date = new Date(1231231231L); // 创建了一个sql的Date对象
            System.out.println(date);// 1970-01-15
    
            // 父类对象不能强转换为子类对象,反之可以
        }
    }
    

Calendar类

位于:java.util.Calendar

  • Calendar 是一个抽象基类,主用用于完成日期字段之间相互操作的功能。

  • 获取 Calendar 实例方法

    • 使用 Calendar.getInstance() 方法
    • 调用它的子类 GregorianCalendar 的构造器
  • 一个 Calendar 的实例是系统时间的抽象表示,通过get(int field) 方法来取得想要得时间信息。比如 YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY、MINUTE、SECOND

    API功能
    get(int filed)返回指定的属性值
    set(int filed, int change )将指定的属性设置为新的值
    add(int filed, int ad)在当前指定属性原来的值上加上指定的数
    getTime()返回一个Date对象
    setTime(Date date)将Calendar改为Date的时间
  • 注意:

    • 获取月份时:一月是从 0 开始的,后面的月份一次类推
    • 获取星期:周日是 1,周一是 2, 。。。。 周六是 7
  • 代码测试

  • import java.text.ParseException;
    import java.util.Calendar;
    import java.util.Date;
    
    
    public class Main {
    
        public static void main(String[] args) {
            // 实例化
            // 方式1: 创建其子类 (GregorianCalendar)的对象
            // 方式2: 调用它的静态方法getInstance()
    
            Calendar calendar = Calendar.getInstance();
    //        System.out.println(calendar.getClass());
    
            //常用方法
            // get()
            int days = calendar.get(Calendar.DAY_OF_MONTH); // 当前日期是这个月的第几天
            System.out.println(days);
            System.out.println(calendar.get(Calendar.DAY_OF_YEAR));// 当前日期是这一年的第几天
    
            // set()
            calendar.set(Calendar.DAY_OF_MONTH, 22);
            days = calendar.get(Calendar.DAY_OF_MONTH);
            System.out.println(days);
    
            // add()
            calendar.add(Calendar.DAY_OF_MONTH, 3);
            System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
            // getTime()
            Date date = calendar.getTime();
            System.out.println(date);
    
    
            // setTime()
            Date date1 = new Date();
            calendar.setTime(date1);
            System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
        }
    
    }
    

SimpleDateFormat类

位于 java.text.SimpleDateFormat

  • 它允许进行 格式化: 日期 -> 文本、**解析:**文本 -> 日期
  • 格式化:
    • SimpleDateFormat(): 默认的模式和语言环境创建对象
    • public SimpleDateFormat(String pattern): 该构造方法可以用参数 pattern 指定的格式创建一个对象,该对象调用
    • public String format(Date date): 方法格式化时间对象date
  • 解析:
    • public Date parse(String source): 给定字符串的开始解析文本,以生成一个日期。

测试默认的构造器,创建的对象

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        SimpleDateFormat sdf = new SimpleDateFormat();
        // 格式化:Date格式化为字符串
        Date date = new Date();
        System.out.println(date);
        String format = sdf.format(date);
        System.out.println(format);

        // 解析: 格式化的逆过程
        String str = "2021/1/17 下午6:41";
        try {
            Date date1 = sdf.parse(str);
            System.out.println(date1);
        } catch (ParseException e) {
            e.printStackTrace();
        }

    }

}

输出

Sun Jan 17 18:41:49 CST 2021
2021/1/17 下午6:41
Sun Jan 17 18:41:00 CST 2021

使用带参数的构造器
在这里插入图片描述

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;


public class Main {

    public static void main(String[] args) throws ParseException {
        // 带参数的构造函数,中传入的希望格式化的样式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        // 格式化
        String s = sdf.format(new Date());
        System.out.println(s);

        // 解析
        Date date = sdf.parse("2021-01-17 06:47:18");
        System.out.println(date);

    }

}

输出:

2021-01-17 06:49:36
Sun Jan 17 06:47:18 CST 2021

练习

  • 将 “2020-09-08” 转换为 java.sql.Date.

    • 先将字符串,转换成Date类
      • 通过SimpleDateForm类的解析方法
    • 将Date类转换成sql.Date
      • 通过sql.Date带参数的构造器,用Date的getTime方法传入参数
  • import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    
    public class Main {
        // 练习:将2020-09-08转换为sql.Date
        public static void main(String[] args) throws ParseException {
            testExer();
    
        }
        public static void testExer() throws ParseException {
            String birth = "2020-09-08";
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    
            Date date = sdf.parse(birth);
            // 将Date 转换成 sql.Date, 同步构造器传入秒。
            java.sql.Date birthDate = new java.sql.Date(date.getTime());
            System.out.println(birthDate.toString());
        }
    }
    

LocalDate类、LocalTime类、LocalDateTime类

方法描述
now()静态方法,根据当前的时间创建对象/指定时区的对象
of()静态方法。根据指定日期/时间创建对象
getDayOfMonth()/getDayOfYear()获得月份天数(1-31)/ 获得年份天数(1-366)
getDayOfWeek()获得星期几(返回一个DayOfWeek 枚举值)
getMonth()获得月份、返回一个Month枚举值
getMonthValue()/getYear()获得月份(1-12)/获得年份
getHour()/getMinute()/getSecond()获得当前对象对应的小时、分钟、秒
withDayOfMonth()/withDayOfYear()/withMonth()/withYear()将月份天数、年份天数、月份、年份修改为指定的值并返回新对象
plusDays(),pulsWeeks(),plusMonths(),plusYears(),plusHours()向当前对象添加几天,几周,几个月,几年,几小时
minusMonths(), minusWeeks(),minusDays(),minusYears(),minusHours()从当前对象减去几月,几周,几天几年,几个小时
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;


public class Main {

    public static void main(String[] args) {


        // LocalDate
        LocalDate localDate = LocalDate.now(); // 获取当前系统时间
        System.out.println(localDate);


        // LocalTime
        LocalTime localTime = LocalTime.now(); // 获取当前系统时间
        System.out.println(localTime);


        // LocalDateTime
        LocalDateTime localDateTime = LocalDateTime.now();// 获取当前系统时间
        System.out.println(localDateTime);
        // of()
        LocalDateTime localDateTime1 = LocalDateTime.of(2021, 1, 17, 20, 0, 0);
        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());
        // 体现不可变性
        LocalDate localDate1 = localDate.withDayOfMonth(22);
        System.out.println(localDate);
        System.out.println(localDate1);
        
        
    }

}

Instant类

  • 用来记录某个时间点,以秒为单位

    • 方法描述
      now()静态方法,返回默认UTC时区的Instant类的对象
      ofEpochMilli(long epochMilli)静态方法,返回在1970-01-01 00:00:00基础上加上指定毫秒数之后的Instant类的对象
      atOffset(ZoneOffse offset)结合即时的偏移量来创建一个 OffsetDate Time
      toEpochMilli()返回1970-01-01 00:00:00到当前时间的毫秒数,即为时间戳
    import java.time.*;
    
    
    public class Main {
    
        public static void main(String[] args) {
            // now(): 获取本初子午线对应的标准时间
            Instant instant = Instant.now();
            System.out.println(instant);
    
            // 添加时间偏移量
            OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
            System.out.println(offsetDateTime);
    
            //  获取距离 1970-01-01 00:00:00 到现在的毫秒数
            long l = instant.toEpochMilli();
            System.out.println(l);
    
            // 通过给定的毫秒数,计算Instant实例
            Instant instant1 = Instant.ofEpochMilli(1610885932356L);
            System.out.println(instant1);
    
        }
    
    }
    
  • 输出

    • 2021-01-17T12:19:55.217502900Z
      2021-01-17T20:19:55.217502900+08:00
      1610885995217
      2021-01-17T12:18:52.356Z
      

DateTimeFormatter类

位于 java.time.format.DateTime.Formatter类:该类提供了三种格式化方法

  • 预定义格式标准。如:

    ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME

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

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

    • 方法描述
      ofPattern(String pattern)静态方法,返回一个指定字符串格式DateTimeFormatter
      format(TemporalAccessor t)格式化一个日期、时间。返回字符串
      parse(CharSequence text)将指定格式的字符序列解析为一个日期、时间
    import java.time.*;
    import java.time.format.DateTimeFormatter;
    import java.time.format.FormatStyle;
    import java.time.temporal.TemporalAccessor;
    
    
    public class Main {
    
        public static void main(String[] args) {
            // 实例化
            // 1
            DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
            // 格式化:把日期改为字符串
            LocalDateTime localDateTime = LocalDateTime.now();
            String s = formatter.format(localDateTime);
            System.out.println(localDateTime);
            System.out.println(s);
    
            // 解析:字符串到日期
            TemporalAccessor parse = formatter.parse("2021-01-17T20:31:10.7686176");
            System.out.println(parse);
            // 2
            DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
            //格式化
            String s1 = formatter1.format(localDateTime);
            System.out.println(s1);
    
    
            DateTimeFormatter formatter2 = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL);
    
            String s2 = formatter2.format(LocalDateTime.now());
            System.out.println(s2);
    
            // 3
            DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
    //      格式化
            String s3 = formatter3.format(LocalDateTime.now());
            System.out.println(s3);
    
        }
    
    }
    

    输出

    2021-01-17T20:38:09.291183500
    2021-01-17T20:38:09.2911835
    {},ISO resolved to 2021-01-17T20:31:10.768617600
    2021/1/17 下午8:38
    2021年1月17日星期日
    2021-01-17 08:38:09
    
posted @   ACWink  阅读(317)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· SQL Server 内存占用高分析
阅读排行:
· 盘点!HelloGitHub 年度热门开源项目
· DeepSeek V3 两周使用总结
· 02现代计算机视觉入门之:什么是视频
· C#使用yield关键字提升迭代性能与效率
· 回顾我的软件开发经历(1)
点击右上角即可分享
微信分享提示

目录导航