一文搞懂Java中的日期类

目录
  • 一、日期类
    • 1.1 第一代日期类
    • 1.2 第二代日期类Calendar
    • 1.3 第三代日期类

一、日期类

在程序的开发中我们经常会遇到日期类型的操作,Java对日期类型的操作提供了很好的支持。在最初的版本下,java.lang包中的System.currentTimeMillis();可以获取当前时间与协调时间(UTC)1970年1月1日午夜之间的时间差(以毫秒为单位测量)。我们往往通过调用该方法计算某段代码的耗时。

public class TestTime {
    public static void main(String[] args) {
        long start=System.currentTimeMillis();
        long sum=0;
        for (int i = 0; i < 1000000; i++) {
            sum+=i;
        }
        System.out.println("sum="+sum);
        long end=System.currentTimeMillis();
        System.out.println("耗时:"+(end-start)+"ms");
    }
}

1.1 第一代日期类

第一代日期时间API主要有java.util.Date和日期时间格式化有关的java.text.DateFormat及其子类。

1.1.1 Date类

JDK1.0就在java.util包下面提供了Date类用于表示特定的瞬间,可以精确到毫秒。

通过API或源码,可以看出Date类的大部分方法已经过时,已被第二代日期类Calendar代替,剩下的Date类常见方法如下所示。

序号 方法定义 描述
1 Date() 返回一个代表当前系统时间的Date对象,精确到毫秒
2 Date(long date) 返回一个距离UTC时间date毫秒的新日期对象,精确到毫秒
3 int compareTo(Date anotherDate) 比较两个日期的大小
4 long getTime() 返回自1970年1月1日00:00:00 GMT以来此Date对象表示的毫秒数
5 String toString() 把此Date对象转换为以下形式的String:dow mon dd hh:mm:ss zzz yyyy其中:dow是一周中的某一天(Sun,Mon,Tue,Wed,Thu,Fri,Sat)
import java.util.Date;

public class DateTest {
    public static void main(String[] args) {
        Date date = new Date();
        System.out.println("现在的系统时间是:"+date);
        long time=date.getTime();
        System.out.println("当前时间距离UTC时间的毫秒数:"+time);
    }
}

1.1.2 SimpleDateFormat类

Date类显示的格式没有考虑国际化问题,如该格式不符合中国人查看时间的格式习惯,因此需要对其进行格式化操作。java.text.SimpleDateFormat类可以实现格式化操作,它是java.text.DateFormat的子类。

创建SimpleDateFormat类的对象非常简单,可以使用如下构造器:

  • SimpleDateFormat():用默认的模式和默认的语言环境的日期格式符号构造SimpleDateFormat。
  • SimpleDateFormat(String pattern):用给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat。
  • SimpleDateFormat(String pattern,Locale locale):用给定的模式和给定语言环境的日期格式符号构造。

常见的日期格式化模板如下:

SimpleDataFormat类主要用于将Date日期转换为字符串,或者将某个字符串转换为Date对象,其常见方法如下所示:

方法定义 描述
format 将一个Date格式转化为日期/时间字符串,此方法继承的父类DateFormat的方法
parse 从给定字符串的开始解析文本,以生成一个日期,此方法为继承的父类DateFormat的方法
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class SimpleDateFormatTest {
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH小时mm分钟ss秒S毫秒");
        System.out.println("使用指定格式的日期字符串:"+sdf.format(new Date()));
        String str="2021年1月15日 06小时44分钟05秒 123毫秒";
        Date date = sdf.parse(str);
        System.out.println("日期对象:"+date);
    }
}

1.2 第二代日期类Calendar

Date类用于返回日期对象,不适合获取日历字段。设置和获取日历字段的方法,被JDK1.1推出的Calendar代替。

java.util.Calendar类是一个抽象类,它为特定瞬间与一组诸如YEAR、MONTH、DAY_OF_MONTH、HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段(如获得下星期的日期)提供了一些方法。

序号 方法定义 描述
1 static getInstance() 使用默认时区和语言环境获得一个日历,也可以通过getInstance(TimeZone time,Locale loc)或指定时区和语言环境的日历
2 get(int field) 获取指定的日历字段
3 set(int year,int month,int date,int hourOfDay,int minute,int second) 设置字段YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE和SECOND的值
public class CalendarTest {
    public static void main(String[] args) {
        Calendar c = Calendar.getInstance(TimeZone.getTimeZone("Asia/Shanghai"), Locale.CHINA);
        System.out.println("年:"+c.get(Calendar.YEAR));
        System.out.println("月:"+(c.get(Calendar.MONTH)+1));//1月从0开始
        System.out.println("日:"+c.get(Calendar.DAY_OF_MONTH));
        System.out.println("小时:"+c.get(Calendar.HOUR));
        System.out.println("分钟:"+c.get(Calendar.MINUTE));
        System.out.println("秒:"+c.get(Calendar.SECOND));
    }
}

上述代码中的TimeZone表示时区,Locale表示语言环境。例如TimeZone.getTimeZone("Asia/Shanghai")表示“亚洲/上海”时区,Locale.CHINA表示中国语言环境。

1.3 第三代日期类

java8中引入的java.time纠正了过去的缺陷,这就是第三代日期API。

java8吸收了Joda-Time的精华,以一个新的开始为Java创建优秀的API。新的java.time中包含了所有关于本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime)和持续时间(Duration)的类。历史悠久的Date类也新增了toInstant()方法,用于把Date类转换成新的表示形式。

接下来只介绍商用的几个类型。

1.3.1 LocalDate、LocalTime、LocalDateTime类

这三个类都代表日期对象,只是包含的日历字段不同,相当于Calendar类的代替。

java.time.LocalDate类:代表一个只包含年、月、日的日期对象,如2007-12-03。LocalDate类常见方法如下所示。

序号 方法定义 描述
1 static LocalDate now() 返回默认时区下的当前日期对象
2 int getYear() 返回年份,从-999999999-01-01~+999999999-12-31
3 int getMonth() 返回月份,1-12
4 int getDayOfMonth() 返回日期,1-31
5 LocalDate parse(CharSequence text) 按默认格式解析字符串为LocalDate的日期对象
6 LocalDate parse(CharSequence text,DateTimeFormatter formatter) 按指定格式解析字符串为LocalDate的日期对象

java.time.LocalTime类:代表一个只包含小时、分钟、秒的日期对象,如13:45.30.123456789。LocalTime常见方法如下:

序号 方法定义 描述
1 static LocalTime now() 返回默认时区下的当前时间对象
2 int getHour() 返回小时,0-23
3 int getMinute() 返回分钟,0-59
4 int getSecond() 返回秒,0-59
5 LocalTime parse(CharSequence text) 按默认格式解析字符串为LocalTime的日期对象
6 LocalTime parse(CharSequence text,DateTimeFormatter formatter) 按指定格式解析字符串为LocalTime的日期对象

java.time.LocalDateTime类:代表一个包含年、月、日、小时、分钟、秒的日期对象,如2007-12-03T10:15:30。LocalDateTime常见方法如下:

序号 方法定义 描述
1 static LocalDateTime now() 返回默认时区下的当前日期对象
2 int getYear() 返回年份,从-999999999-01-01~+999999999-12-31
3 int getMonth() 返回月份,1-12
4 int getDayOfMonth() 返回日期:1-31
5 int getHour() 返回小时:0-23
6 int getMinute() 返回分钟:0-59
7 int getSecond() 返回秒:0-59
8 LocalDateTime parse(CharSequence text) 按默认格式解析字符串为LocalDateTime的日期对象
9 LocalDateTime parse(CharSequence text,DateTimeFormatter formatter) 按指定格式解析字符串为LocalDateTime的日期对象
import java.time.LocalDateTime;

public class LocalDateTimeTest {
    public static void main(String[] args) {
        //1、创建一个日期对象
        LocalDateTime now = LocalDateTime.now();
        //2、获取日历字段
        System.out.println("年:"+now.getYear());
        System.out.println("月:"+now.getMonthValue());
        System.out.println("月:"+now.getMonth());
        System.out.println("日:"+now.getDayOfMonth());
        System.out.println("小时:"+now.getHour());
        System.out.println("分钟:"+now.getMinute());
        System.out.println("秒:"+now.getSecond());
    }
}

1.3.2 Instant类

在处理时间和日期时,我们通常会想到年、月、日、时、分、秒。然而,这只是时间的一个模型,是面向人类的。第二种通用模型是面向计算机的,在此模型中,时间线中的一个点表示一个整数,这有利于计算机处理。在UNIX中这个数从1970年开始,以秒为单位;同样在Java中也是从1970年开始的,但以毫秒为单位。

java.time包通过值类型Instant提供机器视图,不提供人类意义上的时间单位。Instant类表示时间线商的一点,不需要要任何上下文信息。例如,时区。从概念上讲,它只是简单地表示自1970年1月1日0时0分0秒(UTC)开始地秒数。因为java.time包是基于纳秒计算的,所以Instant类的精度可以达到纳秒级。

Instant类的常见方法如下:

序号 方法定义 描述
1 static Instant now() 静态方法,返回默认UTC时区的Instant类的对象
2 static Instant ofEpochMillo(long epochMilli) 静态方法,返回在1970-01-01 00:00:00基础上加上指定毫秒数之后的Instant类的对象
3 static OffsetDateTime atOffset(ZoneOffset offset) 结合即时的便宜来创建一个OffsetDateTime
4 long toEpochMilli()  返回1970-01-01 00:00:00到当前时间的毫秒数,即时间戳

Instant类和第一代日期类Date的相互转换:

import java.time.Instant;
import java.util.Date;

public class InstantTest {
    public static void main(String[] args) {
        //1、创建一个Instant对象
        Instant now = Instant.now();
        System.out.println("now="+now);
        //2、转换方法
        //[1]Instant->Date
        Date d = Date.from(now);
        System.out.println("d="+d);
        //[2]Date->Instant
        Instant instant = d.toInstant();
        System.out.println("instant="+instant);
    }
}

1.3.3 DateTimeFormatter类

java.time.format.DateTimeFormatter类提供了格式化日期的方法,这个类和第一代日期的SimpleDateFormatter类似,但SimpleDateFormat只能格式化Date类,对Calendar类无效。DateTimeFormatter可以格式化LocalDate、LocalTime、LocalDateTime及Instant类。

DateTimeFormatter类常见方法如下:

序号 方法定义 描述
1 static DateTimeFormatter ofPattern(String pattern) 静态方法,返回一个DateTimeFormatter对象
2 String format(TemporalAccessor t) 格式化一个日期、时间,返回字符串
3 TemporalAccessor parse(CharSequence text) 将指定格式的字符序列解析为一个日期、时间

TemporalAccessor 是java.time.temporal包下的接口,LocalDate、LocalTime、LocalDateTime、Instant都实现了该接口。

下面以LocalDateTime日期的格式为例,进行代码演示。

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class DateTimeFormatterTest {
    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd a hh小时mm分钟ss秒");
        //格式化日期(日期->文本)
        String format = dtf.format(now);
        System.out.println(format);
        //解析字符串为日期(文本->日期)
        String s="2018-08-08 下午 05小时06分钟43秒";
        LocalDateTime parse = LocalDateTime.parse(s, dtf);
        System.out.println(parse);

    }
}

以上就是一文搞懂Java中的日期类的详细内容,更多关于Java日期类的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java8新特性之线程安全日期类

    LocalDateTime Java8新特性之一,新增日期类. 在项目开发过程中经常遇到时间处理,但是你真的用对了吗,理解阿里巴巴开发手册中禁用static修饰SimpleDateFormat吗 通过阅读本篇文章你将了解到: 为什么需要LocalDate.LocalTime.LocalDateTime[java8新提供的类] Java8新的时间API的使用方式,包括创建.格式化.解析.计算.修改 可以使用Instant代替 Date,LocalDateTime代替 Calendar,DateTi

  • java实现字符串和日期类型相互转换的方法

    本文实例讲述了java实现字符串和日期类型相互转换的方法.分享给大家供大家参考,具体如下: Date inDate = new Date(); //获取当前日期 //建立一个一定格式的 SimpleDateFormat SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String date = f.format(inDate); //将Date转化为字符串 System.out.println(date

  • Java开发基础日期类代码详解

    由于工作关系,很久没更新博客了,今天就给大家带来一篇Java实现获取指定月份的星期与日期对应关系的文章,好了,不多说,我们直接上代码: 一.日期工具类 package com.lyz.date; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.u

  • Java将日期类型Date时间戳转换为MongoDB的时间类型数据

    存了一个时间类型(Date)的数据到mongo数据库中,但是前台显示的是一串数字.继而引发了如下问题: Java里面如何把 时间戳 1477387464495 转换为 2016-10-25 17:24:24 期望格式的日期字符串. 因为业务需要,在model里面有个Date类型的字段,然后需要按这个时间类型排序.但是在后台处理完之后,返回到前台,发现时间变成了13位数字,学名叫时间戳.不是我想要的具体时间,不适合展示啊.具体有如下 mongo数据库中存储时间类型的数据具体如下: 然后debug的

  • Java将Date日期类型字段转换成json字符串的方法

    想必我们在做项目的时候,都会遇到服务端与客户端交互数据.一般情况下我们都会采用json格式或者xml格式,将服务端的数据转换成这两种格式之一. 但是,如果我们将数据转换成json格式的时候,我们也许会遇到Date日期型的数据转换成json格式后,并不是我们想要的格式.下面我们通过简单的demo 来说明这个问题. 我们按照一般json格式生成,会出现以下问题: 采用json:将数据生成json格式,需要导入相应的jar包,如下图: Student.java package com.xbmu.bea

  • Java中常用的日期类图文详解

    目录 前言 Date 为什么Date的大部分方法被弃用 注释 翻译 目前可用方法的测试示例 可用方法 示例 Date小结 Calendar 简单介绍 常用的方法 获取实例 获取日期里的信息 日期的加减与滚动 日期的设置 测试实例代码 DateFormat与SimpleDateFormat DateFormat 常用方法 测试实例 SimpleDateFormat 主要方法 测试示例 编写一个简单的日期工具类 工具类 测试示例 总结 前言 本文将分析Java中的Date.Calendar.Date

  • java字符串与日期类型转换的工具类

    常用的字符串转date,和日期转字符串的方法,具体内容如下 package com.cq2022.zago.base.util; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.GregorianCalendar; import javax.xml.datatype.Dat

  • 详解Java中的日期类

    Java 编程语言中时间的处理类有 Date类与 Calendar类.目前官方不推荐使用 Date类,因为其不利于国际化:而是推荐使用 Calendar类,并使用 DateFormat 类做格式化处理. 一.Date 类介绍 Date 表示特定的瞬间,精确到毫秒. 在 JDK 1.1 之前,类 Date 有两个其他的函数.它允许把日期解释为年.月.日.小时.分钟和秒值.它也允许格式化和解析日期字符串. 不过,这些函数的 API 不易于实现国际化.从 JDK 1.1 开始,应该使用 Calenda

  • 新手小白学JAVA 日期类Date SimpleDateFormat Calendar(入门)

    目录 1. Date日期类 1.1 Date的构造函数 1.2 Date的构造函数练习 1.3 Date的常用方法练习 2. SimpleDateFormat 2.1 常用构造函数 2.2 日期转换格式工具类练习 2.3 日期转换综合练习 3.Calendar日历类 3.1 概念 3.2 常用方法 3.3 入门案例 3.4 巩固案例 1. Date日期类 类 Date 表示一个特定的瞬间,精确到毫秒 1.1 Date的构造函数 Date() 分配一个 Date 对象,以表示分配它的时间(精确到毫

  • 一文搞懂Java中的日期类

    目录 一.日期类 1.1 第一代日期类 1.2 第二代日期类Calendar 1.3 第三代日期类 一.日期类 在程序的开发中我们经常会遇到日期类型的操作,Java对日期类型的操作提供了很好的支持.在最初的版本下,java.lang包中的System.currentTimeMillis();可以获取当前时间与协调时间(UTC)1970年1月1日午夜之间的时间差(以毫秒为单位测量).我们往往通过调用该方法计算某段代码的耗时. public class TestTime { public stati

  • 一文搞懂Java中的反射机制

    前一段时间一直忙,所以没什么时间写博客,拖了这么久,也该更新更新了.最近看到各种知识付费的推出,感觉是好事,也是坏事,好事是对知识沉淀的认可与推动,坏事是感觉很多人忙于把自己的知识变现,相对的在沉淀上做的实际还不够,我对此暂时还没有什么想法,总觉得,慢慢来,会更快一点,自己掌握好节奏就好. 好了,言归正传. 反射机制是Java中的一个很强大的特性,可以在运行时获取类的信息,比如说类的父类,接口,全部方法名及参数,全部常量和变量,可以说类在反射面前已经衣不遮体了(咳咳,这是正规车).先举一个小栗子

  • 一文搞懂Java中的注解和反射

    目录 1.注解(Annotation) 1.1 什么是注解(Annotation) 1.2 内置注解 1.3 元注解(meta-annotation) 1.4 自定义注解 2.反射(Reflection) 2.1 反射和反射机制 2.2 Class类的获取方式和常用方法 2.3 反射的使用 1.注解(Annotation) 1.1 什么是注解(Annotation) 注解不是程序本身,可以在程序编译.类加载和运行时被读取,并执行相应的处理.注解的格式为"@注释名(参数值)",可以附加在

  • 一文搞懂Java中对象池的实现

    目录 1. 什么是对象池 2. 为什么需要对象池 3. 对象池的实现 4. 开源的对象池工具 5. JedisPool 对象池实现分析 6. 对象池总结 最近在分析一个应用中的某个接口的耗时情况时,发现一个看起来极其普通的对象创建操作,竟然每次需要消耗 8ms 左右时间,分析后发现这个对象可以通过对象池模式进行优化,优化后此步耗时仅有 0.01ms,这篇文章介绍对象池相关知识. 1. 什么是对象池 池化并不是什么新鲜的技术,它更像一种软件设计模式,主要功能是缓存一组已经初始化的对象,以供随时可以

  • 一文搞懂Java中的序列化与反序列化

    目录 序列化和反序列化的概念 应用场景 序列化实现的方式 继承Serializable接口,普通序列化 继承Externalizable接口,强制自定义序列化 serialVersionUID的作用 静态变量不会被序列化 使用序列化实现深拷贝 常见序列化协议对比 小结 序列化和反序列化的概念 当我们在Java中创建对象的时候,对象会一直存在,直到程序终止时.但有时候可能存在一种"持久化"场景:我们需要让对象能够在程序不运行的情况下,仍能存在并保存其信息.当程序再次运行时 还可以通过该对

  • 一文搞懂Java中的抽象类和接口到底是什么

    目录 什么是抽象类 抽象类在实现多态中的意义 接口是什么 通过接口实现多态

  • 一文搞懂Java项目中枚举的定义与使用

    目录 什么是枚举 为什么需要枚举类 枚举类的定义和使用 什么是枚举 最近写新项目!有很多数据字典常量需要定义和使用.就顺便记录一下.什么是枚举类呢?就是用enum修饰是一种Java特殊的类,枚举是class.底层是继承了java.lang.Enum类的实体类.使用枚举可以很方便的定义数据常量.方便清晰我们使用 为什么需要枚举类 下面就举例说明一下吧 1)出于类型安全考虑,没用枚举类之前,常用静态常量来表示. 比如对于性别的表示: public static final int WOMAN = 0

  • 一文带你搞懂Java中的泛型和通配符

    目录 概述 泛型介绍和使用 泛型类 泛型方法 类型变量的限定 通配符使用 无边界通配符 通配符上界 通配符下界 概述 泛型机制在项目中一直都在使用,比如在集合中ArrayList<String, String>, Map<String,String>等,不仅如此,很多源码中都用到了泛型机制,所以深入学习了解泛型相关机制对于源码阅读以及自己代码编写有很大的帮助.但是里面很多的机制和特性一直没有明白,特别是通配符这块,对于通配符上界.下界每次用每次百度,经常忘记,这次我就做一个总结,加

  • 一文带你搞懂Java中Get和Post的使用

    目录 1 Get请求数据 1.1 Controller 1.2 Service 1.3 Application 1.4 Postman 2 Post接收数据 2.1 Controller 2.2 Service 2.3 Application 2.4 Postman 3 Post发送数据 3.1 Controller 3.2 Service 3.3 ResponseResult 3.4 Config 3.5 Application 3.6 Postman 1 Get请求数据 项目地址:https

  • 一文搞懂Java JDBC中的SQL注入问题

    目录 SQL注入 什么是SQL注入 SQL注入的效果的演示 SQL注入代码 SQL注入效果 如何避免SQL注入 PrepareStatement解决SQL注入 PreparedStatement的应用 参数标记 动态参数绑定 综合案例 PreparedStatement总结 必须使用Statement的情况 SQL注入 什么是SQL注入 在用户输入的数据中有SQL关键字或语法,并且关键字或语法参与了SQL语句的编译.导致SQL语句编译后的条件为true,一直得到正确的结果.这种现象就是SQL注入

随机推荐