Câu hỏi:
Làm thế nào để bạn bình thường hóa dấu thời gian phía máy khách trong javascript cho người dùng bị tắt đồng hồ máy tính bên trong? Lưu ý rằng tôi đang xử lý thời gian trong UTC.
Bối cảnh:
Tôi có một phiên bản AWS ElasticSearch được thiết lập với một số thao tác được xử lý theo đợt và được điều chỉnh trên đường đi, làm cho dấu thời gian phía máy chủ không đáng tin cậy (vì dữ liệu có thể không theo thứ tự và vấn đề thứ tự). Do đó, tôi cần phải làm cho dấu thời gian phía khách hàng của mình đáng tin cậy hơn.
Các ràng buộc:
Tôi không thể thực hiện bất kỳ yêu cầu nào phía máy chủ (cần giữ yêu cầu HTTP ở mức tối thiểu), nhưng tôi có thể bao gồm dấu thời gian phía máy chủ được tạo khi javascript của tôi được tải lần đầu tiên trên máy khách.
Giải pháp cố gắng:
Các biến được xác định bên ngoài:
serverTimestamp- dấu thời gian UTC (tính bằng mili giây), phía máy chủ được tạo khi javascript được tải.getCookie- một hàm nhận giá trị cookie cho một khóa đã cho (hoặc một chuỗi trống nếu không tìm thấy).
Cài đặt kiểm soát bộ nhớ cache cho tệp là "public,max-age=300,must-revalidate"(5 phút).
const getTimestamp = (function() {
// This cookie is set on the `unload` event, and so should be greater than
// the server-side timestamp when set.
/** @type {!number} */
const cookieTimestamp = parseInt(getCookie("timestamp_cookie"), 10) || 0;
// This timestamp _should_ be a maximum of 5 minutes behind on page load
// (cache lasts 5 min for this file).
/** @type {!number} */
const storedTimestamp = cookieTimestamp > serverTimestamp ?
cookieTimestamp : serverTimestamp;
return function () {
/** @type {!number} */
const timestamp = Date.now();
// This timestamp should be, at a *maximum*, 5-6 minutes behind
// (assuming the user doesn't have caching issues)
/** @type {!number} */
const backupTimestamp = storedTimestamp
+ parseFloat(window.performance.now().toFixed(0));
// Now let's check to see if the user's clock is
// either too fast, or too slow:
if (
// Timestamp is smaller than the stored one.
// This means the user's clock is too slow.
timestamp < backupTimestamp
// Timestamp is more than 6 minutes ahead. User's clock is too fast.
// (Using 6 minutes instead of 5 to have 1 minute of padding)
|| (timestamp - backupTimestamp) > 360000
) {
return backupTimestamp;
} else {
// Seems like the user's clock isn't too fast or too slow
// (or just maximum 1 minute fast)
return timestamp;
}
}
})();
Vấn đề với giải pháp:
Sử dụng getTimestampchức năng trên , việc chạy (new Date(getTimestamp())).getUTCDate()sẽ trở lại vào ngày hôm sau đối với một số người dùng và getUTCHoursdường như ở khắp mọi nơi trong các trường hợp cạnh. Tôi không thể tự chẩn đoán vấn đề.
<?php date_default_timezone_set('UTC'); $o = new StdClass; if(isset($_POST['get_time'])){ /* make sure AJAX get_time is set */ $o->time = time(); echo json_encode($o); /* now you have object with time property for javascript AJAX argument */ } ?>