11、日期

1、Date

时间毫秒值:指的是从 1970 年 1 月 1 日 00:00:00 走到此刻的总的毫秒数,1 s = 1000 ms = 1000000 μs = 1000000000 ns

方法名 说明
public Date() 创建一个 Date 对象,代表的是系统当前此刻日期时间
public Date(long time) 把时间毫秒值转换成 Date 日期对象
public long getTime() 获取时间对象的时间毫秒值
public void setTime(long time) 设置日期对象的时间为当前时间毫秒值对应的时间
public boolean after(Date when) this 在 when 之后?
public boolean before(Date when) this 在 when 之前?
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

Date date = new Date();
System.out.println(sdf.format(date));

Thread.sleep(2000);

date.setTime(System.currentTimeMillis());
System.out.println(sdf.format(date));

2、Instant

Instant 类由一个静态的工厂方法 now() 创建,时间戳是包含日期和时间的
Instant 与 java.util.Date 很类似,事实上 Instant 就是类似 JDK8 以前的 Date,Instant 和 Date 这两个类可以进行转换

Instant instant = Instant.now();
System.out.println("当前时间戳是:" + instant);                    // 差了 8 小时(时区问题), 世界标准钟

Instant instant = Instant.now();
System.out.println(instant.atZone(ZoneId.systemDefault()));     // 更改到系统默认时区

Date date = Date.from(instant);               // Instant 转 Data
System.out.println("当前时间是:" + date);

instant = date.toInstant();                   // Data 转 Instant
System.out.println(instant);

3、SimpleDateFormat

可以对 Date 对象或时间毫秒值格式化成我们喜欢的时间形式,也可以把字符串的时间形式解析成日期对象(年月日时分秒 y M d H m s)

构造方法 说明
public SimpleDateFormat() 构造一个 SimpleDateFormat,使用默认格式
public SimpleDateFormat(String pattern) 构造一个 SimpleDateFormat,使用指定的格式

格式化方法 说明
public final String format(Date date) 将日期格式化成:日期 / 时间字符串
public final String format(Object time) 将时间毫秒值式化成:日期 / 时间字符串
public Date parse(String source) 从给定字符串的开始解析文本以生成日期,会抛异常
// 格式化时间
Date date = new Date();
long time = date.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String rs1 = sdf.format(date);
String rs2 = sdf.format(time);

// 字符串解析时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d = sdf.parse("2021-08-04 11:11:11");

4、Calendar

calendar 是可变日期对象,一旦修改后其对象本身表示的时间将产生变化(从 0 开始记月)

方法名 说明
public static Calendar getInstance() 获取当前日历对象
public int get(int field) 取日期中的某个字段信息
public void set(int field, int value) 修改日历的某个字段信息
public void add(int field, int amount) 为某个字段增加 / 减少指定的值
public final Date getTime() 拿到此刻日期对象
public long getTimeInMillis() 拿到此刻时间毫秒值
// 拿到系统此刻日历对象
Calendar cal = Calendar.getInstance();
System.out.println(cal);

// 获取日历的信息 public int get(int field): 取日期中的某个字段信息
int year = cal.get(Calendar.YEAR);
System.out.println(year);

int mm = cal.get(Calendar.MONTH) + 1;
System.out.println(mm);

int days = cal.get(Calendar.DAY_OF_YEAR);
System.out.println(days);

// public void set(int field, int value): 修改日历的某个字段信息
cal.set(Calendar.HOUR, 12);
System.out.println(cal);

// public void add(int field, int amount): 为某个字段增加/减少指定的值
// 请问 64 天后是什么时间
cal.add(Calendar.DAY_OF_YEAR, 64);
cal.add(Calendar.MINUTE, 59);

// public final Date getTime(): 拿到此刻日期对象
Date d = cal.getTime();
System.out.println(d);

// public long getTimeInMillis(): 拿到此刻时间毫秒值
long time = cal.getTimeInMillis();
System.out.println(time);

5、LocalDate、LocalTime、LocalDateTime

它们的类的实例是不可变的对象,它们三者构建对象和 API 都是通用的

方法名 说明
public static Xxxx now() 静态方法,根据当前时间创建对象
public static Xxxx of(…) 静态方法,指定日期 / 时间创建对象

方法名 说明
public int geYear() 获取年
public int getMonthValue() 获取月份(1-12)
Public int getDayOfMonth() 获取月中第几天(日)
Public int getDayOfYear() 获取年中第几天
Public DayOfWeek getDayOfWeek() 获取星期

方法名 说明
public LocalDate toLocalDate() LocalDateTime 对象转换成一个 LocalDate 对象
public LocalTime toLocalTime() LocalDateTime 对象转换成一个 LocalTime 对象

方法名 说明
plusDays、plusWeeks、plusMonths、plusYears 向当前 LocalDate 对象添加几天、 几周、几个月、几年
minusDays、minusWeeks、minusMonths、minusYears 从当前 LocalDate 对象减去几天、 几周、几个月、几年
withDayOfMonth、withDayOfYear、withMonth、withYear 将月份天数、年份天数、月份、年份修改为指定的值并返回新的 LocalDate 对象
isBefore、isAfter 比较两个 LocalDate

创建对象

LocaDate localDate = LocalDate.now();
LocalTime llocalTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();

LocalDate  localDate = LocalDate.of(2099, 11, 11);
LocalTime  localTime = LocalTime.of(11, 11, 11);
LocalDateTime  localDateTime = LocalDateTime.of(2020, 10, 6, 13, 23, 43);

LocalDate

// 获取本地日期对象
LocalDate nowDate = LocalDate.now();
System.out.println("今天的日期:" + nowDate); // 今天的日期

int year = nowDate.getYear();
System.out.println("year:" + year);

int month = nowDate.getMonthValue();
System.out.println("month:" + month);

int day = nowDate.getDayOfMonth();
System.out.println("day:" + day);

// 当年的第几天
int dayOfYear = nowDate.getDayOfYear();
System.out.println("dayOfYear:" + dayOfYear);

// 星期
System.out.println(nowDate.getDayOfWeek());            // MONDAY
System.out.println(nowDate.getDayOfWeek().getValue()); // 1

// 月份
System.out.println(nowDate.getMonth());            // AUGUST
System.out.println(nowDate.getMonth().getValue()); // 8

LocalDate bt = LocalDate.of(1991, 11, 11);
System.out.println(bt);                                     // 直接传入对应的年月日
System.out.println(LocalDate.of(1991, Month.NOVEMBER, 11)); // 相对上面只是把月换成了枚举

LocalTime

// 获取本地时间对象
LocalTime nowTime = LocalTime.now();
System.out.println("今天的时间:" + nowTime);  // 今天的时间

int hour = nowTime.getHour();                // 时
System.out.println("hour:" + hour);          // hour

int minute = nowTime.getMinute();            // 分
System.out.println("minute:" + minute);      // minute

int second = nowTime.getSecond();            // 秒
System.out.println("second:" + second);      // second

int nano = nowTime.getNano();                // 纳秒
System.out.println("nano:" + nano);          // nano

System.out.println(LocalTime.of(8, 20));          // 时分
System.out.println(LocalTime.of(8, 20, 30));      // 时分秒
System.out.println(LocalTime.of(8, 20, 30, 150)); // 时分秒纳秒
LocalTime mTime = LocalTime.of(8, 20, 30, 150);

System.out.println(LocalDateTime.of(1991, 11, 11, 8, 20));
System.out.println(LocalDateTime.of(1991, Month.NOVEMBER, 11, 8, 20));
System.out.println(LocalDateTime.of(1991, 11, 11, 8, 20, 30));
System.out.println(LocalDateTime.of(1991, Month.NOVEMBER, 11, 8, 20, 30));
System.out.println(LocalDateTime.of(1991, 11, 11, 8, 20, 30, 150));
System.out.println(LocalDateTime.of(1991, Month.NOVEMBER, 11, 8, 20, 30, 150));

LocalDateTime

// 日期 时间
LocalDateTime nowDateTime = LocalDateTime.now();
System.out.println("今天是:" + nowDateTime);        // 今天是

System.out.println(nowDateTime.getYear());         // 年
System.out.println(nowDateTime.getMonthValue());   // 月
System.out.println(nowDateTime.getDayOfMonth());   // 日
System.out.println(nowDateTime.getHour());         // 时
System.out.println(nowDateTime.getMinute());       // 分
System.out.println(nowDateTime.getSecond());       // 秒
System.out.println(nowDateTime.getNano());         // 纳秒

System.out.println("dayOfYear:" + nowDateTime.getDayOfYear());   // 日:当年的第几天

System.out.println(nowDateTime.getDayOfWeek());                  // 星期
System.out.println(nowDateTime.getDayOfWeek().getValue());

System.out.println(nowDateTime.getMonth());                      // 月份
System.out.println(nowDateTime.getMonth().getValue());


LocalDate ld = nowDateTime.toLocalDate(); // LocalDateTime 对象转换成一个 LocalDate 对象
System.out.println(ld);

LocalTime lt = nowDateTime.toLocalTime(); // LocalDateTime 对象转换成一个 LocalTime 对象
System.out.println(lt.getHour());
System.out.println(lt.getMinute());
System.out.println(lt.getSecond());

时间运算

LocalTime nowTime = LocalTime.now();
System.out.println(nowTime);                    // 当前时间

System.out.println(nowTime.minusHours(1));      // 一小时前
System.out.println(nowTime.minusMinutes(1));    // 一分钟前
System.out.println(nowTime.minusSeconds(1));    // 一秒前
System.out.println(nowTime.minusNanos(1));      // 一纳秒前

System.out.println(nowTime.plusHours(1));       // 一小时后
System.out.println(nowTime.plusMinutes(1));     // 一分钟后
System.out.println(nowTime.plusSeconds(1));     // 一秒后
System.out.println(nowTime.plusNanos(1));       // 一纳秒后

System.out.println(nowTime);                    // 不可变对象, 每次修改产生新对象, 此处与原来的 nowTime 一样


LocalDate myDate = LocalDate.of(2018, 9, 5);
LocalDate nowDate = LocalDate.now();

System.out.println("今天是2018-09-06吗?" + nowDate.equals(myDate));                   // false
System.out.println(myDate + "是否在" + nowDate + "之前?" + myDate.isBefore(nowDate)); // true
System.out.println(myDate + "是否在" + nowDate + "之后?" + myDate.isAfter(nowDate));  // false

// 判断今天是否是你的生日(月日对象)
LocalDate birDate = LocalDate.of(1996, 8, 5);
LocalDate nowDate = LocalDate.now();

MonthDay birMd = MonthDay.of(birDate.getMonthValue(), birDate.getDayOfMonth());  // --08-05
MonthDay nowMd = MonthDay.from(nowDate);										 // --01-17(推荐)

System.out.println("今天是你的生日吗?" + birMd.equals(nowMd)); // false

6、DateTimeFormatter

LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);                // 2021-03-01T15:09:17.444190900

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

// 正反都可以来

String ldtStr1 = ldt.format(dtf);
System.out.println(ldtStr1);            // 2021-03-01 15:09:17

String ldtStr2 = dtf.format(ldt);
System.out.println(ldtStr2);            // 2021-03-01 15:09:17
// 本地 日期时间 对象
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);

// 解析/格式化器
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EEE a"); // EEE a: 周几 上/下午

// 正向格式化
System.out.println(dtf.format(ldt)); // 2022-01-17 17:42:19 星期一 下午
// 逆向格式化
System.out.println(ldt.format(dtf)); // 2022-01-17 17:42:19 星期一 下午

// 解析字符串时间
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 解析当前字符串时间成为本地日期时间对象
LocalDateTime ldt = LocalDateTime.parse("2019-11-11 11:11:11",  dtf);
System.out.println(ldt);
System.out.println(ldt.getDayOfYear());

7、Period、Duration

Period:方法 getYears(),getMonths() 和 getDays(),只能精确到年月日,用于 LocalDate 之间的比较(计算 "日期" 间隔)

LocalDate today = LocalDate.now();
System.out.println(today);     // 2021-03-01

LocalDate birthDate = LocalDate.of(1995, 1, 11);
System.out.println(birthDate); // 1995-01-11

Period period = Period.between(birthDate, today); // 第二个参数减第一个参数

System.out.println(period.getYears());
System.out.println(period.getMonths());
System.out.println(period.getDays());

Duration:用于 LocalDateTime 之间的比较,也可用于 Instant 之间的比较(计算 "时间" 间隔)

LocalDateTime today = LocalDateTime.now();
System.out.println(today);

LocalDateTime birthDate = LocalDateTime.of(1990, 10, 1, 10, 50, 30);
System.out.println(birthDate);

Duration duration = Duration.between(birthDate, today); // 第二个参数减第一个参数

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());                 // 两个时间差的纳秒数

8、ChronoUnit

ChronoUnit 类可用于在单个时间单位内测量一段时间,这个工具类是最全的了,可以用于比较所有的时间单位

LocalDateTime today = LocalDateTime.now();
System.out.println(today);

LocalDateTime birthDate = LocalDateTime.of(1990, 10, 1, 10, 50, 30);
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));
posted @ 2023-10-23 22:09  lidongdongdong~  阅读(11)  评论(0编辑  收藏  举报