91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringCloud中怎么利用Feign傳輸date類型參數

發布時間:2021-07-30 14:01:34 來源:億速云 閱讀:640 作者:Leah 欄目:大數據

SpringCloud中怎么利用Feign傳輸date類型參數,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

一、Java Date類型的時差問題

請看下邊這段代碼

public static void main(String[] args) throws Exception {
    Date date1 = new Date();
    System.out.println("date1: " + date1.toString());
    Date date2 = new Date(date1.toString());
    System.out.println("date2: " + date2.toString());
}

執行結果如下

date1: Mon Jul 22 08:47:19 CST 2019
date2: Mon Jul 22 22:47:19 CST 2019

當前時間是2019年7月22日8點48分,CST是中國的時區China Standard Time的簡稱,但是可以看到date2的輸入比實際時間多了14個小時。

CTS代表的時區其實有四個(Central Standard Time (USA) UT-6:00、Central Standard Time (Australia) UT+9:30、China Standard Time UT+8:00、Cuba Standard Time UT-4:00),同時表示美國,澳大利亞,中國,古巴四個國家的標準時間。

原因

new Date(date1.toString())

這個方法會調用Date.parse(String)方法,它傳的參數是Mon Jul 22 08:47:19 CST 2019,這個方法上有一段注釋

* <li>Any word that matches <tt>EST, CST, MST</tt>, or <tt>PST</tt>,
*     ignoring case, is recognized as referring to the time zone in
*     North America that is five, six, seven, or eight hours west of
*     Greenwich, respectively. Any word that matches <tt>EDT, CDT,
*     MDT</tt>, or <tt>PDT</tt>, ignoring case, is recognized as
*     referring to the same time zone, respectively, during daylight
*     saving time.</ul><p>

可以看到CST會被當作美國中部的時區Central Standard Time,即JVM認為你傳入的時間是美國中部的時間,而當date2調用toString方法的時候,它會檢測到系統的時區是中國,就會自動加14個小時(東八區與西六區的時差),就變成了Mon Jul 22 22:47:19 CST 2019

解決方法

這個問題其實如果自己寫代碼的話很難出現,因為所有的Java書籍都不會這么教,大多數都是通過SimpleDateFormat,進行Date和String的轉換,畢竟new Date(date1.toString())這個方法已經標注為廢棄了

二、Feign客戶端的問題

Feign客戶端在進行通信時,會調用Date的toString方法轉為String類型,服務端在接受的時候,使用的就是new Date(String)這個方法,這里就會發生前邊介紹的問題,產生14個小時的時差

解決方法

在客戶端添加代碼,規定Feign在將Date參數轉化成String參數的格式:

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FeignFormatterRegistrar;
import org.springframework.core.convert.converter.Converter;
import org.springframework.format.FormatterRegistry;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

@Slf4j
@Component
public class FeignDateFormatRegister implements FeignFormatterRegistrar {

    @Override
    public void registerFormatters(FormatterRegistry registry) {
        registry.addConverter(Date.class, String.class, new Date2StringConverter());
    }

    private class Date2StringConverter implements Converter<Date, String> {
        @Override
        public String convert(Date source) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            return sdf.format(source);
        }

    }
}

在服務端添加代碼,規定SpringContext在String和Date時的用的轉化器,讓轉化器知道我們在客戶端配置的參數格式:

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.support.GenericConversionService;
import org.springframework.web.bind.support.ConfigurableWebBindingInitializer;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;

import javax.annotation.PostConstruct;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

@Slf4j
@Configuration
public class FeignConfiguration {

    @Autowired
    private RequestMappingHandlerAdapter handlerAdapter;

    /**
     *  增加字符串轉日期的功能       
     */
    @PostConstruct
    public void initEditableValidation() {
        ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer) handlerAdapter.getWebBindingInitializer();
        if (initializer.getConversionService() != null) {
            GenericConversionService genericConversionService = (GenericConversionService) initializer.getConversionService();
            genericConversionService.addConverter(String.class, Date.class, new String2DateConverter());
        }
    }

    class String2DateConverter implements Converter<String, Date> {
        @Override
        public Date convert(String source) {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            try {
                return simpleDateFormat.parse(source);
            } catch (ParseException e) {
                log.error("", e);
            }
            return null;
        }
    }
}

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鹤壁市| 开平市| 五峰| 明星| 牡丹江市| 湾仔区| 万山特区| 云安县| 怀来县| 射洪县| 沙田区| 汕头市| 健康| 宜黄县| 宜宾市| 黔南| 平阳县| 浦北县| 佛冈县| 合川市| 延川县| 平谷区| 伊春市| 延寿县| 景谷| 高陵县| 元阳县| 沙坪坝区| 德庆县| 平阳县| 泾源县| 南漳县| 大同市| 项城市| 二手房| 临邑县| 保定市| 修水县| 湾仔区| 崇仁县| 武乡县|