Java8 日期函数的新特性以及Mysql数据库在存储日期类字段时数据类型的选择对比
- 代码
- 执行结果
代码
/**
* Java Date 类型总结
* 如果使用 datetime 需要 8 个字节。
* 如果使用 timestamp 需要 4 个字节。
*
* MySQL5.6.4 之前,TIMESTAMEP 固定占用 4 个字节,从 MySQL5.6.4 开始,依据毫秒的精度,TIMESTAMEP 占用的字节数介于 4 到 7 之间。
*
* DATETIME 的存储范围介于 1000-01-01 00:00:00 到 9999-12-31 23:59:59 之间。
* TIMESTAMP 的存储范围则介于 1970-01-01 00:00:01 UTC 到 2038-01-19 03:14:07 UTC 之间。
*
* TIMESTAMP 类型最大的优势在于自带时区属性,但是时区转换涉及操作系统的底层函数的加锁与解锁操作,所以比较耗费性能。
*
*/
public static void main(String[] args) {
LocalDate ld = LocalDate.now();
LocalTime lt = LocalTime.now();
// 现在时间基础上增加两小时
LocalTime localTime = lt.plusHours(2);
LocalDateTime ldt = LocalDateTime.now();
System.out.println("===== "+ld);
System.out.println("===== "+lt);
System.out.println("===== "+localTime);
System.out.println("===== "+ldt);
LocalDate dateOfBirth = LocalDate.of(2022, 4, 15);
System.out.println("The special date is : " + dateOfBirth);
// 判断两个日期是否相等
LocalDate today = LocalDate.now();
LocalDate date1 = LocalDate.of(2022, 4, 15);
if(date1.equals(today)){
System.out.printf("TODAY %s and DATE1 %s are same date %n", today, date1);
}
// 检查周期性的日期
MonthDay birthday = MonthDay.of(dateOfBirth.getMonth(), dateOfBirth.getDayOfMonth());
MonthDay currentMonthDay = MonthDay.from(today);
if(currentMonthDay.equals(birthday)){
System.out.println("Many Many happy returns of the day !!");
}else{
System.out.println("Sorry, today is not your birthday");
}
// 如何计算一个星期之前和之后的日期
LocalDate localDatePlus = today.plus(1, ChronoUnit.WEEKS);
LocalDate localDateMinus = today.minus(1, ChronoUnit.WEEKS);
System.out.println("计算一个星期之后的日期 ===== "+localDatePlus);
System.out.println("计算一个星期之前的日期 ===== "+localDateMinus);
// Java8 的Clock时钟类
// 根据系统时间返回当前时间并设置为UTC。
Clock clock = Clock.systemUTC();
System.out.println("Clock ===== : " + clock);
// 根据系统时钟区域返回时间
Clock defaultClock = Clock.systemDefaultZone();
System.out.println("Clock ===== : " + defaultClock);
// 判断时间是早于还是晚于当前时间
LocalDate today2 = LocalDate.now();
LocalDate tomorrow = LocalDate.of(2022, 4, 16);
if(tomorrow.isAfter(today2)){
System.out.println("明天晚于今天");
}
LocalDate yesterday = today2.minus(1, ChronoUnit.DAYS);
if(yesterday.isBefore(today)){
System.out.println("昨天早于今天");
}
// 处理时区
// 设置时区
ZoneId america = ZoneId.of("America/New_York");
LocalDateTime localtDateAndTime = LocalDateTime.now();
ZonedDateTime dateAndTimeInNewYork = ZonedDateTime.of(localtDateAndTime, america );
System.out.println("现在的日期和时间在特定的时区 : " + dateAndTimeInNewYork);
// 判断固定日期
// 表示信用卡到期这类固定日期。与 MonthDay 检查重复事件的例子相似,YearMonth 是另一个组合类,用于表示信用卡到期日、FD到期日、期货期权到期日等
YearMonth currentYearMonth = YearMonth.now();
System.out.printf("Days in month year %s: %d%n", currentYearMonth, currentYearMonth.lengthOfMonth());
YearMonth creditCardExpiry = YearMonth.of(2028, Month.FEBRUARY);
System.out.printf("你的信用卡到期日为: %s %n", creditCardExpiry);
// 检查是否是闰年
if(today.isLeapYear()){
System.out.println("今年是闰年");
}else {
System.out.println("今年不是闰年");
}
// 计算两个日期之间的月数
LocalDate java8Release = LocalDate.of(2022, Month.NOVEMBER, 14);
Period periodToNextJavaRelease = Period.between(today, java8Release);
System.out.println("计算两个日期之间的月数: "
+ periodToNextJavaRelease.getMonths() );
// 显示包含时差信息的日期和时间
LocalDateTime datetime = LocalDateTime.of(2022, Month.APRIL, 15, 16, 33);
ZoneOffset offset = ZoneOffset.of("+05:30");
OffsetDateTime odDate = OffsetDateTime.of(datetime, offset);
System.out.println("显示包含时差信息的日期和时间: " + odDate);
// 获取当前的时间戳
Instant timestamp = Instant.now();
System.out.println("获取当前的时间戳: " + timestamp);
// 使用预定义的格式化工具去解析或格式化日期
String dayAfterTommorrow = "20220415";
LocalDate formatted = LocalDate.parse(dayAfterTommorrow, DateTimeFormatter.BASIC_ISO_DATE);
System.out.printf("使用预定义的格式化工具去解析或格式化日期: %s is %s %n", dayAfterTommorrow, formatted);
Date date = new Date();
System.out.println("===== "+date);
// TimeStamp
Timestamp tt = new Timestamp(System.currentTimeMillis());
System.out.println("===== "+tt);
}
执行结果
===== 2022-04-15
===== 16:51:31.219
===== 18:51:31.219
===== 2022-04-15T16:51:31.219
The special date is : 2022-04-15
TODAY 2022-04-15 and DATE1 2022-04-15 are same date
Many Many happy returns of the day !!
计算一个星期之后的日期 ===== 2022-04-22
计算一个星期之前的日期 ===== 2022-04-08
Clock ===== : SystemClock[Z]
Clock ===== : SystemClock[Asia/Shanghai]
明天晚于今天
昨天早于今天
现在的日期和时间在特定的时区 : 2022-04-15T16:51:31.282-04:00[America/New_York]
Days in month year 2022-04: 30
你的信用卡到期日为: 2028-02
今年不是闰年
计算两个日期之间的月数: 6
显示包含时差信息的日期和时间: 2022-04-15T16:33+05:30
获取当前的时间戳: 2022-04-15T08:51:31.289Z
使用预定义的格式化工具去解析或格式化日期: 20220415 is 2022-04-15
===== Fri Apr 15 16:51:31 CST 2022
===== 2022-04-15 16:51:31.295