Java 日期和时间

java.util 包提供了 Date 类来封装当前的日期和时间。 Date 类提供两个构造函数来实例化 Date 对象。

Date

构造函数使用当前日期和时间来初始化对象。

Date()

构造函数接收一个参数,该参数是从 1970 年 1 月 1 日零时起的毫秒数

Date(long millisec)

Date 对象被构建以后,有很多实用的方法可以便于操作日期时间:

虽然 Date 还有很多构造函数可以方便地构造出时间,但是他们都被标注上了 @Deprecated ,并建议使用 Calendar 类来生成时间。

方法签名 释义
boolean after(Date date) 时间比较,传入的时间是否在指定时间之后
boolean before(Date date) 时间比较,传入的时间是否在指定时间之前
int compareTo(Object obj) 时间比较,传入的时间在指定时间之前为 1,在之后为 -1, 相等为 0
long getTime() 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数
void setTime(long time) 用自1970年1月1日00:00:00 GMT以后time毫秒数设置时间和日期

日期/时间格式化

在 Java 中,可以使用 DateFormat 类和 SimpleDateFormat 类来格式化日期。

DateFormat 类

DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。在创建 DateFormat 对象时不能使用 new 关键字,而应该使用 DateFormat 类中的静态方法 getDateInstance()

DateFormat df = DateFormat.getDatelnstance();

private static void dateFormat(){
    DateFormat df1 = DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault());
    DateFormat df2 = DateFormat.getDateInstance(DateFormat.FULL, Locale.CHINA);
    DateFormat df3 = DateFormat.getDateInstance(DateFormat.LONG, Locale.CHINESE);

    String date1 = df1.format(new Date());
    String date2 = df2.format(new Date());
    String date3 = df3.format(new Date());

    System.out.println("date1 " + date1);
    System.out.println("date2 " + date2);
    System.out.println("date3 " + date3);
}
date1 22-3-26
date2 2022年3月26日 星期六
date3 2022年3月26日

SimpleDateFormat 类

如果使用 DateFormat 类格式化日期/时间并不能满足要求,那么就需要使用 DateFormat 类的子类——SimpleDateFormat。

SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类,它允许进行格式化(日期→文本)、解析(文本→日期)和规范化。SimpleDateFormat 使得用户可以选择任何自定义的日期/时间格式的格式。

SimpleDateFormat 类主要有如下 3 种构造方法。

  • SimpleDateFormat():用默认的格式和默认的语言环境构造 SimpleDateFormat。
  • SimpleDateFormat(String pattern):用指定的格式和默认的语言环境构造 SimpleDateFormat。
  • SimpleDateFormat(String pattern,Locale locale):用指定的格式和指定的语言环境构造 SimpleDateFormat。

pattern 中常用的字母及含义:

字母 含义 示例
G Era 纪元标记 AD
y 年份:yy 表示两位年份,yyyy 表示 4 位年份 yy 表示年扮,如 11
yyyy 表示的年份,如 2011
M 年中的月份:MM 表示月份, MMM 会根据语言环境显示不同语言的月份 MM 表示的月份,如 05
MMM 表示月份,在 Locale.CHINA语言环境下,如“五月”;在 Locale.US 语言环境下,如 May
w 年中的周数
W 月中的周数
D 年中的天数
d 月份中的天数
F 月份中的星期
E 星期中的天数
a am/pm 标记
H 一天中的小时数(0-23)
h 一天中的小时数(1-12)
K am/pm 中的小时数(0-11)
k am/pm 中的小时数(1-12)
m 小时中的分钟数 使用 mm 表示的分钟数,如 12
s 分钟中的秒数 使用 ss 表示的秒数,如 25
S 毫秒数 使用 SSS 表示的毫秒数,如 235
z 时区 Eastern Standard Time
Z 时区
private static void simpleFormat() throws ParseException {
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    // 日期转字符串
    String date1 = df.format(new Date());
    System.out.println(date1);

    // 字符串转日期
    Date parse = df.parse(date1);
    System.out.println(parse);
}

DateTimeFormatter

SimpleDateFormat 的确非常强大,几乎能转换各种格式的日期时间,但是它是线程不安全的。并发场景下,如果不注意写法,容易出现线程安全问题。虽然可以使用 ThreadLocal 等方式解决,但是毕竟代码写起来稍显复杂,为此,在 java8 以后,jdk 中增加了 DateTimeFormatter来处理日期时间格式化。

private static void datetimeFormat(){
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    LocalDateTime parse = LocalDateTime.parse("2022-03-26 17:27:32", formatter);
    System.out.println(parse);
}

如果是JDK8的应用,可以使用 Instant 代替Date,Localdatetime代替Calendar,Datetimeformatter代替Simpledateformatter。

Calendar

Date 类可以满足绝大多数的日期时间场景,但是我们如何才能设置和获取日期数据的特定部分呢,比如说小时,日,或者分钟? 我们又如何在日期的这些部分加上或者减去值呢? 此时就需要用到 Calendar 类。

Calendar 类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用 getInstance()方法创建即可。

Calendar cal = Calendar.getInstance();//默认是当前日期

可以通过下面的方式指定日期:

cal.set(2022, 3, 22);

这里设置的 2022 年 4 月 22 日。需要注意的是,月份是从 0 开始的,如果设置为 1 月 15 号,应该这么写:

cal.set(2022, 0, 15);

转载请注明出处:码谱记录 » Java 日期和时间
标签: