踩坑之Java接收Microsoft Date

文章介绍了MicrosoftJSON日期格式的两种变种,包括包含时区偏移量和不包含时区偏移量的格式。在.NET平台中常见,解析这种格式通常需要自定义反序列化工具。文章提供了一个使用Jackson进行自定义反序列化的Java示例代码,用于将这种时间格式转换为Date对象。
摘要由CSDN通过智能技术生成

1.接收的时间格式

先看一下时间格式:如下
“/Date(1684933117770-0700)/” ,
“/Date(1684933117770)/”

2.时间格式说明

这两种时间格式都是Microsoft JSON日期格式(Microsoft JSON Date format)的变种,也被称为.NET JSON日期格式(.NET JSON Date format)。

第一种时间格式:“/Date(1684933117770-0700)/”
这种格式包含了日期的毫秒数和时区偏移量。具体结构如下:

  1. “/Date(”:日期格式的开始标记。
  2. 1684933117770:表示日期的毫秒数
  3. -0700:表示时区偏移量的部分,以小时为单位。在这个例子中,表示时区偏移量为-7小时。
  4. “)/”:日期格式的结束标记。 例如,对于毫秒数为1684933117770,时区偏移量为-7小时的时间,可以解释为1970-01-19T11:31:51.777Z-0700。

第二种时间格式:“/Date(1684933117770)/”
这种格式只包含日期的毫秒数,没有时区偏移量。具体结构如下:

  1. “/Date(”:日期格式的开始标记。
  2. 1684933117770:表示日期的毫秒数。
  3. “)/”:日期格式的结束标记。 例如,对于毫秒数为1684933117770的时间,可以解释为
    1970-01-19T11:31:51.777Z。

这两种格式在.NET平台中常用,用于表示日期和时间的序列化和反序列化。在Java中,可以使用自定义的日期反序列化器(如提供的DateDeserializer类)来解析这种格式的时间字符串,并将其转换为Java的Date对象或其他适当的类型。

使用Jackson 时怎么自定义反序列化工具呢?
用如下代码可以实现:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.newegg.logistics.tis.common.constant.ZoneConstant;
import lombok.SneakyThrows;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

/**
 * @author Husu.Y.Hu
 * @date 2023/5/30
 */
public class MicrosoftDateDeserializer extends JsonDeserializer<Date> {
    private static final String OPEN_PARENTHESIS = "(";
    private static final String CLOSE_PARENTHESIS = ")";
    private static final String MINUS = "-";
    private static final String PLUS = "+";

    @SneakyThrows
    @Override
    public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        String originalDateStr = jsonParser.getText();

        int start = originalDateStr.indexOf(OPEN_PARENTHESIS) + 1;
        int end = originalDateStr.indexOf(CLOSE_PARENTHESIS);

        String dateStr = originalDateStr.substring(start, end);

        if (dateStr.contains(MINUS) || dateStr.contains(PLUS)) {
            int offsetIndex = dateStr.lastIndexOf(MINUS);

            if (offsetIndex == -1) {
                offsetIndex = dateStr.lastIndexOf(PLUS);
            }

            long milliseconds = Long.parseLong(dateStr.substring(0, offsetIndex));
            Date date = new Date(milliseconds);

            String offset = dateStr.substring(offsetIndex);
            TimeZone timeZone = TimeZone.getTimeZone("GMT" + offset);

            SimpleDateFormat dateFormat = new SimpleDateFormat(ZoneConstant.ISO_8601);
            dateFormat.setTimeZone(timeZone);
            String formattedDate = dateFormat.format(date);

            return dateFormat.parse(formattedDate);
            
        } else {
            long milliseconds = Long.parseLong(dateStr);
            return new Date(milliseconds);
        }
    }
}

3.使用

 @JsonDeserialize(using = MicrosoftDateDeserializer.class)
 private Date createTime;

只需要在需要接收的字段上加上该注解就ok奥.

需要注意的是,pom中要引入jackson ,具体怎么引入,其他博主也可写的很详细啦。我就不赘述啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书语时

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值