LocalDateTime与时间戳、日期字符串的转换

发布时间 2023-09-25 07:26:43作者: 楼兰胡杨

摘要:介绍LocalDateTime与时间戳、日期字符串的转换。

需求背景

  服务器部署在不同时区,数据在业务使用过程中,需要进行时区切换,为了不影响数据效果,把各个时区的时间统一为UTC时区。故分享如何实现LocalDateTime与时间戳、日期字符串的转换。

LocalDateTime转字符串

  可以把LocalDateTime转换成指定时区、指定格式的字符串,以UTC时区为例,转换成yyyy-MM-dd HH:mm:ss的实现逻辑如下:

    private static DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    private static ZoneId myZone = TimeZone.getTimeZone("UTC").toZoneId();
    private static ZoneId currentZone = OffsetDateTime.now().getOffset();
    /**
     * 格式化 LocalDateTime 为UTC时区的字符串
     *
     * @param localTime
     * @return utc 时间
     * @Date 2023-08-05
     **/
    public static String getGivenZoneTimeStr(LocalDateTime localTime) {
//        System.out.println("转换前的时间:" + localTime.format(df));
        LocalDateTime newTime = localTime.atZone(currentZone).withZoneSameInstant(myZone).toLocalDateTime();
        return newTime.format(df);
    }

  如果把myZone换成其它时区,则可以得到对应时区的时间,诸如GMT+7:00、GMT+8:00等。

LocalDateTime转时间戳

  这篇文章很水,如果不是因为使用如下LocalDateTime转时间戳导致转换失败,也就不发此文了:

    public static long local2Timestamp(LocalDateTime localTime) {
        // 设置时区偏移量,这里设置为UTC
        long milliSecond = localTime.toInstant(ZoneOffset.UTC).toEpochMilli();
        System.out.println("local时间转UTC时间戳:" + milliSecond);
        return milliSecond;
    }

正确的LocalDateTime转时间戳实现代码如下:

    /**
     * UTC时区
     */
    private static ZoneId myZone = TimeZone.getTimeZone("UTC").toZoneId();
    private static ZoneId currentZone = OffsetDateTime.now().getOffset();
    public static long local2TimestampPlus(LocalDateTime localTime) {
        LocalDateTime newTime = localTime.atZone(currentZone).withZoneSameInstant(myZone).toLocalDateTime();
        return newTime.toInstant(ZoneOffset.UTC).toEpochMilli();
    }

时间戳转LocalDateTime

这个就简单了,请各位使用的时候根据需要设置一下时区,我这里使用默认时区验证:

    public static LocalDateTime timestamp2Local(long timestamp) {
        return Instant.ofEpochMilli(timestamp).atZone(ZoneId.systemDefault()).toLocalDateTime();
    }

时间戳转日期字符串

  Date对象保存的是毫秒数,本身不带时区信息。但是如果调用Date.toString()、Date.parse()等方法把Date展现出来时,就会存在时区的概念,需要进行时区转换,而且不是所有人都只想要UTC时间。

    public static void main(String[] args) {
        String result = timestamp2Str(Instant.now().toEpochMilli(), "GMT+7:00");
        System.out.println(result);
    }

    public static String timestamp2Str(long timestamp, String timeZoneId) {
        Date timeStampDate = new Date(timestamp);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sdf.setTimeZone(TimeZone.getTimeZone(timeZoneId));
        return sdf.format(timeStampDate);
    }

结束语

  文章到这里就结束了,看完之后你有什么想法想要跟大家分享呢?评论区在等着你!