本文目錄一覽:
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-tw/n/235542.html