您好,登錄后才能下訂單哦!
本篇內容介紹了“jvm中指定時區信息user.timezone問題如何解決”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
同一份程序使用時間LocalDateTime類型,在國內和國外部署后,返回的時間信息前端使用出問題。 因為LocalDateTime不帶時區信息,國內調用后,前端頁面默認使用的瀏覽器所在os的時區(我們的系統中沒有給用戶設置時區), 因此會出現時間不一致, 或者判斷超時了,但是實際上沒有超時的問題。
要么返回timestamp數字類型,前端自己解析。 缺點:直接使用api的同事不方便看操作時間信息。
用戶可以可以在個的profile中設置時區,方便各個時區用戶在一個系統中操作。 缺點:改動較多。
最后的折中方法:
后端內部使用ZonedDateTime,返回的時間中帶上時區信息。 備注:這里應用系統沒有使用數據庫,因為沒有使用數據庫時間格式。
這里遇到一個問題,國內機器都是時區為
springboot 程序啟動后,ZoneDateTime 格式默認是"2023-02-16T21:44:31.914407+08:00";
但是國外的機器不行,依然不帶時區信息。
在jvm啟動參數中指定時區信息
國內啟動不指定時間,os默認的是"Asia/Shanghai"。 國外的啟動參數指定為-Duser.timezone=CET
示意:(這里是示意,省略其他參數,實際參數要跟多)
Java -jar -Dspring.profiles.active=dev -Duser.timezone=CET app.jar
1,ObjectMapper中設置時區和時間格式
ObjectMapper mapper = new ObjectMapper(); mapper.findAndRegisterModules(); mapper.setTimeZone(TimeZone.getDefault()); // 在本項目必須有這樣,某則有些接口中返回的ZonedDateTime序列化后不帶時區信息,添加這行就會帶上時區信息 mapper.registerModule(new JodaModule()); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); return mapper;
2, 其他區地方解析返回的時間
引入依賴包
<dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.12.2</version> </dependency>
import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ").withZoneUTC(); // String str = "2022-02-16T21:44:31.914407+08:00"; String str = "2022-02-17T14:35:48.8932+08:00"; //String str = "2022-02-16T21:44:31+09:00"; DateTime dateTime = formatter.parseDateTime(str); log.info("dateTime:{}", dateTime); String strAgain = dateTime.toString(formatter); log.info("strAgain:{}", strAgain);
“jvm中指定時區信息user.timezone問題如何解決”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。