วิธีตั้งค่า JVM TimeZone ให้ถูกต้อง


141

ฉันพยายามเรียกใช้โปรแกรม Java แต่ใช้เขตเวลา GMT เป็นค่าเริ่มต้นแทนที่จะเป็นเขตเวลาที่กำหนดโดยระบบปฏิบัติการ รุ่น JDK ของฉันคือ 1.5 และระบบปฏิบัติการคือ Windows Server Enterprise (2007)

Windows ระบุเขตเวลาส่วนกลาง แต่เมื่อฉันเรียกใช้โปรแกรมต่อไปนี้จะให้เวลา GMT แก่ฉัน

import java.util.Calendar;

public class DateTest
{
    public static void main(String[] args)
    {
        Calendar now = Calendar.getInstance();
        System.out.println(now.getTimeZone());
        System.out.println(now.getTime());
    }
}

นี่คือผลลัพธ์

sun.util.calendar.ZoneInfo[id="GMT",
offset=0,
dstSavings=0,
useDaylight=false,
transitions=0,
lastRule=null]
Mon Mar 22 13:46:45 GMT 2010

โปรดทราบว่าฉันไม่ต้องการตั้งค่าเขตเวลาจากแอปพลิเคชัน ฉันต้องการให้เขตเวลาที่ใช้โดย JVM ควรเป็นเขตที่ระบุในระบบปฏิบัติการ (ฉันไม่พบปัญหานี้กับเซิร์ฟเวอร์อื่น ๆ ที่มีรุ่น 1.4 ของ JDK และ Microsoft Server 2003)

ความคิดใด ๆ ที่จะได้รับการชื่นชมอย่างมาก


1
หืมนั่นแปลก ดูเหมือนว่าข้อบกพร่อง JVM / OS หรือการกำหนดค่าผิดพลาดแปลก ๆ
Michael Borgwardt

คุณเรียกDateTestชั้นเรียนอย่างไร
matt b

@matt b: ฉันกำลังรวบรวมและเรียก DateTest จากพรอมต์คำสั่งของ windows แต่นี่เป็นเพียงชั้นทดสอบ ปัญหาเดิมเกิดขึ้นกับกระบวนการ ETL บางอย่างสำหรับเซิร์ฟเวอร์ IBM cognos
Kushal Paudyal

1
แค่อยากจะออกกฎเปิดตัวผ่านเชลล์สคริปต์ / ชุดที่อาจจะมีการส่งผ่านไปตาม-Duser.timezoneค่า
ด้านข

คำตอบ:


220

คุณสามารถผ่าน JVM พารามิเตอร์นี้

-Duser.timezone

ตัวอย่างเช่น

-Duser.timezone=Europe/Sofia

และสิ่งนี้ควรทำเคล็ดลับ การตั้งค่าตัวแปรสภาพแวดล้อม TZ ยังทำเคล็ดลับบน Linux


เราต้องใช้เครื่องมือปรับปรุงเขตเวลา JDK DST - 1.3.25 (tzupdater) แล้วเปลี่ยนพารามิเตอร์ JVM ตามที่คุณแนะนำและในที่สุดเราก็สามารถแก้ไขปัญหาได้ ยังไงก็ตาม Windows จะเก็บข้อมูลเขตเวลาไว้ในรีจิสทรีบางตัว ตัวอัปเดตที่ฉันใช้อัปเดตค่ารีจิสตรีด้วย
Kushal Paudyal

1
ฉันพยายามที่จะเริ่มต้น JVM ของฉันโดยใช้พารามิเตอร์นี้ แต่ดูเหมือนว่าจะไม่มีการเปลี่ยนแปลง ... ถ้าฉันต้องการที่จะเริ่มต้นใน UTC สิ่งที่ฉันจะใช้เป็นพารามิเตอร์!?
rafa.ferreira

ในแอปพลิเคชันของฉันฉันกำลังเปลี่ยนสถานที่บางแห่งและรับเขตเวลาของสถานที่นั้นโดยใช้เขตเวลาที่ฉันกำลังดำเนินการเพิ่มเติม แต่เมื่อแอปพลิเคชันเริ่มต้นเป็นครั้งแรกฉันได้รับค่าที่ถูกต้อง เมื่อฉันเปลี่ยนเขตเวลาและตั้งค่าเขตเวลาใหม่เป็นเขตเวลาเริ่มต้นฉันไม่ได้รับค่าที่ถูกต้องปัญหาคืออะไร วิธีการเปลี่ยนเขตเวลาอย่างแน่นอนฉันกำลังเปลี่ยนเขตเวลาโดยใช้ TimeZone.setDefault (TimeZone.getTimeZone ("my_time_zone"));
Dray

2
รายชื่อของเขตเวลาสำหรับ TZ เป็นที่นี่: en.wikipedia.org/wiki/List_of_tz_database_time_zones การใช้ชื่อเขตเวลานั้นดีกว่าการชดเชยเนื่องจากจะจัดการกับการประหยัดเวลากลางวัน
Brian

65

คุณยังสามารถตั้งค่าเขตเวลาเริ่มต้นในรหัสของคุณโดยใช้รหัสต่อไปนี้

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

เป็นของคุณ

 TimeZone.setDefault(TimeZone.getTimeZone("Europe/Sofia"));

1
"โปรดทราบว่าฉันไม่ต้องการตั้งค่าเขตเวลาจากแอปพลิเคชัน"
AbVog

22

คำตอบที่ยอมรับข้างต้น:

-Duser.timezone="Europe/Sofia" 

ไม่ได้ผลสำหรับฉันอย่างแน่นอน ฉันสามารถเปลี่ยนเขตเวลาของฉันได้สำเร็จเมื่อฉันไม่ได้ใส่เครื่องหมายคำพูดรอบพารามิเตอร์:

-Duser.timezone=Europe/Sofia

2
ฉันเห็นด้วย. ฉันได้แก้ไขคำตอบดั้งเดิมเพื่อลบเครื่องหมายคำพูด
GaZ

1
ขึ้นอยู่กับเชลล์ที่ใช้
vadipp

10

ใน Windows 7 และ JDK6 ผมต้องเพิ่ม-Duser.timezone="Europe/Sofia"ไปJAVA_TOOL_OPTIONSตัวแปรระบบที่อยู่ภายใต้ "คอมพิวเตอร์ของฉัน => อสังหาริมทรัพย์ => การตั้งค่าตัวแปรระบบขั้นสูง => สิ่งแวดล้อม"

หากคุณมีชุดคุณสมบัติอื่นอยู่แล้วJAVA_TOOL_OPTIONSเพียงแค่เพิ่มช่องว่างแล้วใส่สตริงคุณสมบัติของคุณ


5

สองตัวเลือกที่ฉันไม่คิดว่าครอบคลุมในคำตอบอื่น:

หลีกเลี่ยงความต้องการ

สิ่งที่คุณทำเพื่อตั้งค่าเขตเวลาเริ่มต้นของ JVM เป็นเรื่องยากมากที่จะตรวจสอบให้แน่ใจว่าไม่มีใครตั้งค่าไว้แตกต่างกัน สามารถตั้งค่าได้ตลอดเวลาโดยไม่ต้องแจ้งให้ทราบล่วงหน้าจากส่วนอื่นของโปรแกรมของคุณหรือจากโปรแกรมอื่นที่ทำงานใน JVM เดียวกัน ดังนั้นในการดำเนินการเกี่ยวกับเวลาของคุณอย่างชัดเจนเกี่ยวกับเขตเวลาที่คุณต้องการและคุณจะรู้ว่าคุณได้รับการตั้งค่า JVM เป็นอิสระ ตัวอย่าง:

    System.out.println(ZonedDateTime.now(ZoneId.of("Asia/Dushanbe")));

ตัวอย่างผลลัพธ์:

2018-10-11T14: 59: 16.742020 + 05: 00 [เอเชีย / ชานเบ]

System.setProperty

เพื่อวัตถุประสงค์หลายประการสิ่งต่อไปนี้จะไม่เป็นวิธีที่แนะนำและสามารถนำไปใช้ในทางที่ผิดได้ สำหรับโปรแกรม“ ทิ้ง” บางครั้งฉันคิดว่ามันใช้ได้จริง คุณยังสามารถตั้งค่าคุณสมบัติระบบจากภายใน Java:

    System.setProperty("user.timezone", "Australia/Tasmania");
    System.out.println(ZonedDateTime.now());

นี่เพิ่งพิมพ์:

2018-10-11T21: 03: 12.218959 + 11: 00 [ออสเตรเลีย / แทสเมเนีย]

หากคุณต้องการการตรวจสอบความถูกต้องของสตริงที่คุณกำลังใช้ให้ใช้:

        System.setProperty("user.timezone", ZoneId.of("Australia/Tasmania").getId());


0

ใน win7 หากคุณต้องการตั้งค่าเขตเวลาที่ถูกต้องเป็นพารามิเตอร์ใน JRE คุณต้องแก้ไขไฟล์ที่deployment.propertiesเก็บไว้ในพา ธ ที่c:\users\%username%\appdata\locallow\sun\java\deploymentเพิ่มสตริงdeployment.javaws.jre.1.args=-Duser.timezone\=my_time_zone


ฉันลองแล้วไม่ทำงาน (jvm ดำเนินการจากภายใน intellij)
kumetix
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.