JDK8 之前:日期时间 API

java.lang.System

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

java.util.Date

构造器:

  • Date():无参构造获取本地时间
  • Date(long 毫秒数):通过毫秒数转换成时间对象

常用方法:

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

举例

public void DateTest(){
  Date d1 = new Date();
  Date d2 = new Date(1559807047979L);
  long time = d1.getTime();
}

java.text.SimpleDateFormat

SimpleDateFormat 是一个以语言环境敏感的方式来格式化和分析日期的类

SimpleDateFormat 允许你选择任何用户自定义日期时间格式来运行

格式化:日期 --> 文本

解析:文本 --> 日期

构造器

  • SimpleDateFormat ():默认格式创建对象
  • SimpleDateFormat (String parten):指定的格式创建一个对象

格式化:

  • public String format(Date date):方法格式化日期对象,通过构造器指定格式

解析:

  • public Date parse(String source):从给定字符串的开始解析文本,以生成 一个日期

例如:

public void DateTest(){
  Date date = new Date();
  // 指定格式
  SimpleDateFormat sf = new SimpleDateFormat("yyyy 年 MM 月 dd 日 HH 时 mm 分 ss 秒 SSS 毫秒 ");
  // 日期格式化
  String dateStr = sf.format(date);
  
  String dateStr2 = "2022 年 06 月 06 日 16 时 03 分 14 秒 545 毫秒";
  // 解析,指定格式的字符串解析成日期对象
  Date date2 = sf.parse(dateStr2);
}

注意: yyyy 是完整的公元年,MM 是月份,dd 是日期,HH:mm:ss 是时、分、秒。有的格式大写,有的格式小写,例如 MM 是月份,mm 是分;HH 是 24 小时制,而 hh 是 12 小时制

时间和日期格式化的编码

java.util.Calendar

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

Calendar.getInstance() 方法获取实例:

  • getInstance():默认日历
  • getInstance(Locale alocale):使用默认时区和指定语言环境
  • getInstance(TimeZone zone):使用指定时区和默认语言环境
  • getInstance(TimeZone zone, Locale alocale):指定时区,指定语言环境

一个 Calendar 的实例是系统时间的抽象表示,可以修改或获取 YEAR、MONTH、 DAYOFWEEK、HOUROFDAY 、MINUTE、SECOND 等 日历字段对应的时间值

  • public int get(int field):返回给定日历字段的值
  • public void set(int field,int value) :将给定的日历字段设置为指定的值
  • public void add(int field,int amount):根据日历的规则,为给定的日历字段 添加或者减去指定的时间量
  • public final Date getTime():将 Calendar 转成 Date 对象
  • public final void setTime(Date date):使用指定的 Date 对象重置 Calendar 的时间

常用字段:

字段 含义
YEAR
MONTH 月(从0开始)
DAY_OF_WEEK 周中的天(周几,周日为1)
HOUR_OF_DAY 时(24小时制)
MINUTE
SECOND
HOUR 时(12小时制)
DAY_OF_MONTH 月中的天(几号)

例如:

Calendar c1 = Calendar.getInstance();
// 获得年份
int year = c1.get(Calendar.YEAR);
// 获得月份
int month = c1.get(Calendar.MONTH) + 1;
// 获得日期
int date = c1.get(Calendar.DATE);
// 获得小时
int hour = c1.get(Calendar.HOUR_OF_DAY);
// 获得分钟
int minute = c1.get(Calendar.MINUTE);
// 获得秒
int second = c1.get(Calendar.SECOND);
// 获得星期几(注意(这个与Date类是不同的):1代表星期日、2代表星期1、3代表星期二,以此类推)
int day = c1.get(Calendar.DAY_OF_WEEK);

.JDK8:新的日期时间 API

新的 java.time 中包含了所有关于时钟(Clock),本地日期 (LocalDate)、本地时间(LocalTime)、本地日期时间(LocalDateTime)、 时区(ZonedDateTime)和持续时间(Duration)的类

LocalDate、LocalTime、LocalDateTime

方法 描述
now() / now(ZoneId zone) 静态方法,根据当前时间创建对象 / 指定 时区的对象
of(xx,xx,xx,xx,xx,xxx) 静态方法,根据指定日期/时间创建对象
getDayOfMonth() / getDayOfYear() 获得月份天数(1-31) / 获得年份天数(1- 366)
getDayOfWeek() 获得星期几(返回一个 DayOfWeek 枚举值)
getMonth() 获得月份, 返回一个 Month 枚举值
getMonthValue() / getYear() 获得月份(1-12) /获得年份
getHours() / getMinute() / getSecond() 获得当前对象对应的小时、分钟、秒
withDayOfMonth() / withDayOfYear() / withMonth() / withYear() 将月份天数、年份天数、月份、年份修改为指定的值并返回新的对象
with(TemporalAdjuster t) 将当前日期时间设置为校对器指定的日期时间
plusDays(), plusWeeks(), plusMonths(), plusYears(), plusHours() 向当前对象添加几天、几周、几个月、 几年、几小时
minusMonths() / minusWeeks() / minusDays() / minusYears() / minusHours() 从当前对象减去几月、几周、几天、几 年、几小时
plus(TemporalAmount t) / minus(TemporalAmount t) 添加或减少一个 Duration 或 Period
isBefore() / isAfter() 比较两个 LocalDate
isLeapYear() 判断是否是闰年(在 LocalDate 类中声 明)
format(DateTimeFormatter t) 格式化本地日期、时间,返回一个字符串
parse(Charsequence text) 将指定格式的字符串解析为日期、时间

例如:

public void testTime(){
  LocalDate nowDate = LocalDate.now(); // 2023-06-20
  LocalTime nowTime = LocalTime.now(); // 09:36:29.488299
  LocalDateTime nowDateTime = LocalDateTime.now(); // 2023-06-20T09:36:29.488362
	LocalDate lai = LocalDate.of(2019, 5, 13);  // 2019-05-13
  LocalDate go = lai.plusDays(160); // 2019-10-20

}

DateTimeFormatter

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

  1. (了解)预定义的标准格式。如:ISOLOCALDATETIME、ISOLOCALDATE、 ISOLOCAL_TIME
  2. (了解)本地化相关的格式。如:ofLocalizedDate(FormatStyle.LONG)
  3. 自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)

方法

  • ofPattern(String pattern) :静态方法,返回一个指定字符串格式的 DateTimeFormatter
  • format(TemporalAccessort):格式化一个日期、时间,返回字符串
  • parse(CharSequence text) :将指定格式的字符序列解析为一个日期、时间

例如

// 自定义格式方法
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
// 格式化
String strDateTime = df.format(LocalDateTime.now());
//解析
TemporalAccessor accessor = dateTimeFormatter.parse("2022/12/04 21:05:42");
LocalDateTime localDateTime = LocalDateTime.from(accessor);

参考资料

尚硅谷Java基础

菜鸟教程