2009-07-15 23 views
5

Tôi đang xem ý tưởng về một dự án Java phát hiện khi đồng hồ máy tính bị thay đổi. Ý tưởng là ghi lại ngày tháng và thời gian trên đồng hồ máy tính và lưu trữ nó trong một tập tin. Sau đó tôi muốn có thể chạy các quy tắc trên nó cho thấy một thông báo nếu đồng hồ đã được thay đổi. Tôi cũng đang xem xét các quy tắc kết hợp như "Cho phép thay đổi không quá 5 phút". Điều này cho phép thuận tiện thay đổi thời gian theo phút lẻ.Phát hiện xem đồng hồ hệ thống có thay đổi không?

Tôi cũng cần kết hợp các thay đổi mà đồng hồ tạo ra. Ví dụ: đi tiếp một giờ hoặc quay lại một giờ vào những thời điểm nhất định trong năm (Giờ Anh).

Tôi không chắc liệu đã có một hệ thống Java thực hiện điều này mà tôi có thể xem nhưng tôi thực sự không biết bắt đầu từ đâu.

+1

Tôi đề nghị bạn thay đổi tiêu đề để có ý nghĩa hơn ... một cái gì đó như "phát hiện khi thay đổi đồng hồ hệ thống". –

+0

Tôi nghĩ rằng OP là đề cập đến "thời gian thay đổi" như một cái gì đó bên ngoài hành vi đồng hồ bình thường. Khi đồng hồ hệ thống được cập nhật theo cách thủ công để chuyển tiếp hoặc lùi đáng kể bởi người dùng hoặc quản trị viên máy tính hoặc bằng cách tự động đồng bộ hóa với thời gian mạng. –

Trả lời

0

Đầu tiên: Đồng hồ thay đổi thường xuyên. Hãy thử sử dụng java.util.Timer để cập nhật. Lịch là dành cho hệ thống thời gian của bạn.

http://java.sun.com/javase/6/docs/api/ là bạn của bạn trong này.

Bắt đầu nhỏ, mỗi lần một bước. Đó là lời khuyên của tôi.

0

Một nơi tốt để sử dụng thư viện Joda time. Về lý thuyết, bạn chỉ cần kiểm tra xem múi giờ địa phương đã di chuyển giữa trạng thái DST và không DST hay chưa - nếu bạn không muốn kiểm tra các thay đổi giờ địa phương.

1

Java nhận tất cả thông tin về thời gian/ngày từ đồng hồ hệ thống, vì vậy không có cách nào để biết liệu đồng hồ hệ thống cơ bản đã bị thay đổi chưa. Nếu bạn lấy ngày và thời gian và lưu trữ nó trong một tập tin - nó sẽ phát hiện xem thời gian đã được thiết lập chưa (tức là - thời gian trong tập tin sau thời gian hiện tại, và không có DST xảy ra) - nhưng nó không thể phát hiện nếu thời gian đã được đặt trước (tức là - thời gian trong tệp là 2 giờ trước thời gian hiện tại - có 2 giờ thực sự trôi qua hoặc có người dùng đặt đồng hồ trước 2 giờ trong khi chương trình không chạy?). Cách duy nhất bạn có thể làm một cái gì đó như thế này là sử dụng một Time Server được biết đến, và thay vì tiết kiệm thời gian trong tệp, hãy lưu độ lệch giữa máy chủ thời gian và đồng hồ hệ thống cục bộ.

1

Nếu bạn có thể dựa vào sự hiện diện của kết nối mạng, bạn có thể so sánh thời gian với thời gian từ máy chủ thời gian internet (CBATG).

Chỉ cần chuyển đổi giờ địa phương và thời gian tìm nạp thành cùng múi giờ và lưu sự khác biệt. Nếu sự khác biệt thay đổi nhiều hơn số lượng được phép trong 5 phút, bạn biết nó đã được sửa đổi.

0

Tôi chưa thử điều này, nhưng nó có thể hoạt động để có một chuỗi nền khởi động mỗi phút một lần, nhận được thời gian hiện tại và so sánh nó với những gì nó thấy lần cuối. Về mặt lý thuyết, sự khác biệt phải rất gần một phút. Nếu nó khác nhiều, điều đó có nghĩa là đồng hồ đã thay đổi.

0

Nếu tôi hiểu câu hỏi của bạn đúng, thì những gì bạn đang cố gắng giả định ban đầu, đồng hồ hệ thống ở trạng thái tối ưu. Sau đó, sau mỗi phút bạn truy xuất mục nhập cuối cùng trong tệp (tệp cuối cùng hoặc đầu tiên, bất kỳ phương thức nào bạn chọn) và đảm bảo rằng sự khác biệt giữa hai lần là 60 giây hoặc bất kỳ khoảng thời gian nào khác bạn chọn.

Ví dụ: Vào lúc 0, bạn đặt trong file 12:00:00 Lúc 1, bạn so sánh 00:01:00 (mà bạn lấy từ đồng hồ hệ thống) với 00:00:00 (mà bạn lấy từ tập tin) và thấy rằng nó là alright và ghi nó vào tập tin. ... Tại một thời điểm n, bạn so sánh xx: yy: zz có sự khác biệt với mục nhập cuối cùng không phải là 60 giây, do đó, một thay đổi đã được phát hiện. ...

Tôi tin rằng các quy tắc bạn đang nói đến liên quan đến mục nhập cuối cùng từ tệp và so sánh với thời gian hiện tại bạn đã truy xuất từ ​​đồng hồ hệ thống. Có hay không đây là một phương pháp tốt tuy nhiên, là đáng tranh cãi.

0

Bạn dường như được yêu cầu hai điều rất khác nhau:

  • Khi một người dùng hoặc hệ thống quản trị gây ra đồng hồ của máy tính phải được điều chỉnh hoặc điều chỉnh đến một thời điểm nhất định (hoặc để thiết lập cho đúng hiện tại ngày giờ hoặc ngày khác trong tương lai/trong tương lai cho mục đích kiểm tra hoặc bất chính).
  • Khi giờ phút được hiển thị thay đổi cho một sự kiện như Daylight Saving Time (DST).

Clock thao tác

Đối với người đầu tiên, không có cách nào đơn giản tốt để làm điều đó. Đôi khi bạn có thể lấy mẫu ngày giờ hiện tại, ghi lại, sau đó lấy mẫu lại sau. Bạn sẽ làm điều này trong UTC để tránh nhầm lẫn các thay đổi mùa thu DST khi thay đổi người dùng/sysadmin.

Mã mẫu sử dụng các lớp java.time. Tránh các lớp non-java.time đã lỗi thời cũ vì chúng được thiết kế kém, gây nhầm lẫn và phiền hà.

Instant now1 = Instant.now(); // Record, run again, compare. 
String now1AsString = now1.toString(); // Ex: 2011-12-03T10:15:30.724Z 
… 
Instant now2 = Instant.now(); 
Boolean timeWentBackwards = now2.isBefore(now1); 

Tất nhiên bạn không thể sử dụng kỹ thuật này để điều chỉnh trong tương lai, chỉ trong quá khứ. Đồng hồ luôn chuyển sang tương lai.

Cách đáng tin cậy duy nhất để phát hiện tình trạng molestation của đồng hồ là có nhiều hơn một đồng hồ. Bạn cần có quyền truy cập đáng tin cậy (kết nối) vào một đồng hồ đáng tin cậy, có thể là máy chủ thời gian trên mạng của bạn hoặc máy chủ thời gian trên Internet. Thậm chí sau đó, chỉ có một cặp đồng hồ có thể khó khăn. Như câu ngạn ngữ biển xa xưa nói, "Mang theo một chiếc la bàn, hoặc ba."

DST roll-overs

Phát hiện thay đổi DST không liên quan. Thực hành tốt nhất trong việc xử lý ngày giờ là làm việc trong UTC. Điều này bao gồm hầu hết logic kinh doanh, lưu trữ dữ liệu và trao đổi dữ liệu của bạn.

Hãy nhớ: Thời gian trong ngày lăn tiến hoặc lùi với DST là vô nghĩa - thời gian tiếp tục chảy, không bị cong, với cùng số giây trôi qua.

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