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

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

WBOY
WBOY앞으로
2023-05-17 08:10:051869검색

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

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으로 문의하시기 바랍니다. 삭제