UTC-string to java.sql.Timestamp

  1. yyyy-MM-dd’T’HH:mm:ss.SSSSSS’Z’
  2. java8 OffsetDateTime

yyyy-MM-dd’T’HH:mm:ss.SSSSSS’Z’

T Z 代表了即UTC时间

.SSSSSSSSS 即保留到小数点后9位的精度,也是 java.sql.Timestamp 最大精度。

举例 2019-11-11T03:11:11.233333333Z 我们如何保留精度得到 java.sql.Timestamp 对象呢?

java8 OffsetDateTime

既然 2019-11-11T03:11:11.233333333Z 是字符串,我们自然想到就是把它 parse 成 java 的时间对象,经过查阅资料,发现 OffsetDateTime (表示一个带 ZoneOffset 的时间)正好符合要求。

直接上干货:

import java.sql.Timestamp;
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;

/**
 * @author cuishilei
 */
public class DateTimeTest {
    public static void main(String[] args) {
        String timeStampUtcStr = "2019-11-11T03:11:11.233333333Z";

        //这里我根据方法参数直接找到了 DateTimeFormatter.ISO_OFFSET_DATE_TIME 这个代表 UTC 时间格式的 Formatter
        OffsetDateTime offsetDateTime = OffsetDateTime.parse(timeStampUtcStr, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
        // toInstant 返回 Instant 对象,表示是某个时间(有点像 java.util.Date),它是精确到纳秒的,正好符合 Timestamp 的精度
        // 其内部是由两个Long字段组成,
        // 第一个部分保存的是自标准Java计算时代(就是1970年1月1日开始)到现在的秒数,这里自然就解决了时区问题
        // 第二部分保存的是纳秒数(永远不会超过999,999,999)
        Instant instant = offsetDateTime.toInstant();
        // 并且 Timestamp 可以根据 Instant 直接生成 Timestamp 对象,
        Timestamp timestamp = Timestamp.from(instant);
        System.out.println(timeStampUtcStr);
        System.out.println(timestamp);
    }
}

输出结果

2019-11-11T03:11:11.233333333Z
2019-11-11 11:11:11.233333333

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 rockeycui@163.com

文章标题:UTC-string to java.sql.Timestamp

文章字数:357

本文作者:崔石磊(RockeyCui)

发布时间:2019-10-12, 20:21:33

原始链接:https://cuishilei.com/utc-str-to-timestamp.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏