2017-11-15 26 views
5

Có hướng dẫn giới hạn cho các thủ tục được lưu trữ CosmosDB và việc xử lý của chúng là new Date() và so sánh ngày tháng.Tạo và so sánh ngày tháng bên trong các thủ tục được lưu trữ của CosmosDB

Mã sau là một thủ tục được lưu trữ CosmosDB để 'cố định' việc ghi tài liệu sau một thời gian nhất định. Thuộc tính currentDoc.FreezeDate có định dạng ISO-8601, ví dụ: '2017-11-15T13: 34: 04Z'.

Lưu ý: đây là ví dụ về tình huống tôi đang cố hiểu. Nó không phải là mã sản xuất.

function tryUpdate(newDoc) { 
    __.queryDocuments(
    __.getSelfLink(), 
    { /* query to fetch the document */ }, 
    (error, results) => { 
     var currentDoc = results[0]; // doc from the database 
     // fail if the document is still locked 
     if (new Date(currentDoc.FreezeDate) < new Date()) { 
     getContext().getResponse().setBody({ success: false }); 
     return; 
     } 
     // else update the document 
     /* snip */ 
    } 
); 
} 

Câu hỏi của tôi là: trong vòng CosmosDB thủ tục lưu trữ, được new Date() bị ảnh hưởng bởi các múi giờ, đặc biệt là cho rằng cơ sở dữ liệu có thể nằm trong một khu vực khác với mã cách gọi? Mã so sánh ngày ở đây có hợp lệ trong mọi tình huống không?

Trả lời

1

Theo như tôi thấy, CosmosDB đang lưu trữ các giá trị DateTime mà không có Múi giờ tương ứng, hay còn gọi là. không phải là DateTimeOffset. Điều này có nghĩa nó không phải vấn đề nơi mã được thực thi, vì nó luôn luôn là bình thường để một cái gì đó như thế này:

"2014-09-15T23:14:25.7251173Z" 

Javascript ngày đối tượng là timestamps - họ chỉ đơn thuần chứa một số mili giây kể từ khi kỷ nguyên. Không có thông tin múi giờ trong đối tượng Ngày tháng. Ngày lịch (ngày, phút, giây) dấu thời gian này đại diện cho vấn đề giải thích (một trong những ... Phương thức String).

(lấy từ Parse date without timezone javascript)

Nói cách khác, bất kể bạn đang ở đâu trên thế giới, new Date() sẽ luôn có cùng giá trị trong nội bộ.

Nếu bạn muốn loại bỏ độ không đảm bảo để trao đổi về khả năng đọc, tôi khuyên bạn chỉ nên lưu giây hoặc mili giây từ thời đại (Thời gian Unix). Đây cũng là nội dung được sử dụng trong nội bộ theo ngày (new Date().value - mili giây). Ngẫu nhiên, trường tài liệu vũ trụ nội bộ _ts cũng là dấu thời gian ở định dạng epoch.

Lưu ý rằng giá trị của new Date() có thể bằng cách tắt 'thời gian toàn cầu chính xác` sau một vài phút - Tôi không biết liệu Azure/Cosmos có đảm bảo một cửa sổ sai lệch nhất định hay không.

+0

Câu trả lời hay! Điều này đã đặt tâm trí của tôi để nghỉ ngơi. Thú vị trước khi nói về 'thời gian toàn cầu chính xác', quá. – Squiggle

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