Java8 日期函数的新特性以及Mysql数据库在存储日期类字段时数据类型的选择对比

18 篇文章 0 订阅
2 篇文章 0 订阅

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值