ホームページ  >  記事  >  Java  >  SpringBoot はユーザーのシステムのタイムゾーンに基づいて時間を動的にどのように表示しますか?

SpringBoot はユーザーのシステムのタイムゾーンに基づいて時間を動的にどのように表示しますか?

WBOY
WBOY転載
2023-05-17 08:10:051911ブラウズ

ユーザーシステムのタイムゾーンに基づいた時刻の動的表示

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 オブジェクトに変換し、ビジネス ロジックで処理するとき、オブジェクトは依然として所属しますタイム ゾーン、対応する 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 オブジェクトを受け取ることもできます。現時点では、String から LocalDateTime への変換を処理するようにコンバータをカスタマイズする必要があり、同時に、ユーザーが送信したユーザーのタイム ゾーンに属するオブジェクトを UTC 8 タイム ゾーン オブジェクトに変換する必要があります。

rree

以上がSpringBoot はユーザーのシステムのタイムゾーンに基づいて時間を動的にどのように表示しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。