java夏令時問題解決,java夏令時問題解決

本文目錄一覽:

java中utc時間怎麼轉換為本地時間

百度本來就有的回答。。。。

若要將 UTC 轉換為本地時間,請按照下列步驟操作:

確定您的本地時間偏移量,從 UTC 時間。為此請 Microsoft 基於 Windows 的計算機上按照下列步驟操作:

單擊 開始,單擊 運行,鍵入 timedate.cpl,然後單擊 確定。

單擊 時區 選項卡,然後驗證選中了您的本地時區。 如果不選擇您的本地時區,則請在可用的時區的列表中單擊它。

在每個本地區域列表項開始時顯示本地時間偏移量。例如對於-5: 00 是本地時間偏移量為東部時間 (美國和加拿大):

(GMT-5:00) 東部時間 (美國和加拿大)

添加本地時間偏移量為 UTC 時間。

例如您的本地時間偏移量是-5: 00,然後如果 UTC 時間顯示為 11: 00,添加-5 到 11。偏移量的調整時該時間設置為 06: 00 (上午 6: 00)。

注意 該日期也採用 UTC 格式。例如您的本地時間偏移量是-8: 00,並且如果該文件的 UTC 時間顯示為 00: 00 (午夜 12: 00) 在星期一,調整後的時間是 16: 00 星期日 (下午 4: 00,星期日)。

調整為夏時制時間。

UTC 時間不以反映夏令時進行調整。 如果您的時區參與夏時制時間,添加當夏時制時間是有效的文件的偏移量調整時間的時間差別。例如對於如果在您的時區中的夏令時的標準時間提前一小時,將 1 小時的時間添加到偏移量調整時間。

如果您的本地時間使用 12 小時格式,請將 24 小時時間格式轉換為 12 小時時間格式。要在轉換請按照下列步驟操作,請執行以下操作:

如果偏移量調整的時間 12: 01 和 23: 59,(含) 之間,之間減去 12 從在調整後的時間,然後將附加 下午

如果已調整的時間介於 00: 01 和 11: 59,(含) 之間,留在調整後的時間為是,然後將附加 上午

如果已調整的時間 00: 00,則使用 午夜 12: 00。

如果已調整的時間 12: 00,使用 中午 12: 00。

此內容轉的,出處:

如何在linux下 使用java代碼正確獲取夏令時的時間

一:環境搭建

OpenOffice 下載地址

下載地址

解壓後將目錄下的所有jar包放在工程的lib下面或者採用引用的方式調用這些jar包。

下載後安裝,我安裝的路徑為D:/openOffice/install/

二:啟動服務

可以通過cmd調用服務, ” cd D:/openOffice/install/program”

執行

soffice -headless -accept=”socket,host=127.0.0.1,port=8100;urp;” -nofirststartwizard

查看是否安裝成功,查看端口對應的pid

netstat -ano|findstr 8100

查看pid對應的服務程序名

tasklist|findstr pid值

也可以把這一步省略,放到java程序中調用服務,因為啟動服務佔用內存比較大,在java中可以在使用

的時候調用,然後馬上銷毀。

三:程序代碼

1:將word轉換為pdf方法

1 // 將word格式的文件轉換為pdf格式

2 public void Word2Pdf(String srcPath, String desPath) throws IOException {

3 // 源文件目錄

4 File inputFile = new File(srcPath);

5 if (!inputFile.exists()) {

6 System.out.println(“源文件不存在!”);

7 return;

8 }

9 // 輸出文件目錄

10 File outputFile = new File(desPath);

11 if (!outputFile.getParentFile().exists()) {

12 outputFile.getParentFile().exists();

13 }

14 // 調用openoffice服務線程

15 String command = “D:/openOffice/install/program/soffice.exe -headless -accept=\”socket,host=127.0.0.1,port=8100;urp;\””;

16 Process p = Runtime.getRuntime().exec(command);

17

18 // 連接openoffice服務

19 OpenOfficeConnection connection = new SocketOpenOfficeConnection(

20 “127.0.0.1”, 8100);

21 connection.connect();

22

23 // 轉換word到pdf

24 DocumentConverter converter = new OpenOfficeDocumentConverter(

25 connection);

26 converter.convert(inputFile, outputFile);

27

28 // 關閉連接

29 connection.disconnect();

30

31 // 關閉進程

32 p.destroy();

33 System.out.println(“轉換完成!”);

34 }

2:調用方法

1 @Test

2 public void testWord2Pdf() throws IOException {

3 String srcPath = “E:/test.docx”;

4 String desPath = “E:/test.pdf”;

5 Word2Pdf(srcPath, desPath);

6 }

以上代碼經過驗證,可以正常運行。

四:遇到問題

錯誤信息:

java.net.ConnectException: connection failed: socket,host=10.101.50.71,port=8100,tcpNoDelay=1: java.net.ConnectException: Connection refused: connect

at com.artofsolving.jodconverter.openoffice.connection.AbstractOpenOfficeConnection.connect(AbstractOpenOfficeConnection.java:79)

原因以及解決方法:第一次調用,soffice需要註冊,所以到soffice.exe的安裝路徑下雙擊soffice.exe,註冊即可。

java中獲取的系統時間和電腦上顯示的差兩分鐘,是什麼原因

你確認一下,服務器是否在當前的機器上,如果是,一般不會出現誤差;又或許,你在或許當前時間後,業務邏輯處理需要進行兩分鐘,因此出現兩分鐘的誤差。你自己排查一下

時區的坑,不想再踩了

最近在使用date命令時,發現表示東8區(中國時區)要使用 GMT-8 ,但在Java中卻需要使用 GMT+8 ,如下:

而在Java中,如下:

這就讓人有點迷糊了,經過一段時間搜索,發現在時區表達形式上還有不少知識點呢!

眾所周知,為了方便各地區本地時間之間的轉換,人們將全球劃分為了24個時區,以格林尼治天文台(GMT)為零時區,往東西兩個方向分別有12個時區,所以自然有了以GMT為前綴的時區表示法,如下:

GMT+8 表示東8區,中國就是使用這個時區,而 GMT-8 表示西8區,如果格林尼治天文台的本地時間是2022-03-19的0點,那麼 GMT+8 地區的本地時間就是2022-03-19的8點,而 GMT-8 的本地時間就是往前8小時,即2022-03-18的16點。

注意,上面的各地區本地時間的表述雖然不同,但它們實際是同一個時刻(絕對時間),要理解本地時間與絕對時間的區別。

GMT+8 正是Java中支持的時區表示法,那為啥Linux中卻是 GMT-8 呢?實際上Linux中的 GMT-8 也可以寫成 Etc/GMT-8 ,這才是它的標準名稱,如下:

可以發現用 Etc/GMT-8 的話,Linux與Java的輸出都是一樣的了,是的, Etc/GMT-8 也是一種類似 GMT+8 的時區表示機制,只不過它的 +- 號是反的。

Ok,雖然上面的差異弄清楚了,但時區的表示形式還沒有介紹完,接着往下看…

除了 GMT+8 表示方式外,我們還經常會看到 UTC+8 這樣的表示方式,這是UTC時區表示法。

即生GMT何生UTC?這是由於GMT是以格林尼治天文台為時間基準,但地球不是完美球體且自轉速度在變慢,所以地球自轉速度並不均勻,這導致以格林尼治天文台為時間基準是不準的。

為了更準確度量時間,科學家們發明了UTC時間,以銫原子躍遷次數來度量時間,比GMT時間更準確,為了保證GMT的準確性,每隔幾年GMT時間會做一次調整,以與UTC時間對齊。

因此,既然有了更準確的UTC,那麼就有了以UTC為前綴的時區表示法,如中國時區可使用 UTC+8 。

各時區偏移量表示法一覽表,如下:

除了用偏移量來表示時區,為了方便,人們還按區域/城市的方式來定義時區,如 Asia/Shanghai , Asia/Hong_Kong 都表示東8區,具體有哪些城市命名的時區,可以在時區數據庫中查看。

另外,為了簡化區域時區表示法,又定義了一套時區縮寫,如CST是中國時區 China Standard Time 的縮寫,可以在時區縮寫中查看各種縮寫定義。

注意,一般都不建議使用時區縮寫,因為時區縮寫的命名經常會重複,比如CST是 Central Standard Time (北美中部標準時間UTC -6)、 China Standard Time (中國標準時間UTC +8)、 Cuba Standard Time (古巴標準時間UTC -5)。

由於不同軟件對CST的解釋可能不同,導致會出現時間相差13或14個小時的情況,這在Java搭配MySQL時經常出現,我還專門寫了一篇文章mysql的timestamp會存在時區問題?,對於一定要使用時區縮寫的場景,可以使用香港時區縮寫 HKT ,它不重複且和上海處於同一個時區。

在Java中和時區相關的類有TimeZone、ZoneId,其中TimeZone是老的時區類,而ZoneId是新的時區類,它有ZoneOffset和ZoneRegion兩個子類,分別代表偏移量表示法和區域表示法。

那它們都支持上述的哪些時區寫法呢?寫個Demo驗證一下,如下:

輸出如下:

雖然偏移量表示法與區域表示法都可以表示時區,但由於夏令時的存在,它們並不完全等同。

夏令時(Daylight Saving Time: DST),也叫 夏時制,是指為了節約能源,在天亮的早的夏季,人為將時間調快一小時,以充分利用光照資源,節約照明用電。

而中國在 1986 年至 1991 年也實行過夏令時,在1986~1991的每年從四月中旬第一個星期日的凌晨2時整(北京時間),將時鐘撥快一小時,即將錶針由2時撥至3時,夏令時開始;到九月中旬第一個星期日的凌晨2時整(北京夏令時),再將時鐘撥回一小時,即將錶針由2時撥至1時,夏令時結束。從1986年到1991年的六個年度,除1986年因是實行夏時制的第一年,從5月4日開始到9月14日結束外,其它年份均按規定的時段施行。

故會有下面看起來有點奇怪的現象:

為什麼 Asia/Shanghai 輸出為3點,而 GMT+8 輸出為2點呢?原因是 1986-05-04 02:00:00 這個時間點中國正開始實行夏令時,時鐘撥快了1小時。

而 GMT+8 為什麼輸出為2點呢?因為中國、馬來西亞、菲律賓、新加坡的時區都是 GMT+8 ,只有中國在實行夏令時,而在 GMT+8 中沒法感知到區域信息,那java只能以沒有實行夏令時的方法來計算本地時間了。

正是由於夏令時的存在,導致程序可能出現詭異的現象甚至bug,如下:

輸出如下:

為啥會這樣呢?原因是本地時間雖然看起來沒變,但 Asia/Shanghai 這個代表的時區卻發生了變化。

我們可以將上面 printZonedDateTime 中時間格式由 yyyy-MM-dd HH:mm:ss VV 修改為 yyyy-MM-dd HH:mm:ss VV xxx 再執行,發現輸出如下:

如上,夏令時導致 Asia/Shanghai 這個時區不一定是東8區了,也可能是東9區,故Java中,想將ZoneRegion轉換為ZoneOffset,需要傳遞一個instant時刻參數,如下:

夏令時真是一種自欺欺人的做法,還好中國從1991年後就沒再實行了!

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/235542.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 11:55
下一篇 2024-12-12 11:55

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Python官網中文版:解決你的編程問題

    Python是一種高級編程語言,它可以用於Web開發、科學計算、人工智能等領域。Python官網中文版提供了全面的資源和教程,可以幫助你入門學習和進一步提高編程技能。 一、Pyth…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • 如何解決WPS保存提示會導致宏不可用的問題

    如果您使用過WPS,可能會碰到在保存的時候提示“文件中含有宏,保存將導致宏不可用”的問題。這個問題是因為WPS在默認情況下不允許保存帶有宏的文件,為了解決這個問題,本篇文章將從多個…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29

發表回復

登錄後才能評論