Rumah  >  Artikel  >  Java  >  Bagaimanakah SpringBoot memaparkan masa secara dinamik berdasarkan zon waktu sistem pengguna?

Bagaimanakah SpringBoot memaparkan masa secara dinamik berdasarkan zon waktu sistem pengguna?

WBOY
WBOYke hadapan
2023-05-17 08:10:051911semak imbas

Paparan masa dinamik berdasarkan zon waktu sistem pengguna

Apabila kami menggunakan SpringBoot+Mysql untuk membangunkan sistem, kami sentiasa menetapkan zon waktu UTC+8 secara seragam, supaya apabila pengguna mengakses sistem dalam mana-mana rantau, masa yang dipaparkan ialah standard domestik Masa bukan pengalaman yang mesra pengguna Mari tunjukkan masa yang berbeza kepada pengguna dengan mendapatkan zon waktu sistem pengguna semasa.

1. Mendapatkan zon waktu pengguna

Kami boleh mendapatkan zon waktu sistem melalui JavaScript, dan kemudian menetapkannya secara seragam dalam pengepala permintaan.

Intl.DateTimeFormat().resolvedOptions().timeZone; // Asia/Shanghai

2. Kod teras

LocalDateTime digunakan secara seragam di sini untuk mengendalikan isu penukaran zon waktu dengan lebih mudah dengan mengenal pasti zon waktu yang dimiliki objek LocalDateTime semasa dan kemudian menukarnya kepada masa sasaran waktu zon.

public LocalDateTime convertLocalDateTime(LocalDateTime localDateTime, ZoneId originZoneId,
			ZoneId targetZoneId)
{
	return localDateTime.atZone(originZoneId).withZoneSameInstant(targetZoneId).toLocalDateTime();
}

3. SpringBoot memproses zon waktu secara seragam apabila mengembalikan json

Apabila atur cara membaca daripada pangkalan data dan menukarnya menjadi objek LocalDateTime, dan memprosesnya dengan logik perniagaan, objek itu masih dimiliki ke zon waktu UTC+ 8, ZoneId=Asia/Shanghai yang sepadan, apabila ia perlu dikembalikan ke bahagian hadapan, anda boleh menggunakan penyeri bersiri jackson tersuai untuk menukar LocalDateTime kepada zon waktu sasaran pengguna sebelum menukarnya kepada 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())));
		};
	}
}

Kod contoh di atas menetapkan zon waktu pengguna ZoneId=Africa/Sao_Tome, dan menyesuaikan LocalDateTime deserializer Apabila menggunakan anotasi ResquestBody, nilai atribut LocalDateTime dalam objek juga akan ditukar kepada UTC+8 The. zon waktu boleh disimpan terus ke pangkalan data tanpa pemprosesan tambahan.

4. SpringBoot menerima parameter masa dan memproses zon waktu dengan cara yang bersatu

Selain menerima parameter melalui anotasi ResquestBody seperti yang dinyatakan di atas, ia juga mungkin untuk menerima objek LocalDateTime melalui Dapatkan atau Siarkan parameter. Pada masa ini kita perlu Menyesuaikan Penukar untuk memproses penukaran String kepada LocalDateTime, dan pada masa yang sama menukar objek yang diserahkan oleh pengguna yang tergolong dalam zon waktu pengguna kepada objek zon waktu UTC+8.

rreeee

Atas ialah kandungan terperinci Bagaimanakah SpringBoot memaparkan masa secara dinamik berdasarkan zon waktu sistem pengguna?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam