2008-08-08 30 views
26

Tôi đang chạy một ứng dụng Tomcat và tôi cần hiển thị một số giá trị thời gian. Thật không may, thời gian là đến một giờ tắt. Tôi đã xem xét và phát hiện rằng TimeZone mặc định của tôi đang được đặt thành:Vùng thời gian Java bị rối loạn

sun.util.calendar.ZoneInfo[id="GMT-08:00", 
          offset=-28800000, 
          dstSavings=0, 
          useDaylight=false, 
          transitions=0, 
          lastRule=null] 

Thay vì múi giờ Thái Bình Dương. Điều này được chỉ rõ hơn khi tôi cố gắng in múi giờ mặc định là display name và nó xuất hiện "GMT-08: 00", điều này dường như chỉ ra rằng nó không được đặt chính xác theo múi giờ của Hoa Kỳ Thái Bình Dương. Tôi đang chạy trên Ubuntu Hardy Heron, được nâng cấp từ Gutsy Gibbon.

Có tệp cấu hình nào tôi có thể cập nhật để yêu cầu JRE sử dụng Thái Bình Dương với tất cả thông tin về thời gian tiết kiệm ánh sáng ban ngày liên quan không? Thời gian trên máy của tôi hiển thị chính xác, do đó, nó không có vẻ là một cấu hình sai trên toàn hệ điều hành.


Ok, đây là bản cập nhật. Một đồng nghiệp đề nghị tôi cập nhật JAVA_OPTS trong/etc/profile của tôi để bao gồm "-Duser.timezone = US/Pacific", hoạt động (tôi cũng thấy CATALINA_OPTS, mà tôi cũng cập nhật). Trên thực tế, tôi chỉ xuất chuyển đổi sang các biến thay vì sử dụng/etc/profile mới (khởi động lại sau sẽ nhận các thay đổi và tôi sẽ là vàng).

Tuy nhiên, tôi vẫn nghĩ rằng có giải pháp tốt hơn ... cần có cấu hình cho Java ở đâu đó cho biết múi giờ nào đang sử dụng hoặc cách lấy múi giờ. Nếu ai đó biết một thiết lập như vậy, điều đó sẽ rất tuyệt vời, nhưng bây giờ đây là một cách giải quyết tốt.


Tôi đang sử dụng 1,5 và chắc chắn đó là vấn đề DST nhất. Như bạn có thể thấy, múi giờ được đặt để không sử dụng tiết kiệm ánh sáng ban ngày. Niềm tin của tôi là nó thường được thiết lập để bù đắp -8 chứ không phải múi giờ Thái Bình Dương cụ thể. Vì chênh lệch chung -8 không có thông tin tiết kiệm ánh sáng ban ngày, nên dĩ nhiên là không sử dụng nó, nhưng câu hỏi đặt ra là, ở đâu tôi yêu cầu Java sử dụng múi giờ Thái Bình Dương khi nó khởi động? Tôi không tìm kiếm một giải pháp có lập trình, nó phải là một giải pháp cấu hình.

Trả lời

20

Đó là cách "quirk" theo cách JVM tra cứu tệp zoneinfo. Xem Bug ID 6456628.

Cách giải quyết dễ nhất là tạo/etc/localtime một liên kết tượng trưng đến tệp zoneinfo chính xác. Đối với giờ Thái Bình Dương, các lệnh sau sẽ hoạt động:

# sudo cp /etc/localtime /etc/localtime.dist 
# sudo ln -fs /usr/share/zoneinfo/America/Los_Angeles /etc/localtime 

Tôi chưa gặp bất kỳ vấn đề nào với cách tiếp cận liên kết tượng trưng.

Chỉnh sửa: Đã thêm "sudo" vào các lệnh.

+0

+1: Tôi vừa chạy vào máy chủ Ubuntu 9.10 được cập nhật đầy đủ này. Sun JDK 1.6.0_15-b03, Hệ thống được cấu hình tại thời điểm cài đặt cho múi giờ Hoa Kỳ/Đông./etc/localtime chứa nội dung giống nhau của/usr/share/zoneinfo/US/Eastern. Java tạo kết quả không chính xác cho các ngày từ ngày 15 tháng 3 năm 2010 đến ngày 25 tháng 4. Sau khi thay thế tệp bằng một liên kết tượng trưng đến/usr/share/zoneinfo/US/Eastern, bây giờ tôi nhận được kết quả chính xác. Tôi kinh ngạc lỗi này là a) vẫn mở, b) ảnh hưởng đến máy chủ Ubuntu được cập nhật đầy đủ (9.10 - Karmic). –

+0

Lỗi này được ghi chú là đã đóng trong phiên bản Java 7 (b72). – Raedwald

+0

Thay đổi/etc/localtime thành liên kết tượng trưng; bạn có thể mong đợi phá vỡ mọi thứ trong các hệ thống Linux hiện đại hơn (ví dụ, khi các gói được nâng cấp hoặc có thể khi khởi động - tôi nghi ngờ lý do thay đổi từ liên kết tượng trưng sang bản sao của tệp sẽ phải thực hiện với trình tự khởi động và phụ thuộc) đặc biệt nếu/usr/đang ở trên một hệ thống tập tin khác) Tôi thấy hữu ích hơn khi đặt biến môi trường TZ –

0

Có thể giúp kiểm tra lại các quy tắc múi giờ mà HĐH của bạn đang sử dụng.

/usr/bin/zdump -v /etc/localtime | less 

Tập tin này nên chứa quy tắc tiết kiệm ánh sáng ban ngày của bạn, như thế này cho năm 2080:

/etc/localtime Sun Mar 31 01:00:00 2080 UTC = Sun Mar 31 02:00:00 2080 BST isdst=1 gmtoff=3600 

Bạn có thể so sánh điều này với các quy tắc múi giờ bạn nghĩ rằng bạn nên sử dụng. Chúng có thể được tìm thấy trong /usr/share/zoneinfo/.

1

Tôi gặp sự cố tương tự, có thể là vấn đề tương tự. Tuy nhiên máy chủ tomcat của tôi chạy trên một cửa sổ hộp để giải pháp symlink sẽ không hoạt động.

Tôi đặt -Duser.timezone=Australia/Sydney trong số JAVA_OPTS tuy nhiên tomcat sẽ không nhận ra rằng DST có hiệu lực. Để giải quyết sự cố, tôi đã thay đổi Australia/Sydney (GMT + 10: 00) thành Pacific/Numea (GMT + 11: 00) để thời gian hiển thị chính xác tuy nhiên tôi rất muốn biết giải pháp hoặc lỗi thực tế, nếu có.

22

Trên Ubuntu, không đủ để chỉ thay đổi tệp/etc/localtime. Dường như nó cũng đọc tệp/etc/múi giờ. Tốt hơn là theo dõi instruction để đặt múi giờ chính xác. Đặc biệt, làm như sau:

$ sudo cp /etc/timezone /etc/timezone.dist 
$ echo "Australia/Adelaide" | sudo tee /etc/timezone 
Australia/Adelaide 
$ sudo dpkg-reconfigure --frontend noninteractive tzdata 

Current default time zone: 'Australia/Adelaide' 
Local time is now:  Sat May 8 21:19:24 CST 2010. 
Universal Time is now: Sat May 8 11:49:24 UTC 2010. 

On tôi Ubuntu, nếu/etc/localtime và/etc/múi giờ đều không phù hợp, Java dường như đọc múi giờ mặc định từ/etc/múi giờ.

+0

Hoạt động như một nét duyên dáng trên Ubuntu 10.0.4 LTS.Thật nào cũng đẹp hơn Tôi chỉ cần chạy sudo dpkg-reconfigure tzdata và có thể chọn múi giờ chính xác trong giao diện người dùng – msung

+0

dpkg-reconfigure tzdata chính xác là những gì tôi đang tìm kiếm Cảm ơn! –

+0

Chỉ gặp vấn đề này trong lubuntu 16.04 (gnome). – 7yl4r

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