3 回答

TA貢獻(xiàn)1809條經(jīng)驗(yàn) 獲得超8個(gè)贊
假設(shè)您擁有 root 權(quán)限,這將更改 Linux 中的操作系統(tǒng)時(shí)區(qū):
import java.io.File;
import java.nio.file.Files;
import static java.nio.file.StandardCopyOption.COPY_ATTRIBUTES;
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;? ??
// ...
String zone = "Asia/Tokyo";
File source = new File("/usr/share/zoneinfo/" + zone);
File dest = new File("/etc/localtime");
Files.copy(source.toPath(), dest.toPath(), REPLACE_EXISTING, COPY_ATTRIBUTES);
請(qǐng)注意,更改操作系統(tǒng)默認(rèn)時(shí)區(qū)不會(huì)影響當(dāng)前進(jìn)程。另請(qǐng)注意,這不可移植。
創(chuàng)建符號(hào)鏈接可能會(huì)更好,但兩者都應(yīng)該有效。
要永久更改單個(gè)用戶的時(shí)區(qū),請(qǐng)export TZ='Asia/Tokyo'寫入啟動(dòng)腳本,例如.bashrc. 您不需要為此提升權(quán)限。

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超10個(gè)贊
JVM維護(hù)自己的默認(rèn)時(shí)區(qū),與主機(jī)操作系統(tǒng)時(shí)區(qū)設(shè)置無關(guān)。
大多數(shù) Java 實(shí)現(xiàn)在啟動(dòng)時(shí)都默認(rèn)使用主機(jī)操作系統(tǒng)當(dāng)前的默認(rèn)時(shí)區(qū)?;蛘?,您可以將參數(shù)傳遞給 JVM 啟動(dòng)程序以指定另一個(gè)時(shí)區(qū)。最后,調(diào)用TimeZone.setDefault
立即更改該 JVM 中運(yùn)行的所有應(yīng)用程序的所有線程中的所有代碼的當(dāng)前默認(rèn)時(shí)區(qū)。
我需要從 java 更改操作系統(tǒng)時(shí)區(qū)。
無法使用捆綁的 Java 類。據(jù)我所知,沒有任何 Java 實(shí)現(xiàn)能夠?yàn)?Java 應(yīng)用程序提供這種功能。
您也許能夠從 Java 中調(diào)用一些本機(jī)應(yīng)用程序或?qū)嵱贸绦颍@些應(yīng)用程序或?qū)嵱贸绦蚩赡軙?huì)更改主機(jī)操作系統(tǒng)時(shí)區(qū)設(shè)置。但您必須找到這樣的實(shí)用程序,并設(shè)置從 Java 到本機(jī)代碼的橋接調(diào)用?;蛘吣梢詧?zhí)行 shell 腳本來更改操作系統(tǒng)設(shè)置。
至于 Java 代碼中的日期時(shí)間處理,您不應(yīng)依賴主機(jī)操作系統(tǒng)或 JVM 的默認(rèn)時(shí)區(qū)。我建議始終將可選ZoneId
(或ZoneOffset
) 傳遞給各種日期時(shí)間方法。省略該參數(shù)會(huì)導(dǎo)致隱式依賴 JVM 當(dāng)前的默認(rèn)時(shí)區(qū)。最好指定您想要/預(yù)期的時(shí)區(qū)。
ZoneId?z?=?ZoneId.of(?"Africa/Tunis"?)?; ZonedDateTime?zdt?=?ZonedDateTime.now(?z?)?;
順便說一下,請(qǐng)注意Joda-Time項(xiàng)目現(xiàn)在處于維護(hù)模式。它的創(chuàng)建者 Stephen Colebourne 隨后在JSR 310 定義的java.time類中創(chuàng)建了它的后繼者,現(xiàn)在與 Java 8 及更高版本捆綁在一起。

TA貢獻(xiàn)1878條經(jīng)驗(yàn) 獲得超4個(gè)贊
這是可能的答案:
Calendar gmtTime = Calendar.getInstance(TimeZone.getTimeZone("GMT")); System.out.println(gmtTime.getTime());
添加回答
舉報(bào)