中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

SpringBoot怎么根據用戶系統時區動態展示時間

發布時間:2023-01-09 10:54:48 來源:億速云 閱讀:237 作者:iii 欄目:開發技術

本篇內容介紹了“SpringBoot怎么根據用戶系統時區動態展示時間”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

根據用戶系統時區動態展示時間

當我們使用SpringBoot+Mysql開發系統時,總是統一設置UTC+8時區,這樣用戶在任何地區訪問系統,展示的時間都是國內標準時間,體驗不友好,下面通過獲取當前用戶系統所在的時區,給用戶展示不同的時間。

一、用戶時區的獲取

我們可以通過JavaScript來獲取系統所在的時區,然后統一設置在請求頭里。

Intl.DateTimeFormat().resolvedOptions().timeZone; // Asia/Shanghai

二、核心代碼

這里統一使用LocalDateTime,更方便的處理時區轉換問題,通過標識當前LocalDateTime對象所屬時區,然后轉換為目標時區時間。

public LocalDateTime convertLocalDateTime(LocalDateTime localDateTime, ZoneId originZoneId,
			ZoneId targetZoneId)
{
	return localDateTime.atZone(originZoneId).withZoneSameInstant(targetZoneId).toLocalDateTime();
}

三、SpringBoot返回json時統一處理時區

當程序從數據庫中讀取出并轉換成LocalDateTime對象,并經過業務邏輯處理,這時候該對象還是屬于UTC+8時區,對應的ZoneId=Asia/Shanghai,當需要返回給前端時,可以通過自定義jackson序列化器,在LocalDateTime轉json前轉換到用戶目標時區。

@Configuration
public class JacksonConfiguration
{
	@Autowired
	private JacksonProperties jacksonProperties;	/**
	 * 時區轉換
	 * 
	 * @param localDateTime
	 * @param originZoneId
	 * @param targetZoneId
	 * @return
	 */
	public static LocalDateTime convertLocalDateTime(LocalDateTime localDateTime, ZoneId originZoneId,
			ZoneId targetZoneId)
	{
		return localDateTime.atZone(originZoneId).withZoneSameInstant(targetZoneId).toLocalDateTime();
	}	/**
	 * LocalDateTime序列化
	 */
	public static class CustomLocalDateTimeSerializer extends JsonSerializer<LocalDateTime>
	{
		private DateTimeFormatter formatter;		public CustomLocalDateTimeSerializer(DateTimeFormatter formatter)
		{
			super();
			this.formatter = formatter;
		}		@Override
		public void serialize(LocalDateTime value, JsonGenerator generator, SerializerProvider provider)
				throws IOException
		{
			generator.writeString(convertLocalDateTime(value, ZoneId.of("Asia/Shanghai"), ZoneId.of("Africa/Sao_Tome"))
					.format(formatter));
		}	}	/**
	 * LocalDateTime反序列化
	 * 
	 */
	public static class CustomLocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime>
	{
		private DateTimeFormatter formatter;		public CustomLocalDateTimeDeserializer(DateTimeFormatter formatter)
		{
			super();
			this.formatter = formatter;
		}		@Override
		public LocalDateTime deserialize(JsonParser parser, DeserializationContext context)
				throws IOException, JacksonException
		{
			return convertLocalDateTime(LocalDateTime.parse(parser.getText(), formatter), ZoneId.of("Africa/Sao_Tome"),
					ZoneId.of("Asia/Shanghai"));
		}	}	@Bean
	public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer()
	{
		return builder ->
		{
			builder.serializerByType(LocalDateTime.class,
					new CustomLocalDateTimeSerializer(DateTimeFormatter.ofPattern(jacksonProperties.getDateFormat())));
			builder.deserializerByType(LocalDateTime.class,
					new CustomLocalDateTimeDeserializer(DateTimeFormatter.ofPattern(jacksonProperties.getDateFormat())));
		};
	}
}

上面示例代碼設定用戶時區ZoneId=Africa/Sao_Tome,并且自定義處理了LocalDateTime反序列化器,當使用ResquestBody注解時,對象中的LocalDateTime屬性值也會轉換成UTC+8時區,不用再額外處理,可直接保存到數據庫。

四、SpringBoot接收時間參數統一處理時區

除了上面所說通過ResquestBody注解來接收參數外,還可能通過Get或者Post參數來接收LocalDateTime對象,這時候我們就要自定義一個Converter來處理String轉換到LocalDateTime,同時把用戶提交的屬于用戶時區的對象轉換成UTC+8時區對象。

@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer
{
	@Autowired
	private WebMvcProperties webMvcProperties;	@Override
	public void addFormatters(FormatterRegistry registry)
	{
		registry.addConverter(new Converter<String, LocalDateTime>()
		{			private LocalDateTime convertLocalDateTime(LocalDateTime localDateTime, ZoneId originZoneId,
					ZoneId targetZoneId)
			{
				return localDateTime.atZone(originZoneId).withZoneSameInstant(targetZoneId).toLocalDateTime();
			}			@Override
			public LocalDateTime convert(String source)
			{
				return convertLocalDateTime(
						LocalDateTime.parse(source,
								DateTimeFormatter.ofPattern(webMvcProperties.getFormat().getDateTime())),
						ZoneId.of("Africa/Sao_Tome"), ZoneId.of("Asia/Shanghai"));
			}		});
	}}

“SpringBoot怎么根據用戶系統時區動態展示時間”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

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

AI

桓台县| 鹤壁市| 汾阳市| 乌鲁木齐县| 昔阳县| 芮城县| 宜君县| 武穴市| 互助| 江永县| 分宜县| 南和县| 郓城县| 蓝田县| 保山市| 阳曲县| 江阴市| 连江县| 光泽县| 安仁县| 黄石市| 滨州市| 烟台市| 龙岩市| 龙泉市| 瓦房店市| 荣昌县| 黎平县| 广东省| 如东县| 万年县| 宜阳县| 常德市| 东莞市| 柳林县| 黎城县| 开平市| 科技| 义乌市| 镇坪县| 苏尼特左旗|