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(); }
プログラムがデータベースから読み取って 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 タイム ゾーンに変換されます。追加の処理は必要なく、データベースに直接保存できます。
上記のように ResquestBody アノテーションを通じてパラメーターを受け取ることに加えて、Get パラメーターまたは Post パラメーターを通じて LocalDateTime オブジェクトを受け取ることもできます。現時点では、String から LocalDateTime への変換を処理するようにコンバータをカスタマイズする必要があり、同時に、ユーザーが送信したユーザーのタイム ゾーンに属するオブジェクトを UTC 8 タイム ゾーン オブジェクトに変換する必要があります。
rree以上がSpringBoot はユーザーのシステムのタイムゾーンに基づいて時間を動的にどのように表示しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。