2008-11-03 42 views
5

Chúng tôi đã có một ứng dụng lập kế hoạch chạy mà gọi một dịch vụ WCF để chạy công việc hàng đêm. Một số lượng lớn trong số này bao gồm thông tin về ngày làm việc hiện tại. Vì lý do kinh doanh, máy chủ lập lịch biểu được đặt thành GMT, nhưng dịch vụ của chúng tôi đang chạy trên các máy chủ được đặt thành thời gian NY.Xử lý WCF Deserialization của các đối tượng DateTime

Điều này đặt ra một vấn đề; các ngày đang được chuyển tới dịch vụ .NET của chúng tôi với thông tin múi giờ rõ ràng. Vì vậy, khi dịch vụ yêu cầu ứng dụng chạy với ngày "2008-11-03 00:00:00 +0: 00", dịch vụ thông dịch là "2008-11-02 19:00:00 -5: 00 "và mọi thứ chạy sai ngày.

Hành vi của trình lập lịch biểu được mã hóa bên thứ ba và cứng, vì vậy chúng tôi không thể yêu cầu trình lập lịch bỏ qua bù trừ múi giờ. Chúng tôi không muốn luôn chuyển đổi ngày thành GMT vì có khả năng thực sự là các văn phòng Châu Á của chúng tôi sẽ gọi cùng một dịch vụ và chúng tôi sẽ quay trở lại cùng một vấn đề.

Có cách nào để gắn cờ DataContract hay thậm chí kiểm soát nó ở mức đủ thấp để đảm bảo Loại ngày giờ sẽ không được chỉ định? Hoặc là có một cách với một DateTime để xác định những gì các thông tin ban đầu được sử dụng để tạo ra nó và chuyển nó trở lại giá trị ban đầu trong một bước sau chế biến?

Nếu trợ giúp, ngay bây giờ hợp đồng của chúng tôi khá đơn giản. Phương thức lấy một tham số là một lớp bắt nguồn từ lớp bên dưới.

[DataContract] 
public class BaseTimeSensitiveParameters 
{ 
    [DataMember] public DateTime? BusinessDate; 
} 
+0

Nếu bạn muốn máy chủ lập lịch biểu được đặt thành GMT, hãy đặt múi giờ OS thành GMT. –

Trả lời

3

Nếu tôi hiểu vấn đề chính xác, bạn có thể giải quyết vấn đề này trong quá trình xử lý bằng cách chỉ cần sử dụng DateTime.ToUniversalTime() ở phía dịch vụ. Đối với ví dụ của bạn, điều này sẽ giúp bạn có được một DateTime với giá trị "2008-11-03 00:00:00" và Kind = DateTimeKind.Utc. Bây giờ nếu bạn cần giá trị tương tự này, nhưng là Địa phương hoặc Không xác định, bạn có thể sử dụng DateTime.SpecifyKind(DateTime, DateTimeKind) để đặt Loại mà không thay đổi giá trị.

+0

Có ... giữ cho dịch vụ trả về dưới dạng UTC, để cho khách hàng chuyển đổi hoặc giải thích. –

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