2010-03-22 30 views
96

Tôi đang cố gắng chạy một chương trình Java, nhưng nó đang dùng múi giờ GMT mặc định thay vì múi giờ do OS xác định. Phiên bản JDK của tôi là 1.5 và hệ điều hành là Windows Server Enterprise (2007)Cách đặt múi giờ JVM đúng

Windows có múi giờ Trung tâm được chỉ định, nhưng khi tôi chạy chương trình sau, nó cho tôi thời gian 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()); 
    } 
} 

Đây là kết quả

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

Xin lưu ý rằng tôi không muốn thiết lập múi giờ từ ứng dụng. Tôi muốn rằng múi giờ được JVM sử dụng phải là múi giờ được chỉ định trong hệ điều hành. (Tôi không tìm thấy vấn đề này với các máy chủ khác có phiên bản 1.4 của JDK và Microsoft Server 2003).

Bất kỳ suy nghĩ nào cũng sẽ được đánh giá cao.

+1

Hm, đó là lạ. Có vẻ như lỗi JVM/OS hoặc một số cấu hình sai kỳ lạ. –

+0

Bạn gọi lớp 'DateTest' như thế nào? –

+0

@matt b: Tôi đang biên soạn và gọi DateTest từ cửa sổ lệnh nhắc. Nhưng đây chỉ là một lớp Test. Vấn đề ban đầu là với một số quy trình ETL cho máy chủ cognos của IBM. –

Trả lời

155

Bạn có thể vượt qua JVM param

-Duser.timezone 

này Ví dụ

-Duser.timezone=Europe/Sofia 

và điều này sẽ làm các trick. Đặt biến môi trường TZ cũng thực hiện thủ thuật trên Linux.

+0

Chúng tôi đã phải sử dụng Công cụ cập nhật múi giờ JDK DST - 1.3.25 (tzupdater) và sau đó thay đổi JVM tham số như bạn đã đề xuất và cuối cùng chúng tôi đã loại bỏ vấn đề. Nhân tiện, thông tin múi giờ được Windows lưu trữ trong một số đăng ký. Trình cập nhật tôi đã sử dụng cũng cập nhật các giá trị đăng ký. –

+1

Tôi đang cố gắng khởi động JVM bằng cách sử dụng tham số này, nhưng dường như không có thay đổi ... Nếu tôi muốn bắt đầu trên UTC, tôi sẽ sử dụng tham số nào? –

+4

Hãy thử java -Duser.timezone = GMT ... –

21

Câu trả lời được chấp nhận trên:

-Duser.timezone="Europe/Sofia" 

Không làm việc cho tôi chính xác. Tôi chỉ có thể thay đổi thành công múi giờ của tôi khi tôi không có dấu ngoặc kép quanh các thông số:

-Duser.timezone=Europe/Sofia 
+2

Tôi đồng ý. Tôi đã chỉnh sửa câu trả lời gốc để xóa dấu ngoặc kép. – GaZ

0

Trong win7, nếu bạn muốn thiết lập múi giờ đúng như một tham số trong JRE, bạn phải chỉnh sửa file deployment.properties lưu trữ trong con đường c:\users\%username%\appdata\locallow\sun\java\deployment thêm chuỗi deployment.javaws.jre.1.args=-Duser.timezone\=my_time_zone

+0

Tôi đã thử nó và nó không hoạt động (jvm được thực hiện từ bên trong intellij) – kumetix

+0

@Dave Không phải lúc làm việc .... –

9

trên cửa sổ 7 và cho JDK6, tôi đã có thêm -Duser.timezone="Europe/Sofia" vào biến JAVA_TOOL_OPTIONS hệ thống nằm dưới "My computer => Properties => hệ thống Advanced Settings => Environment Variables ".

Nếu bạn đã có một số thuộc tính khác được đặt cho JAVA_TOOL_OPTIONS chỉ cần thêm một khoảng trắng và sau đó chèn chuỗi thuộc tính của bạn.

2

Nếu bạn đang sử dụng Maven:

mvn -Dexec.args="-Duser.timezone=Europe/Sofia ....." 
31

Bạn cũng có thể đặt múi giờ mặc định trong mã của bạn bằng cách sử dụng đoạn mã sau.

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

Để Yours

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

"Xin lưu ý rằng tôi không muốn đặt múi giờ từ ứng dụng." – AbVog

Các vấn đề liên quan