java LocalDateTime 和 mysql datetime timestamp时区问题

1. java 中 LocalDateTime

java 中的 LocalDateTime 是没有时区概念的
获取当前时间时,等于当前UTC时间 + 服务时区偏移
比如当前时间是 2022-05-18T16:09:48.869+08:00[Asia/Shanghai]
那么 LocalDateTime.now() 得到的时间就是 2022-05-18T16:09:48.869
下面是java源码

public static LocalDateTime now(Clock clock) {
        Objects.requireNonNull(clock, "clock");
        final Instant now = clock.instant();  // called once
        ZoneOffset offset = clock.getZone().getRules().getOffset(now);
        return ofEpochSecond(now.getEpochSecond(), now.getNano(), offset);
    }
    public static LocalDateTime ofEpochSecond(long epochSecond, int nanoOfSecond, ZoneOffset offset) {
        Objects.requireNonNull(offset, "offset");
        NANO_OF_SECOND.checkValidValue(nanoOfSecond);
        // 标准时间戳 + 时区的偏移量
        long localSecond = epochSecond + offset.getTotalSeconds();  // overflow caught later
        long localEpochDay = Math.floorDiv(localSecond, SECONDS_PER_DAY);
        int secsOfDay = (int)Math.floorMod(localSecond, SECONDS_PER_DAY);
        LocalDate date = LocalDate.ofEpochDay(localEpochDay);
        LocalTime time = LocalTime.ofNanoOfDay(secsOfDay * NANOS_PER_SECOND + nanoOfSecond);
        return new LocalDateTime(date, time);
    }
        @Test
    public void test2() {
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now);
        System.out.println(now.atZone(ZoneId.of(ZoneOffset.UTC.getId())));
        System.out.println(now.atZone(ZoneId.of("+8")));
        System.out.println(DateTimeFormatter.ISO_DATE_TIME.format(now.atZone(ZoneId.of(ZoneOffset.UTC.getId()))));

        Instant now1 = Instant.now();
        System.out.println(now1);
        System.out.println(now1.atZone(ZoneId.systemDefault()));
    }
/* 测试结果
2022-05-18T16:09:48.864
2022-05-18T16:09:48.864Z
2022-05-18T16:09:48.864+08:00
2022-05-18T16:09:48.864Z
2022-05-18T08:09:48.869Z
2022-05-18T16:09:48.869+08:00[Asia/Shanghai]
*/

2. mysql datetime timestamp 时区问题

mysql datetime 是没有时区概念的
取值范围是 ‘1000-01-01 00:00:00’ to ‘9999-12-31 23:59:59’
timestamp 是有时区概念的
显示是当前时间,存储是标准时间

CREATE TABLE time_test
(
    id               bigint AUTO_INCREMENT PRIMARY KEY,
    create_datetime  datetime(6) COMMENT '创建时间',
    create_timestamp timestamp(6) COMMENT '创建时间戳'
);
INSERT into time_test(create_datetime, create_timestamp) VALUES (NOW(), current_timestamp());
SELECT * from time_test;
set TIME_ZONE = '+00:00';
SELECT * from time_test;
# 回撤时区修改
set TIME_ZONE = '+08:00';

在这里插入图片描述

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值