文章目录
1 传统日期类
1.1 Date类
import java.util.Date;
public class Main {
public static void main(String[] args) {
Date date1 = new Date();
System.out.println(date1);
Date date2 = new Date(1432432432);
System.out.println(date2);
long time = date1.getTime();
System.out.println(time);
time += (60 * 60) * 1000;
date1.setTime(time);
System.out.println(date1);
}
}
输出
Sun Jun 25 15:25:07 CST 2023
Sat Jan 17 21:53:52 CST 1970
1687677907079
Sun Jun 25 16:25:07 CST 2023
常用的构造方法就是这两个,一个获取当前时间,一个根据输入的毫秒值设置初始时间,是计算的从1970年1月1日零时开始计算的毫秒值。
getTime()
方法能够获取当前时间到1970年1月1日零时的毫秒值。
1.2 SimpleDateFormat类
该类是一个抽象类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NqyYkpMM-1687701841610)(https://note.youdao.com/yws/res/4281/WEBRESOURCEb42aa2e29aa344be57d8a2271cbf3b10)]
该类用于格式化输出时间,可指定的格式如上所示
import java.text.SimpleDateFormat;
import java.util.Date;
public class TimeDemo2 {
public static void main(String[] args) {
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss EEE a");
String str = simpleDateFormat.format(date);
System.out.println(str);
long time = System.currentTimeMillis() + 121 * 1000;
String str2 = simpleDateFormat.format(time);
System.out.println(str2);
}
}
输出
2023-06-25 15:31:46 周日 下午
2023-06-25 15:33:47 周日 下午
可以通过Date对象或者是毫秒值来格式化为日期时间。
还有个比较重要的方法是将字符串形式的日期字符串转换为Date对象
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TimeDemo3 {
public static void main(String[] args) throws ParseException {
String dateStr = "2023年6月25日 15:37:43";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date date = sdf.parse(dateStr);
System.out.println(date);
System.out.println(sdf.format(date));
}
}
输出
Sun Jun 25 15:37:43 CST 2023
2023年06月25日 15:37:43
1.3 Calendar类
Calendar代表系统此刻日期对应的日历对象,是一个抽象类,不能直接创建对象。
import java.util.Date;
public class TimeDmoe4 {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
System.out.println(calendar);
int year = calendar.get(Calendar.YEAR);
System.out.println(year);
int mm = calendar.get(Calendar.MONTH);
System.out.println(mm);
int days = calendar.get(Calendar.DAY_OF_YEAR);
System.out.println(days);
calendar.add(Calendar.DAY_OF_YEAR, 64);
Date date = calendar.getTime();
System.out.println(date);
long time = calendar.getTimeInMillis();
System.out.println(time);
}
}
上面包含了Calendar类的常用方法,由于是抽象类,不能创建对象,所以通过自身提供的getInstance方法获取对象。
可以根据字段来获取日历中的年、月、日、一年中的第几天、一月中的第几天等时间数字。
可以做加法运算,然后转换成多少天后的日期对象。
可以获取从元年开始的毫秒值。
2 JDK8新增日期类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Um1Fv3bX-1687701841611)(https://note.youdao.com/yws/res/4306/WEBRESOURCE62beb76e43f7521a89c32a20c789b65c)]
JDK8开始,java.time包提供了新的日期和时间API,新增的API严格区分了时刻、本地日期、本地时间。并且,对日期和时间的计算更加方便。
新增的都是不可变类型的类,不必担心被修改。
2.1 LocalDate
import java.time.Month;
public class TimeDemo5 {
public static void main(String[] args) {
LocalDate date = LocalDate.now();
System.out.println(date);
int year = date.getYear();
System.out.println(year);
int monty = date.getMonthValue();
System.out.println(monty);
int dayOfYear = date.getDayOfYear();
System.out.println(dayOfYear);
System.out.println(date.getDayOfWeek());
System.out.println(date.getDayOfWeek().getValue());
LocalDate bt = LocalDate.of(1996, 5, 28);
System.out.println(bt);
System.out.println(LocalDate.of(1996, Month.MAY, 28));
}
}
输出
2023-06-25
2023
6
176
SUNDAY
7
1996-05-28
1996-05-28
获取当前日期,提供了获取年月日的API。
2.2 LocalTime
import java.time.LocalTime;
public class TimeDemo6 {
public static void main(String[] args) {
LocalTime time = LocalTime.now();
System.out.println(time);
int hour = time.getHour();
System.out.println(hour);
int minute = time.getMinute();
System.out.println(minute);
int second = time.getSecond();
System.out.println(second);
int nano = time.getNano();
System.out.println(nano);
System.out.println(LocalTime.of(8, 34));
}
}
输出
16:10:54.705689100
16
10
54
705689100
08:34
相同的,通过now或者of获取相应对象
2.3 LocalDateTime
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class TimeDemo7 {
public static void main(String[] args) {
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(dateTime);
System.out.println(dateTime.getYear());
System.out.println(dateTime.getMonth());
System.out.println(dateTime.getMonthValue());
System.out.println(dateTime.getDayOfYear());
System.out.println(dateTime.getHour());
System.out.println(dateTime.getMinute());
System.out.println(dateTime.getSecond());
System.out.println(dateTime.getNano());
LocalDate date = dateTime.toLocalDate();
System.out.println(date);
LocalTime time = dateTime.toLocalTime();
System.out.println(time);
}
}
输出
2023-06-25T16:20:58.344327900
2023
JUNE
6
176
16
20
58
344327900
2023-06-25
16:20:58.344327900
LocalDateTime是LocalDate和LocalTime的集合体。
2.4 日期时间操作
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.MonthDay;
public class TimeDemo8 {
public static void main(String[] args) {
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(dateTime);
System.out.println(dateTime.plusDays(1));
System.out.println(dateTime.plusMonths(1));
System.out.println(dateTime.plusHours(1));
System.out.println(dateTime.plusMinutes(2));
System.out.println(dateTime.minusDays(1));
System.out.println(dateTime.minusHours(1));
System.out.println(dateTime.minusMonths(1));
System.out.println(dateTime.minusMinutes(2));
LocalDate date = LocalDate.now();
LocalDate btDate = LocalDate.of(1996, 5, 28);
System.out.println(date.equals(btDate));
System.out.println(date.isBefore(btDate));
System.out.println(date.isAfter(btDate));
MonthDay btDay = MonthDay.of(5, 28);
MonthDay nowDay = MonthDay.from(date);
System.out.println(btDay.equals(nowDay));
}
}
输出
2023-06-25T16:35:03.935338100
2023-06-26T16:35:03.935338100
2023-07-25T16:35:03.935338100
2023-06-25T17:35:03.935338100
2023-06-25T16:37:03.935338100
2023-06-24T16:35:03.935338100
2023-06-25T15:35:03.935338100
2023-05-25T16:35:03.935338100
2023-06-25T16:33:03.935338100
false
false
true
false
可以操作日期的加减,以及日期的判断。
2.5 Instant
import java.time.Instant;
import java.time.ZoneId;
import java.util.Date;
public class TimeDemo9 {
public static void main(String[] args) {
Instant instant = Instant.now();
System.out.println(instant);
Instant instant1 = Instant.now();
System.out.println(instant1.atZone(ZoneId.systemDefault()));
Date date = Date.from(instant);
System.out.println(date);
Instant instant2 = date.toInstant();
System.out.println(instant2);
}
}
输出
2023-06-25T08:41:13.405915500Z
2023-06-25T16:41:13.405915500+08:00[Asia/Shanghai]
Sun Jun 25 16:41:13 CST 2023
2023-06-25T08:41:13.405Z
获取时间戳,就是日期和时间,可以与Date类相互转换。
2.6 Demo06DateTimeFormat
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class TimeDemo10 {
public static void main(String[] args) {
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(dateTime);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EEE a");
System.out.println(dtf.format(dateTime));
System.out.println(dateTime.format(dtf));
DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime1 = LocalDateTime.parse("2023-06-25 16:46:43", dtf1);
System.out.println(dateTime1);
System.out.println(dateTime1.getDayOfYear());
}
}
输出
2023-06-25T16:48:01.474393100
2023-06-25 16:48:01 周日 下午
2023-06-25 16:48:01 周日 下午
2023-06-25T16:46:43
176
可以格式化日期时间,并且从格式化字符串中转换得到Date对象。格式化时两个对象都可以调用,可以双向。
2.7 Period
import java.time.LocalDate;
import java.time.Period;
public class TimeDemo11 {
public static void main(String[] args) {
LocalDate date = LocalDate.now();
System.out.println(date);
LocalDate bt = LocalDate.of(1996, 5, 28);
Period period = Period.between(bt, date);
System.out.println(period);
System.out.println(period.getYears());
System.out.println(period.getMonths());
System.out.println(period.getDays());
}
}
输出
2023-06-25
P27Y28D
27
0
28
计算两个日期之间的间隔,只能精确到年月日
2.8 Duration
import java.time.Duration;
import java.time.LocalDateTime;
public class TimeDemo12 {
public static void main(String[] args) {
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(dateTime);
LocalDateTime bt = LocalDateTime.of(1996, 5, 28, 5, 36, 45);
Duration duration = Duration.between(bt, dateTime);
System.out.println(duration.toDays());
System.out.println(duration.toHours());
System.out.println(duration.toMinutes());
System.out.println(duration.toMillis());
System.out.println(duration.toNanos());
}
}
输出
2023-06-25T17:02:52.802423600
9889
237347
14240846
854450767802
854450767802423600
计算时间间隔
2.9 ChronoUnit
用于在单个时间单位内测量一段时间
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
public class TimeDemo13 {
public static void main(String[] args) {
LocalDateTime today = LocalDateTime.now();
System.out.println(today);
LocalDateTime birthDate = LocalDateTime.of(1996,5, 28,5,34);
System.out.println(birthDate);
System.out.println("相差的年数:" + ChronoUnit.YEARS.between(birthDate, today));
System.out.println("相差的月数:" + ChronoUnit.MONTHS.between(birthDate, today));
System.out.println("相差的周数:" + ChronoUnit.WEEKS.between(birthDate, today));
System.out.println("相差的天数:" + ChronoUnit.DAYS.between(birthDate, today));
System.out.println("相差的时数:" + ChronoUnit.HOURS.between(birthDate, today));
System.out.println("相差的分数:" + ChronoUnit.MINUTES.between(birthDate, today));
System.out.println("相差的秒数:" + ChronoUnit.SECONDS.between(birthDate, today));
System.out.println("相差的毫秒数:" + ChronoUnit.MILLIS.between(birthDate, today));
System.out.println("相差的微秒数:" + ChronoUnit.MICROS.between(birthDate, today));
System.out.println("相差的纳秒数:" + ChronoUnit.NANOS.between(birthDate, today));
System.out.println("相差的半天数:" + ChronoUnit.HALF_DAYS.between(birthDate, today));
System.out.println("相差的十年数:" + ChronoUnit.DECADES.between(birthDate, today));
System.out.println("相差的世纪(百年)数:" + ChronoUnit.CENTURIES.between(birthDate, today));
System.out.println("相差的千年数:" + ChronoUnit.MILLENNIA.between(birthDate, today));
System.out.println("相差的纪元数:" + ChronoUnit.ERAS.between(birthDate, today));
}
}
输出
2023-06-25T19:33:12.042049100
1996-05-28T05:34
相差的年数:27
相差的月数:324
相差的周数:1412
相差的天数:9889
相差的时数:237349
相差的分数:14240999
相差的秒数:854459952
相差的毫秒数:854459952042
相差的微秒数:854459952042049
相差的纳秒数:854459952042049100
相差的半天数:19779
相差的十年数:2
相差的世纪(百年)数:0
相差的千年数:0
相差的纪元数:0