package com.qianwen.core.tool.convert; 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.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateUtils; import com.qianwen.core.tool.utils.Func; import com.qianwen.core.tool.utils.StringPool; /* * jackson日期转换器 */ public class DateJacksonConverter extends JsonDeserializer { private static String[] pattern = new String[] { "yyyy-MM-dd", "yyyy-MM-dd HH:mm", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm:ss.S", "yyyy.MM.dd", "yyyy.MM.dd HH:mm", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm:ss.S", "yyyy/MM/dd", "yyyy/MM/dd HH:mm", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm:ss.S", "yyyy-MM-dd'T'HH:mm:ss", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" }; public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException { Date targetDate = null; String originDate = p.getText(); if (StringPool.EMPTY.equals(originDate)) { return null; } if (Func.isNotEmpty(originDate)) { try { long longDate = Long.valueOf(originDate.trim()).longValue(); targetDate = new Date(longDate); } catch (NumberFormatException e) { try { if (originDate.contains("T")) { DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); targetDate = dateFormat.parse(originDate); } else { targetDate = DateUtils.parseDate(originDate, pattern); } } catch (ParseException pe) { throw new IOException(String.format("'%s' can not convert to type 'java.util.Date',just support timestamp(type of long) and following date format(%s)", originDate, StringUtils.join(pattern, StringPool.COMMA))); } } } return targetDate; } public Class handledType() { return Date.class; } }