2010-01-21 40 views
9

Tôi có một phiên bản Java dường như đang sử dụng múi giờ hoàn toàn không chính xác. Thay vì sử dụng múi giờ Úc/Sydney mà Windows đang sử dụng, nó đang sử dụng múi giờ America/Caracas.java múi giờ không chính xác

Trước hết, tôi đã kiểm tra thời gian Windows thông qua đồng hồ hệ thống, sau đó chọn HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ControlSet001, ControlSet002. Tất cả được đặt thành múi giờ Sydney.

Có ai biết nếu đây là lỗi trong Java, hoặc nếu nó đang đề cập đến một thời gian được đặt ở nơi khác?

phiên bản

Java là 1.6.0_06

+0

Trong những ngày rất cũ, tôi đã nhìn thấy một JVM nghĩ múi giờ "MET" trong OS/2 không phải là múi giờ Trung Âu mà là múi giờ Trung Đông. Đã cho tôi một thời gian để tìm ra lý do tại sao tất cả các ngày đã được 3,5 giờ tắt. –

Trả lời

11

Đảm bảo bạn thiết lập múi giờ cho JVM khi khởi động ứng dụng:

-Duser.timezone="Australia/Sydney" 
+0

Đã hy vọng cho một giải pháp thích hợp, nhưng cuối cùng đã đi với workaround này. –

+0

và nếu tôi muốn đặt thành UTC? –

+0

-Duser.timezone = "UTC" –

2

Cố gắng trong ứng dụng của bạn để có được múi giờ mặc định, hoặc thiết lập múi giờ bằng tay (dòng nhận xét).

nhỏ ví dụ của tôi:

import java.text.DateFormat; 
import java.util.Date; 
import java.util.Locale; 
import java.util.TimeZone; 

public class Main { 
    public static void main(String[] args) { 
     Locale locale = Locale.getDefault(); 
     TimeZone localTimeZone = TimeZone.getDefault(); 
     //TimeZone localTimeZone = TimeZone.getTimeZone("Australia/Sydney"); 
     DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, locale); 
     dateFormat.setTimeZone(localTimeZone); 
     Date rightNow = new Date(); 
     System.out.println(locale.toString() + ": " + dateFormat.format(rightNow)); 
    } 
} 
+0

Cảm ơn các bạn, tôi tự hỏi _why_ Tôi cần phải tự xác định múi giờ. Không nên giống như hệ điều hành? –

+0

BTW, mã ở trên trả về đúng ngôn ngữ, nhưng múi giờ không chính xác. –

+0

Nó nên được. Bạn có thể thử cập nhật Java lên phiên bản mới nhất, trong trường hợp có lỗi. – balent

2

Gần đây tôi đã gặp vấn đề tương tự, rõ ràng điều này là do sự mơ hồ về cách Windows đại diện cho các thiết lập múi giờ của nó trong sổ đăng ký và Java không giải thích đúng.

Thông tin chi tiết có thể được tìm thấy trong this article, mà cũng mô tả "chữa trị" cho các máy bị ảnh hưởng:

  • Thay đổi ngày/giờ bằng tay và sau đó thay đổi trở lại gốc thời gian chính xác.
  • Thay đổi múi giờ và sau đó quay lại vùng ban đầu.
  • Yêu cầu cập nhật thời gian tự động từ máy chủ thời gian.
+0

Chúng tôi đã gặp vấn đề tương tự với Java 7 sau khi nâng cấp lên Windows Server 2008. Thay đổi múi giờ của hệ thống và sau đó khôi phục nó đã khắc phục sự cố cho chúng tôi. –

0

Tôi đã gặp lỗi tương tự, trong khi tôi đã đặt múi giờ của mình thành Giờ chuẩn bán đảo Malay, JVM đã cho tôi múi giờ theo giờ Venezuela.

Việc sửa chữa sau làm việc cho tôi:

Trong trình soạn thảo registry, sửa múi giờ của bạn để múi giờ khác (Tôi đã cố gắng để đưa một văn bản như "Singapore Time" Bạn có thể tìm registry ở đây:.

HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/TimeZoneInformation

Và sau đó, tôi đặt lại múi giờ mong muốn bằng cách sử dụng Bảng điều khiển, Cài đặt ngày và giờ Khi tôi kiểm tra lại trình chỉnh sửa đăng ký, tôi có thể thấy nó được hoàn nguyên sang Giờ bán đảo Mã Lai và JVM của tôi đọc chính xác hiện nay...

1

Có lịch sử về các vấn đề như vậy đến và đi, và không có giải pháp hợp lý. Xem thêm tại đây: Java incorrect time zone bug on Windows

Chỉnh sửa: Trả lời Tom và francis: Tóm lại, thời gian chạy Java gặp khó khăn trong việc tìm kiếm chính xác múi giờ hiện tại trên máy tính.

Thông tin đăng ký Windows trên các múi giờ không đáng tin cậy và giống nhau đối với API cửa sổ gốc dựa trên msvcrt.dll và các msvcrxx.dll khác nhau. Ngoài ra còn có API được quản lý (.NET) yêu cầu cài đặt một phiên bản .NET Framework nhất định mâu thuẫn với tính di động của Java.

Vì vậy, nhà phát triển Java runtime có thời gian khó khăn với múi giờ hiện tại trên Windows và điều này có thể tiếp tục cho đến khi Microsoft có một số lý do hợp tác.

Nếu bạn muốn ứng dụng Java của bạn hoạt động chính xác trong bất kỳ múi giờ nào, hãy cung cấp cho người dùng khả năng sửa múi giờ thông qua GUI.

+0

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. – Tom

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