Wenn wir SpringBoot+Mysql zur Entwicklung des Systems verwenden, stellen wir die Zeitzone UTC+8 immer einheitlich ein. Auf diese Weise wird die angezeigte Zeit angezeigt, wenn Benutzer in einer beliebigen Region auf das System zugreifen Die Zeit ist die inländische Standardzeit, was eine unfreundliche Erfahrung ist. Zeigen Sie dem Benutzer als Nächstes unterschiedliche Zeiten an, indem Sie die Zeitzone des aktuellen Benutzersystems abrufen.
Wir können die Zeitzone des Systems über JavaScript abrufen und sie dann einheitlich im Anforderungsheader festlegen.
Intl.DateTimeFormat().resolvedOptions().timeZone; // Asia/Shanghai
LocalDateTime wird hier einheitlich verwendet, um Probleme bei der Zeitzonenkonvertierung bequemer zu lösen, indem die Zeitzone identifiziert wird, zu der das aktuelle LocalDateTime-Objekt gehört, und diese dann in die Zielzeitzonenzeit konvertiert wird.
public LocalDateTime convertLocalDateTime(LocalDateTime localDateTime, ZoneId originZoneId, ZoneId targetZoneId) { return localDateTime.atZone(originZoneId).withZoneSameInstant(targetZoneId).toLocalDateTime(); }
Wenn das Programm aus der Datenbank liest und es in ein LocalDateTime-Objekt umwandelt und es mit Geschäftslogik verarbeitet, gehört das Objekt immer noch zur UTC+8-Zeitzone. und die entsprechende ZoneId=Asia /Shanghai, wenn es an das Frontend zurückgegeben werden muss, können Sie einen benutzerdefinierten Jackson-Serializer verwenden, um LocalDateTime in die Zielzeitzone des Benutzers zu konvertieren, bevor Sie es in JSON konvertieren.
@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()))); }; } }
Der obige Beispielcode legt die Benutzerzeitzone ZoneId=Africa/Sao_Tome fest und passt den LocalDateTime-Deserialisierer an. Bei Verwendung der ResquestBody-Annotation wird der LocalDateTime-Attributwert im Objekt ebenfalls in die UTC+8-Zeitzone konvertiert, was nicht erforderlich ist Nachträgliche Bearbeitungen können direkt in der Datenbank gespeichert werden.
Zusätzlich zum Empfang von Parametern über die oben erwähnte ResquestBody-Annotation ist es derzeit auch möglich, LocalDateTime-Objekte über Get- oder Post-Parameter zu empfangen Sie müssen einen Konverter anpassen, um die String-Konvertierung in LocalDateTime durchzuführen und gleichzeitig die vom Benutzer übermittelten Objekte, die zur Zeitzone des Benutzers gehören, in UTC+8-Zeitzonenobjekte zu konvertieren.
@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")); } }); }}
Das obige ist der detaillierte Inhalt vonWie zeigt SpringBoot die Zeit dynamisch basierend auf der Systemzeitzone des Benutzers an?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!