文章目录
一、JDK8 之前的日期时间API
1.java.lang.System类
System类提供的public static long currentTimeMillis()用来返回当前时间与 1970年1月1日0时0分0秒之间以毫秒为单位的时间差,称为时间戳,为 long类型。
此方法适于计算时间差
public class Main{
public static void main(String[] args){
long start = System.currentTimeMillis();
// 需要计算代码执行时间的代码
String s = "abc";
for(int i=0;i<10000;i++){
s += i;
}
long end = System.currentTimeMillis();
// 代码执行的时间
System.out.println(end - start);
}
}
2.java中两个Date类的使用
JDK1.0,第一代日期时间类API
2.1 java.util.Date类:
两个构造器:
- Date date = new Date(); 创建一个对应当前时间的对象
- Date date = new Date(long l); 创建一个指定时间戳的对象
两个方法:
- toString()方法:显示当前的年、月、日、分、秒
- getTime():获取当前 Date对象的时间戳(毫秒数)
2.2 java.sql.Date类:
对应数据库中的日期时间,该类是 java.lang.Date的子类
-
Date date = new Date(long l);
-
Date.toString(); 返回 年-月-日
-
Date.getTime(); 父类的 getTime()方法;
将 java.util.Date对象转换为 java.sql.Date对象:
- Date date = new Date(); java.sql.Date date1 = new java.sql.Date(date.getTime());
3.java.text.SimpleDateFormat类
Date类的API不利于国际化,大部分被废弃了,SimpleDateFormat类 是一个不与语言环境有关的方式来格式化和解析日期的具体类
它允许进行 格式化: 日期 --> 字符串、解析:字符串–> 日期.
SimpleDateFormat的实例化:
空参: 以默认的形式格式化、解析
SimpleDateFormat sdf = new SimpleDateFormat();
有参: 以指定的形式格式化、解析
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”);
通常不使用默认形式进行格式化和解析,而以指定的形式格式化日期和解析字符串
格式化: 日期–>字符串
SimpleDateFormat sdf = new SimpleDateFormat();
Date date = new Date(); // java.util.Date
String format = sdf.forat(date); // 以默认的形式格式化字符串
System.out.println(date); // Fri Apr 22 21:24:38 CST 2022
System.out.println(format); // 22-4-22 下午9:24
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = new Date();
String str = sdf.format(date);
System.out.println(str); // 2022-04-22 09:44:36
解析: 字符串–>日期
String str = "22-4-22 下午9:30";
Date date = null;
try {
date = sdf.parse(str); // 以默认的形式解析字符串
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(date1); // Fri Apr 22 21:30:00 CST 2022
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = null;
try {
date = sdf.parse("2022-04-22 09:44:36");
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(date); // Fri Apr 22 09:44:36 CST 2022
4.Calendar日历类
JDK1.1,Calendar引入后第一代日期时间类大多数方法被弃用,
Calendar类是一个抽象类,主要用于完成日期字段之间相互操作的功能
获取 Calendar实例的方法:
- 使用 Calendar.getlnstance()方法
- 调用它的子类 GregorianCalendar的构造器
一个Calendar的实例是系统时间的抽象表示,通过 get(int field)方法来获取想要的时间信息。比如:YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY、MINUTE、SECOND
- public void set(int field,int value)
- public void add(int field,int value)
- public final Date getTime()
- public final void setTime()
注意:
获取月份时:一月是0,二月是1,以此类推,12月是11;
获取星期时:周日是1,周一是2,以此类推,周六是7;
public class Main{
public static void main(String[] args){
Calendar c = Calendar.getInstance();
// get()
int day = c.get(Calendar.DAY_OF_MONTH);
System.out.println(day); // 23
System.out.println(c.get(Calendar.DAY_OF_YEAR)); // 113
// getTime(): 日历类-->Date
Date date = c.getTime(); // Sat Apr 23 10:56:39 CST 2022
System.out.println(date);
// setTime():Date-->日历类
Date date1 = new Date();
calendar.setTime(date1);
System.out.println(c.get(Calendar.DAY_OF_MONTH)); // 23
}
}
二、JDK8 中新日期时间API
JDK8 之前的日期时间的问题:
- 可变性:像日期时间这样的类应该是不可变的
- 偏移性:Date中的年份是从1900开始的,而月份都从0开始
- 格式化:格式化只对Date有效,Clandar则不行
- 此外,他们也不是线程安全的;
1.LocalDate、LocalTime、LocalDateTime
LocalDate、LocalTime、LocalDateTime类是其中比较重要的几个类,他们的实例是不可变的对象,分别表示使用 ISO-8601日期系统的日期、时间。他们提供了简单的本地日期和时间,并不包含当前的时间信息,也不包含与时区相关的信息
- LocalDate代表 ISO格式(yyyy-MM-dd) 的时间,可以存储生日、纪念日等日期
- LocalTime表示一个时间,而不是日期
- LocalDateTime用来表示日期和时间的,使用频率较高
注:ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间表示法,也就是公历
实例化:
now(): 获取 当前的年、月、日、时、分、秒
of(): 获取 指定的年、月、日、时、分、秒
public class Main{
public static void main(String[] args){
// now()
LocalTime localtime = LocalTime.now();
LocalDate localdate = LocalDate.now();
LocalDateTime localdatetime = LocalDateTime.now();
System.out.println(localtime); // 11:36:26.840
System.out.println(localdate); // 2022-04-23
System.out.println(localdatetime); // 2022-04-23T11:36:26.840
// of()
LocalDate localDate = LocalDate.of(2022,4,23);
LocalDateTime localdatetime1 = LocalDateTime.of(2022,4,23,11,47,40);
System.out.println(localDate); // 2022-04-23
System.out.println(localdatetime1); // 2022-04-23T11:47:40
}
}
获取:
getXxx(): 获取年、月、日、时、分、秒
public class Main{
public static void main(String[] args){
LocalDateTime localdatetime = LocalDateTime.now();
System.out.println(localdatetime.getDayOfMonth()); // 23(第23天,23号)
System.out.println(localdatetime.getDayOfWeek()); // SATURDAY(第六天,周六)
System.out.println(localdatetime.getDayOfYear()); // 113
System.out.println(localdatetime.getMonth()); // APRIL(4月)
System.out.println(localdatetime.getMonthValue()); // 4(数字)
System.out.println(localdatetime.getHour()); // 11(时)
}
}
设置:
withXxx():修改年、月、日、时、分、秒,返回一个新的对象(不改变原有对象)
public class Main{
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.now();
LocalDateTime localDateTime2 = localDateTime.withHour(22);
LocalDateTime localDateTime3 = localDateTime.withDayOfMonth(30);
System.out.println(localDateTime); // 2022-04-23T12:06:26.992
System.out.println(localDateTime2); // 2022-04-23T22:06:26.992
System.out.println(localDateTime3); // 2022-04-30T12:06:26.992
}
}
plusXxx(): 增加年、月、日、时、分、秒,返回一个新的对象(不改变原有对象)
minusXxx(): 减少年、月、日、时、分、秒,返回一个新的对象(不改变原有对象)
public class Main{
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.now();
// plus
LocalDateTime localDateTime2 = localDateTime.plusDays(8);
LocalDateTime localDateTime3 = localDateTime.plusYears(4);
System.out.println(localDateTime); // 2022-04-23T12:17:36.538
System.out.println(localDateTime2); // 2022-05-01T12:17:36.538
System.out.println(localDateTime3); // 2026-04-23T12:17:36.538
// minus
LocalDateTime localDateTime4 = localDateTime.minusDays(8);
LocalDateTime localDateTime5 = localDateTime.minusYears(4);
System.out.println(localDateTime); // 2022-04-23T12:17:36.538
System.out.println(localDateTime4); // 2022-04-15T12:17:36.538
System.out.println(localDateTime5); // 2018-04-23T12:17:36.538
}
}
2.Instant
Instant: 时间线上的一个瞬时点。这可能被用来记录应用程序中的事件时间戳
在处理时间和日期时,我们通常会想到年、月、日、时、分、秒。然而,这只是时间的一人模型,是面向人类的。第二种通用模型是面向机器的,或者说是连续的。在UNIX中,这个数从1970年开始,以秒为的单位;同样的,在java中,也是 从1970年开始,但以毫秒为单位。
Instant的使用,类似于 java.util.Date
now()方法
静态方法,返回默认UTC时区的Instant类的对象,获取的是本初子午线对应的标准时间
Instant instant = Instant.now();
System.out.println(instant); // 2022-04-23T05:11:36.038Z
ofEpochMilli(long epochMilli)方法
静态方法,返回在 1970-01-01 00:00:00基础上加上指定毫秒数之后的 Instant类对象
Instant instant = Instant.ofEpochMilli(1650690962224L);
System.out.println(instant); // 2022-04-23T05:16:02.224Z
atOffset(ZoneOffset offset)方法
结合即时的偏移(添加时间的偏移量)来创建一个 OffsetDateTime()
Instant instant = Instant.now();
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHour(8));
System.out.println(instant); // 2022-04-23T05:11:36.038Z
System.out.println(offsetDateTime); // 2022-04-23T13:11:36.038+08:00(时区时间偏移)
toEpochMilli()
返回 1970-01-01 00:00:00到当前时间的毫秒数,即为时间戳
long l = instant.toEpochMilli();
System.out.println(l); // 1650690962224
3.DateTimeFormatter
java.time.format.DateTimeFormatter类,该类提供了三种格式化方法:
预定义的标准格式,如:
ISO_LOCAL_DATE_TIME; ISO_LOCAL_DATE; ISO_LOCAL_TIME
本地化相关的格式,如:
ofLocalizedDateTime(FormatStyle.LONG)
自定义的格式,如:
ofPattern(“yyyy-MM-dd hh:mm:ss E”);
ofPattern(String pattern)方法
静态方法,返回一个指定字符串格式的DateTimeFormatter对象
format(TemporalAccessor t)方法
格式化一个日期、时间,返回字符串
parse(CharSequence text)
将指定格式的字符串序列解析为一个日期、时间
自定义的方式格式化与解析:
public class Main{
public static void main(String[] args){
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
LocalDateTime localDateTime = LocalDateTime.now();
// 格式化
String str = dateTimeFormatter.format(localDateTime);
System.out.println(str); // 2022-04-23 01:54:08
// 解析
TemporalAccessor accessor = dateTimeFormatter.parse(str);
System.out.println(accessor); // {MinuteOfHour=54, MicroOfSecond=0, MilliOfSecond=0, NanoOfSecond=0, SecondOfMinute=8, HourOfAmPm=1},ISO resolved to 2022-04-23
}
}