Java日期类 util.Date sql.Date Calendar LocalDateTime 格式化 DateFormat DateTimeFormatter

这篇博客详细介绍了Java中的日期类,包括java.util.Date、java.sql.Date、Calendar以及JDK8引入的LocalDateTime和DateTimeFormatter。内容涵盖各日期类的构造方法、常用方法、转换方式和实例,强调了它们在日期和时间处理中的差异和应用场景。
摘要由CSDN通过智能技术生成

java 日期类

java.util.Date

Date有两个附加功能。 它允许将日期解释为年,月,日,小时,分钟和第二个值。 它还允许格式化和解析日期字符串。 但这些功能的API不适合国际化。 从JDK 1.1开始, Calendar类应该用于在日期和时间字段之间进行转换,并且DateFormat类应用于格式化和解析日期字符串。 在相应的方法Date被弃用。

一些计算机标准是根据格林尼治标准时间(GMT)定义的,相当于世界时间(UT)。

  • 在类的所有方法Date接受或返回年,月,日,小时,分钟和秒值,以下表述中使用:

y年代表整数y - 1900

一个月由0到11的整数表示; 0是1月,1是2月,等等; 11月12日。

日期(月的一天)以通常的方式从1到31的整数表示。

一小时由0到23之间的整数表示。因此,从午夜到凌晨1点的时间是小时0,从中午到下午1点的小时是12小时。

一般以0〜59的整数表示。

第二个由0到61的整数表示; 值60和61仅发生在闰秒上,甚至仅在实际上正确跟踪闰秒的Java实现中发生。 由于目前引入闰秒的方式,在同一分钟内不会发生两个闰秒,但是本规范遵循ISO C的日期和时间约定。

构造方法
构造方法 描述
Date() 分配一个 Date对象,并初始化它,以便它代表它被分配的时间,测量到最近的毫秒。
Date(long date) 分配一个 Date对象,并将其初始化为表示自称为“时代”的标准基准时间以后的指定毫秒数,即1970年1月1日00:00:00 GMT。 使用System.currentTimeMillis()获得
常用方法
Modifier and Type 方法 描述
boolean after(Date when) 测试此日期是否在指定日期之后。
boolean before(Date when) 测试此日期是否在指定日期之前。
Object clone() 返回此对象的副本。
int compareTo(Date anotherDate) 比较两个日期的顺序。
boolean equals(Object obj) 比较两个日期的相等性。
long getTime() 返回自1970年1月1日以来,由此 Date对象表示的00:00:00 GMT的毫秒
String toString() 将此 Date对象转换为 String的形式:
int getYear() 日期表示的年份减去 1900。已弃用。由Calendar.get(Calendar.YEAR) - 1900
int getMonth() 此日期所表示的月份,返回的值在 0 和 11 之间,值 0 表示 1 月。 已弃用。由Calendar.get(Calendar.MONTH)取代。
String toLocaleString() 此日期的字符串表示形式,使用区域设置约定。已弃用,由DateFormat.format(Date date)替换。
int getDate() 返回此 Date 对象表示的月份中的某一天。返回的值在 1 和 31 之间,表示包含或开始于此 Date 对象表示的时间的月份中的某一天。 已弃用。由Calendar.get(Calendar.DAY_OF_MONTH)取代 。
int getDay() 返回此日期表示的周中的某一天,返回值 (0 = Sunday, 1 = Monday, ···) 。已弃用。由Calendar.get(Calendar.DAY_OF_WEEK)取代 。
int getHours() 此日期所表示的小时。已弃用。由Calendar.get(Calendar.HOUR_OF_DAY) 取代 。
int getMinutes() 返回此日期所表示的小时已经过去的分钟数。返回值在 0 和 59 之间。 已弃用。由Calendar.get(Calendar.MINUTE)取代。
int getMonth() 此日期所表示的月份。返回的值在 0 和 11 之间,值 0 表示 1 月。 已弃用。由Calendar.get(Calendar.MONTH)取代。
int getSeconds() 返回此日期所表示的分钟已经过去的秒数,返回的值在 0 和 61 之间。已弃用。由Calendar.get(Calendar.SECOND) 取代
实例
public class Test {
   
    public static void main(String[] args) {
   
        //java.util.Date:
        Date d = new Date();
        System.out.println(d); //Sun Aug 08 21:21:32 CST 2021
        System.out.println(d.toString()); //Sun Aug 08 21:21:32 CST 2021
        System.out.println(d.toGMTString()); //8 Aug 2021 13:21:32 GMT
        System.out.println(d.toLocaleString()); //2021-8-8 21:21:32
        System.out.println(d.getYear());//121。121+1900=2021
        System.out.println(d.getMonth());//7 :返回的值在 0 和 11 之间,值 0 表示 1 月。
        //返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
        System.out.println(d.getTime());//1628428892448
        System.out.println(System.currentTimeMillis());//1628428892448
    }
}

获取时间差一般用System.currentTimeMillis(),这个方法是静态的,可以类名.方法名直接调用,无方法体,其具体实现并不是java实现,一般会去衡量一些算法所用的时间

java.sql.Date

一个大约一毫秒值的薄包装,允许JDBC将其标识为SQL DATE值。 毫秒值表示1970年1月1日00:00:00.000 GMT之后的毫秒数。

为了符合SQL DATE ,由java.sql.Date实例包装的毫秒值必须通过在实例关联的特定时区中将小时,分钟,秒和毫秒设置为零来“归一化”。

java.sql.Date和java.util.Date的

  • 区别:
    • java.util.Date:年月日 时分秒
    • java.sql.Date:年月日
  • 联系:
    `java.sql.Date(子类) extends java.util.Date (父类)
构造方法
  • Date(long date) 使用给定毫秒时间值构造一个 Date 对象。
    • @param date自1970年1月1日00:00:00 GMT以来的毫秒数。
    • @see java.lang.System.currentTimeMillis()

转换

相互转化

  • util --> sql:
  • 方式1:向下转型

    java.util.Date date = new Date(1628431958441L);//创建util.Date的对象

    Date date1 = (Date) date;

    java.sql.Date date1 = (java.sql.Date) date;

  • 方式2:利用构造器
    Date date2 = new Date(date.getTime());

    Date date2 = new Date(System.currentTimeMillis());👍

  • sql --> util:
  Date d = new Date(1628431958441L);
  																																												
  java.util.Date date3 = d;

字符转换

  • String–>java.sql.Date
public static void main(String[] args) {
   
    //(1)String--->java.sql.Date
    java.sql.Date date = java.sql.Date.valueOf("2015-9-24");
    //(2)java.sql.Date--->java.util.Date
    java.util.Date date2 = date;
    System.out.println(date2.toString());
}

但代码有局限性,字符串的格式只能是年-月-日拼接的形式,换成其它类型,就会出现异常

DateFormat

构造方法
  • protected DateFormat() 创建一个新的日期格式。

  • SimpleDateFormat(子类) extends DateFormat(父类是一个抽象类)

  • 指定格式化标准

  • DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

日期和时间模式
字母 日期或时间组件 描述 示例
G 纪元指示符 Text AD
y Year 1996; 96
Y Week year Year 2009; 09
M 年中月份(上下文相关sensitive) Month July; Jul; 07
L 年中月份(独立形式) Month July; Jul; 07
w Week in year Number] 27
W Week in month Number 2
D Day in year Number 189
d Day in month Number 10
F 一个月中的星期几Day of week in month Number 2
E 周中的日名称Day name in week Text Tuesday; Tue
u 星期几(1 = Monday, …, 7 = Sunday) Number 1
a 上午/下午 标记 Text PM
H 一天中的小时 (0-23) Number 0
k 一天中的小时 (1-24) Number 24
K 上午/下午的小时 (0-11) Number 0
h 上午/下午的小时 (1-12) Number 12
m Minute in hour Number 30
s Second in minute Number 55
S 毫秒 Number 978
z 时区Time zone General time zone Pacific Standard Time; PST; GMT-08:00
Z 时区Time zone RFC 822 time zone -0800
X 时区Time zone ISO 8601 time zone -08; -0800; -08:00
常用方法
Modifier and Type 方法 描述
Object clone() 重写 Cloneable
boolean equals(Object obj) 重写 equals
String format(Date date) 将一个 Date 格式化为日期/时间字符串。
abstract StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) 将一个 Date 格式化为日期/时间字符串。
StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition fieldPosition) 重写 Format。
Calendar getCalendar() 获取与此日期/时间格式器关联的日历。
TimeZone getTimeZone() 获取时区。
int hashCode() 重写 hashCode
boolean isLenient() 判断日期/时间解析是否为不严格的。
Date parse(String source) 从给定字符串的开始解析文本,以生成一个日期。
abstract Date parse(String source, ParsePosition pos) 根据给定的解析位置开始解析日期/时间字符串。
Object parseObject(String source, ParsePosition pos) 解析字符串中的文本,以生成一个 Date
void setCalendar(Calendar newCalendar) 设置此日期格式所使用的日历。
void setLenient(boolean lenient) 指定日期/时间解析是否不严格。
void setNumberFormat(NumberFormat newNumberFormat) 允许用户设置数字格式器。
void setTimeZone(TimeZone zone) 为此 DateFormat 对象的日历设置时区。
static Calendar getInstance() 使用默认时区和语言环境获得一个日历。
static Calendar getInstance([TimeZone zone][, Locale aLocale]) 使用指定时区和语言环境获得一个日历。每一参数可有可无
实例

通过DateFormat可以将日期按照自定义格式输出

public static void main(String[] args) {
   
    //格式化的标准定义:
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    //String-->Date
    Date d = null;
    try {
   
        d = df.parse("2021-8-8 12:26:8");
    } catch (ParseException parseException) {
   
        parseException.printStackTrace();
    }
    System.out.println(d); //Sun Aug 08 12:26:08 CST 2021
    //Date-->String
    String format = df.format(new Date());
    System
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SK Primin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值