> Java > java지도 시간 > 본문

SpringBoot는 사용자의 시스템 시간대에 따라 시간을 어떻게 동적으로 표시합니까?

WBOY
풀어 주다: 2023-05-17 08:10:05
앞으로
1921명이 탐색했습니다.

사용자 시스템 시간대에 따른 동적 시간 표시

SpringBoot+Mysql을 사용하여 시스템을 개발할 때 항상 UTC+8 시간대를 균일하게 설정합니다. 이런 방식으로 사용자가 어떤 지역에서든 시스템에 액세스하면 표시됩니다. 시간은 국내 표준시이므로 불편한 경험입니다. 다음으로 현재 사용자 시스템의 시간대를 가져와서 사용자에게 다른 시간을 표시합니다.

1. 사용자의 시간대 획득

JavaScript를 통해 시스템의 시간대를 획득한 후 요청 헤더에 균일하게 설정할 수 있습니다.

Intl.DateTimeFormat().resolvedOptions().timeZone; // Asia/Shanghai
로그인 후 복사

2. 핵심 코드

LocalDateTime은 현재 LocalDateTime 객체가 속한 시간대를 식별한 후 대상 시간대로 변환하여 시간대 변환 문제를 보다 편리하게 처리하기 위해 여기서 균일하게 사용됩니다.

public LocalDateTime convertLocalDateTime(LocalDateTime localDateTime, ZoneId originZoneId,
			ZoneId targetZoneId)
{
	return localDateTime.atZone(originZoneId).withZoneSameInstant(targetZoneId).toLocalDateTime();
}
로그인 후 복사

3. 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 시간대로 변환됩니다. 추가 처리는 데이터베이스에 직접 저장할 수 있습니다.

4. SpringBoot는 시간 매개변수를 수신하고 시간대를 통일적으로 처리합니다.

위에서 언급한 것처럼 ResquestBody 주석을 통해 매개변수를 수신하는 것 외에도 Get 또는 Post 매개변수를 통해 LocalDateTime 객체를 수신하는 것도 가능합니다. LocalDateTime으로의 문자열 변환을 처리하도록 변환기를 사용자 정의하고 동시에 사용자의 시간대에 속하는 사용자가 제출한 개체를 UTC+8 시간대 개체로 변환해야 합니다.

아아아아

위 내용은 SpringBoot는 사용자의 시스템 시간대에 따라 시간을 어떻게 동적으로 표시합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿