Java常用类(2)--日期时间相关类Date、Calendar、LocalDateTime、Instant全面

简介: Java常用类(2)--日期时间相关类Date、Calendar、LocalDateTime、Instant全面

文章目录


java.lang.System类

java.util.Date类

java.sql.Date类

java.text.SimpleDateFormat类

java.util.Calendar(日历)类

java.time类

java.time.Instant类

java.time.format.DateTimeFormatter 类

其它API

java.lang.System类


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


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


java.util.Date类


构造器:

①Date():创建的对象可以获取本地当前时间

②Date(long date):创建指定毫秒数的Date对象,相当于又将时间戳转换成String形式


常用方法

①getTime():返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。

②toString():把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat),zzz是时间标准。


import java.util.Date;
public class DataTest {
    public static void main(String[] args) {
        Date date = new Date();
        System.out.println(date.toString());
        System.out.println(date); //等同于toString()方法
        System.out.println(date.getTime());
    }
}


java.sql.Date类


是java.util.Date类的子类,对应着数据库中的日期类型的变量。


构造器:java.sql.Date(时间戳)


常用方法:同上


java.sql.Date与java.util.Date转换,可以通过多态和getTime()方法


import java.util.Date;
public class DataTest {
    public static void main(String[] args) {
        Date date = new Date();
        java.sql.Date sqlDate = new java.sql.Date(date.getTime());
        System.out.println(sqlDate);
    }
}


java.text.SimpleDateFormat类


Date类的API不易于国际化,大部分被废弃了,java.text.SimpleDateFormat类是一个不与语言环境有关的方式来格式化和解析日期的具体类。其允许进行①格式化:日期—>字符串、②解析:字符串—>日期。


格式化:

1.实例化

①SimpleDateFormat() :默认的模式和语言环境创建对象

②SimpleDateFormat(String pattern):该构造方法可以用参数pattern指定的格式创建一个对象

2.格式化

实例化对象调用 String format(Date date)方法格式化时间对象


import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleTest {
    public static void main(String[] args) {
        SimpleDateFormat sdf = new SimpleDateFormat(); //无参默认模式实例化
        Date date = new Date(); 
        String format = sdf.format(date); //格式化
        System.out.println(format);
    }
}


553c31a769b049a39c752f3f4411e519.png


import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleTest {
    public static void main(String[] args) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd  hh:mm:ss"); //带参指定格式实例化
        Date date = new Date();
        String format = sdf.format(date); //格式化
        System.out.println(format);
    }
}


3dfbbefd0904437f8a6c4ae13e5959b4.png

3dfbbefd0904437f8a6c4ae13e5959b4.png


关于指定格式:


af6daf0546694beca56c478be0d29ea0.png60b69e8e918c44bb9fac5168a41d4f6c.png


解析(格式化逆过程):

Date parse(String source):依据格式解析字符串,以生成一个日期(注意格式的匹配对应,否则抛异常)


import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleTest {
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd  hh:mm:ss"); //带参指定格式实例化
        Date parse = sdf.parse("2020-12-20  22:03:19");
        System.out.println(parse);
    }
}


8a5d063019c247958ce77bc7e82a6567.png

8a5d063019c247958ce77bc7e82a6567.png


java.util.Calendar(日历)类


这是一个抽象(abstract)类,主用用于完成日期字段之间相互操作的功能。


实例化:

①使用Calendar.getInstance()该静态方法

②调用它的子类GregorianCalendar的构造器


常用方法:


import java.util.Calendar;
import java.util.Date;
public class CalendarTest {
    public static void main(String[] args) {
        Calendar instance = Calendar.getInstance();
        //get():int get(int field)
        int ofMouth = instance.get(Calendar.DAY_OF_MONTH);
        System.out.println(ofMouth);
        int ofYear = instance.get(Calendar.DAY_OF_YEAR);
        System.out.println(ofYear);
        //set():void set(int field,int value)
        instance.set(Calendar.DAY_OF_MONTH,9);
        System.out.println(instance.get(Calendar.DAY_OF_MONTH));
        //add:void add(int field,int amount)
        instance.add(Calendar.DAY_OF_MONTH,-2);
        System.out.println(instance.get(Calendar.DAY_OF_MONTH));
        //getTime:final Date getTime() 将日历类型转换为Date类型
        Date time = instance.getTime();
        System.out.println(time);
        //setTime:final void setTime(Date date) 将Date类型转换为日历类型
        instance.setTime(new Date());
        System.out.println("********" + instance.getTime());
    }
}


9e1c1e714c95493a83cb10a2e0773f3a.png


一个Calendar的实例是系统时间的抽象表示,通过get(int field)方法来取得想要的时间信息。比如YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY 、MINUTE、SECOND。


java.time类


LocalDate、LocalTime、LocalDateTime 类是其中较重要的几个子类,它们的实例

是不可变的对象,分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。


实例化:


0770d658794f4b61886e75b68fd6e0f7.png


import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class TimeTest {
    public static void main(String[] args) {
        //now() 获取当前日期,时间,日期+时间
        LocalDate now1 = LocalDate.now();
        LocalTime now2 = LocalTime.now();
        LocalDateTime now3 = LocalDateTime.now();
        System.out.println(now1);
        System.out.println(now2);
        System.out.println(now3);
        //of() 设置指定的年月日时分秒,没有偏移量
        LocalDateTime of = LocalDateTime.of(2021, 9, 9, 15, 36, 40);
        System.out.println(of);
    }
}


97fbce2b62f2447c932cc269c4ccb82f.png


其他常用方法:


75f38e06d04a4940998fdc1a3faaf1cf.png


import java.time.LocalDateTime;
public class TimeTest {
    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        //getXxx() 获取相关的属性
        System.out.println(now.getDayOfWeek());
        System.out.println(now.getMonth());
        System.out.println(now.getMonthValue()); //......
        //withXxx() 设置相关的属性,不可变性
        LocalDateTime nowWith = now.withDayOfMonth(8);
        System.out.println(nowWith);
        System.out.println(now);
        //plusXxx() 加,不可变性
        LocalDateTime pl = now.plusMonths(2);
        System.out.println(pl);
        //minusXxx() 减,不可变性
        LocalDateTime mi = now.minusDays(8);
        System.out.println(mi);
    }
}


6542462c0a944709baa19ed418e344d4.png


java.time.Instant类


Instant:时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间

戳。


de18375fe1684c94aa755d0ca06dfeb3.png


import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
public class InstantTest {
    public static void main(String[] args) {
        //获取本初子午线当前的标准时间
        Instant now = Instant.now();
        System.out.println(now);
        //结合时区,添加当地时间偏移量
        OffsetDateTime offsetDateTime = now.atOffset(ZoneOffset.ofHours(8));
        System.out.println(offsetDateTime);
        //返回1970-01-01 00:00:00到当前时间的毫秒数,即为时间戳
        long l = now.toEpochMilli();
        System.out.println(l);
        //返回在1970-01-01 00:00:00基础上加上指定毫秒数之后的Instant类的对象
        Instant instant = Instant.ofEpochMilli(l);
        System.out.println(instant);
    }
}


f3760012efff4dc78ce7e4de981c911c.png


java.time.format.DateTimeFormatter 类


该类提供了三种格式化方法:

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

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

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


ba756494e30d4c57a9b36e14e0857e96.png


import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.time.temporal.TemporalAccessor;
public class FormatterTest {
    public static void main(String[] args) {
        //方式一:预定义的标准格式
        DateTimeFormatter isoDateTime = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
        //格式化
        String format1 = isoDateTime.format(LocalDateTime.now());
        System.out.println(format1);
        //解析
        TemporalAccessor parse1 = isoDateTime.parse(format1);
        System.out.println(parse1);
        //方式二:本地化相关的格式
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
        //格式化
        String format2 = dateTimeFormatter.format(LocalDateTime.now());
        System.out.println(format2);
        //解析
        TemporalAccessor parse2 = dateTimeFormatter.parse(format2);
        System.out.println(parse2);
        //方式三:自定义格式
        DateTimeFormatter dateTimeFormatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
        //格式化
        String format3 = dateTimeFormatter3.format(LocalDateTime.now());
        System.out.println(format3);
        //解析
        TemporalAccessor parse3 = dateTimeFormatter3.parse(format3);
        System.out.println(parse3);
    }
}


79f599e363604b1d8a415641e1b9965a.png


其它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 : 时间校正器。有时我们可能需要获取例如:将日期调整到“下一个工作日”等操作。

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


b9d00acda5ba473a8d9ccc8e21b88562.pngac5dec0a7e8047c291e176c09af4a5ec.pngbe357ad1860b499487a8cb79e4e4669b.png614538cb7014484e8234cf9ea8084272.png








相关文章
|
1天前
|
Java
Java String类型转换成Date日期类型
Java String类型转换成Date日期类型
|
1天前
|
Java 开发者
Java中三种Set的实现类的用法和区别
Java中三种Set的实现类的用法和区别
|
1天前
|
消息中间件 安全 Java
在Spring Bean中,如何通过Java配置类定义Bean?
【4月更文挑战第30天】在Spring Bean中,如何通过Java配置类定义Bean?
8 1
|
2天前
|
Java
Java对象和类研究
Java对象和类研究
6 0
|
2天前
|
XML Java 测试技术
Java异常处理神器:Guava Throwables类概念与实战
【4月更文挑战第29天】在Java开发中,异常处理是保证程序稳定性和可靠性的关键。Google的Guava库提供了一个强大的工具类Throwables,用于简化和增强异常处理。本篇博客将探讨Throwables类的核心功能及其在实战中的应用。
10 2
|
2天前
|
存储 安全 Java
【Java EE】CAS原理和实现以及JUC中常见的类的使用
【Java EE】CAS原理和实现以及JUC中常见的类的使用
|
3天前
|
存储 安全 Java
聊聊Java中的常用类String
聊聊Java中的常用类String
8 0
|
1天前
|
缓存 Java 调度
Java并发编程:深入理解线程池
【4月更文挑战第30天】 在Java并发编程中,线程池是一种重要的工具,它可以帮助我们有效地管理线程,提高系统性能。本文将深入探讨Java线程池的工作原理,如何使用它,以及如何根据实际需求选择合适的线程池策略。
|
1天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第30天】 本文将深入探讨Java中的线程池,解析其原理、使用场景以及如何合理地利用线程池提高程序性能。我们将从线程池的基本概念出发,介绍其内部工作机制,然后通过实例演示如何创建和使用线程池。最后,我们将讨论线程池的优缺点以及在实际应用中需要注意的问题。
|
1天前
|
设计模式 算法 安全
Java多线程编程实战:从入门到精通
【4月更文挑战第30天】本文介绍了Java多线程编程的基础,包括线程概念、创建线程(继承`Thread`或实现`Runnable`)、线程生命周期。还讨论了线程同步与锁(同步代码块、`ReentrantLock`)、线程间通信(等待/通知、并发集合)以及实战技巧,如使用线程池、线程安全设计模式和避免死锁。性能优化方面,建议减少锁粒度和使用非阻塞算法。理解这些概念和技术对于编写高效、可靠的多线程程序至关重要。