java 处理 ISO 8601(RFC 3339)时间格式

本文介绍ISO8601与RFC3339时间格式的区别,并通过Java代码示例展示如何进行时间的反序列化和序列化操作。此外,还详细解释了Java中的日期时间类和Java 8提供的新日期时间API。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


相关文章导读:

java 时区 mysql 时区:时区在程序和数据库中的作用及其机制


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、RFC 3339和ISO 8601是什么?

RFC3339与ISO8601的区别是前者必需是日期和时间的完整表示。

最值得注意的是RFC 3339需要日期和时间的完整表示(只有小数秒是可选的)。RFC也有一些细微的差别。例如,仅允许使用两位数的截断表示法是不允许的 - RFC 3339需要4位数的年份,RFC只允许使用句点字符作为小数秒的小数点。RFC还允许用空格(或其他字符)替换“T”,而标准只允许将其省略(并且只有在使用表示的各方之间达成一致时)。

在这里插入图片描述
具体的差别看下面连接的表格。

https://ijmacd.github.io/rfc3339-iso8601/

二、使用

反序列化

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

import java.io.IOException;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;

public class TimestampDeserialize extends JsonDeserializer<Timestamp> {
    @Override
    public Timestamp deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        String dateStr = p.getValueAsString();
        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
                .parseCaseInsensitive()
                .append(DateTimeFormatter.ISO_LOCAL_DATE)
                .appendLiteral('T')
                .append(DateTimeFormatter.ISO_LOCAL_TIME)
                .appendLiteral("+08:00").toFormatter();
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now.format(DateTimeFormatter.BASIC_ISO_DATE));
        System.out.println(now.format(formatter));
        LocalDateTime localDateTime = LocalDateTime.parse(dateStr, formatter);
        Timestamp newTime = Timestamp.valueOf(localDateTime);
        return newTime;
    }
}




序列化

    @JsonDeserialize(using = TimestampDeserialize.class)
    private Timestamp createdAt;

JSR310

Java上新的时间日期处理API命名。

秒级单位

Millisecond 毫秒

microsecond 微秒

nanosecond 纳秒

1 秒=1000 毫秒

1 秒=1000000 微秒

1 秒=1000000000 纳秒

Java中的日期\时间类

Date

非多线程安全,精度最多微秒

Calendar

LocalDateTime

有时区,精度最多纳秒

Timestamp

时间戳,没有时区

java8 日期\时间工具类

ZoneId 地区 Asia/Shanghai、Europe/Paris
ZoneOffset 偏移数据 +8:00
Instant 它代表的是时间戳
Duration 它表示秒或纳秒时间间隔
Period 表示一段时间的年、月、日,开使用between()方法获取两个日期之间的差作为Period 对象返回
LocalDate 不包含具体时间的日期,比如2014-01-14。它可以用来存储生日,周年纪念日,入职日期等。
LocalTime 它代表的是不含日期的时间
LocalDateTime 它包含了日期及时间,不过还是没有偏移信息或者说时区。
ZonedDateTime 这是一个包含时区的完整的日期时间,偏移量是以UTC/格林威治时间为基准的。
OffsetDateTime 类实际上包含了LocalDateTime与ZoneOffset
DateTimeFormatter 日期的格式化与解析,与SimpleDateFormat不同,它是不可变且线程安全的
TemporalAdjusters 类中包含许多常用的静态方法,避免自己编写工具类


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值