Cách đặt JZ TimeZone đúng cách


141

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

Windows có múi giờ miền Trung được chỉ định, nhưng khi tôi chạy chương trình sau, nó sẽ 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à đầu ra

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 đặt múi giờ từ ứng dụng. Tôi muốn rằng múi giờ được sử dụng bởi JVM phải là múi giờ được chỉ định trong HĐH. (Tôi không tìm thấy sự cố 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ĩ sẽ được đánh giá cao.


1
Hừm, thật lạ. Trông giống như một lỗi JVM / OS hoặc một số cấu hình sai lạ.
Michael Borgwardt

bạn gọi DateTestlớp như thế nào?
matt b

@matt b: Tôi đang biên dịch và gọi DateTest từ dấu nhắc lệnh của windows. 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.
Kushal Paudyal

1
chỉ muốn loại trừ việc khởi chạy nó thông qua bất kỳ tập lệnh shell / batch nào có thể chuyển qua một -Duser.timezonegiá trị
matt b

Câu trả lời:


220

Bạn có thể vượt qua JVM thông số này

-Duser.timezone

Ví dụ

-Duser.timezone=Europe/Sofia

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


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 tham số JVM như bạn đề xuất và cuối cùng chúng tôi đã thoát khỏi vấn đề. Nhân tiện, thông tin múi giờ được Windows lưu trữ trong một số 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ý.
Kushal Paudyal

1
Tôi đang cố gắng khởi động JVM của mình bằ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!?
rafa.ferreira

Trong ứng dụng của mình, tôi đang thay đổi một số vị trí và nhận múi giờ của các vị trí đó. Sử dụng múi giờ tôi đang xử lý thêm. Nhưng khi ứng dụng bắt đầu lần đầu tiên, tôi nhận được các giá trị chính xác. Khi tôi thay đổi TimeZone và đặt múi giờ mới làm múi giờ mặc định, tôi không nhận được các giá trị chính xác. Vấn đề là gì? Cách thay đổi múi giờ chính xác. Tôi đang thay đổi múi giờ bằng TimeZone.setDefault (TimeZone.getTimeZone ("my_time_zone"));
Dray

2
Một danh sách các múi giờ cho TZ có ở đây: en.wikipedia.org/wiki/List_of_tz_database_time_zones . Sử dụng tên múi giờ tốt hơn so với bù vì nó sẽ xử lý tiết kiệm ánh sáng ban ngày.
Brian

65

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

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

Để bạn

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

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

22

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 mình khi tôi không có dấu ngoặc kép xung quanh các tham số:

-Duser.timezone=Europe/Sofia

2
Tôi đồng ý. Tôi đã chỉnh sửa câu trả lời ban đầu để loại bỏ các trích dẫn.
GaZ

1
Điều này phụ thuộc vào vỏ được sử dụng.
vadipp

10

Trên windows 7 và cho JDK6, tôi đã phải thêm -Duser.timezone="Europe/Sofia"vào biến hệ thống JAVA_TOOL_OPTIONS nằm trong "Máy tính của tôi => Thuộc tính => Cài đặt hệ thống nâng cao => Biến môi trường".

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


5

Hai tùy chọn mà tôi không nghĩ đã được đề cập trong các câu trả lời khác:

Tránh sự cần thiết

Dù bạn làm gì để đặt múi giờ mặc định của JVM, rất khó để đảm bảo rằng không ai khác đặt nó theo cách khác. Nó có thể được đặt bất cứ lúc nào mà không cần thông báo từ một phần khác trong chương trình của bạn hoặc từ một chương trình khác đang chạy trong cùng một JVM. Vì vậy, trong các hoạt động thời gian của bạn là rõ ràng về múi giờ bạn muốn và bạn sẽ luôn biết những gì bạn nhận được độc lập với cài đặt JVM. Thí dụ:

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

Ví dụ đầu ra:

2018-10-11T14: 59: 16.742020 + 05: 00 [Châu Á / Dushanbe]

System.setProperty

Đối với nhiều mục đích, sau đây sẽ không phải là cách ưa thích và chắc chắn nó có thể bị sử dụng sai. Đối với các chương trình ném đi, tôi đôi khi thấy nó thực tế. Bạn cũng có thể đặt thuộc tính hệ thống từ bên trong Java:

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

Điều này chỉ được in:

2018-10-11T21: 03: 12.218959 + 11: 00 [Úc / Tasmania]

Nếu bạn muốn xác thực chuỗi bạn đang truyền, hãy sử dụng:

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

4

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

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

mvn spring-boot:run -Drun.jvmArguments="-Duser.timezone=UTC"cho Spring Boot v1.
Chloe

0

Trong win7, nếu bạn muốn đặt múi giờ chính xác làm tham số trong JRE, bạn phải chỉnh sửa tệp deployment.propertiesđược lưu trữ trong đường dẫn c:\users\%username%\appdata\locallow\sun\java\deploymentthêm chuỗi deployment.javaws.jre.1.args=-Duser.timezone\=my_time_zone


Tôi đã thử nó và nó không hoạt động (jvm được thực hiện từ bên trong intellij)
kumetix
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.