2009-09-12 39 views
7

Có cách nào để lấy ngày 1 tháng 1 năm 1970 Giờ trung bình Greenwich trong một ngày giờ?.NET Greenwich Mean Time

nếu tôi chỉ cần ghi rõ ngày mới (1970, 1, 1) tôi sẽ nhận được nó với múi giờ hiện tại của tôi ..

Trả lời

6

GMT bằng UTC (Phối hợp d Thời gian toàn cầu), nhiều hơn hoặc ít hơn (trừ khi bạn đang giao dịch với các phân số của giây, không có sự khác biệt). DateTimeKind, một kiểu liệt kê cho phép bạn chọn có hiển thị thời gian trong múi giờ địa phương của bạn hay trong UTC, được tích hợp vào constructor DateTime. Sử dụng điều này, chúng ta có thể đạt được tương đương với GMT.

Các constructor chúng tôi đang tìm kiếm để sử dụng như sau:

DateTime(int year, int month, int day, int hour, int minute, int second, int millisecond, DateTimeKind kind) 

hay (trong một có được một đối số phần nghìn giây, trong khác không có):

DateTime(int year, int month, int day, int hour, int minute, int second, DateTimeKind kind) 

Để có được DateTime cho ngày 1 tháng 1 năm 1970 tại UTC, đây là những gì chúng tôi có thể sử dụng:

DateTime inGMT = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); //using 1st constructor above 

hay:

DateTime inGMT = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); //using 2nd constructor above 

LƯU Ý: Nội dung của DateTimeKind liệt kê dưới:

  • Unspecified (có thể là giờ địa phương hoặc UTC)
  • Utc
  • Địa phương

CẬP NHẬT: Thomas Levesque đề xuất một giải pháp rất sáng tạo trong câu trả lời của mình, tuy nhiên tôi không chắc chắn nếu nó là phương pháp trực tiếp nhất và nếu đó là một phương pháp hữu hiệu có thể được sử dụng cho bất kỳ múi giờ. Những gì tôi nghĩ anh ấy nói là bạn có thể tính DateTimeOffset từ DateTime.NowNgày giờ.Sử dụng và áp dụng chênh lệch tính toán cho ngày 1 tháng 1 năm 1970 theo múi giờ của riêng bạn, thời gian này sẽ cung cấp cho bạn thời gian UTC/GMT. Tôi không chắc chắn rằng có những phương pháp đơn giản để tính toán bù đắp cho các múi giờ khác, và sau đó điều này trở thành một chút dư thừa cho câu hỏi.

CẬP NHẬT # 2: Tôi đã thêm một hàm tạo DateTime khác hoàn thành cùng một điều, nhưng thiếu đối số mili giây. Họ có thể hoán đổi cho nhau.

+0

GMT * không * tuân theo thời gian tiết kiệm ánh sáng ban ngày. http://en.wikipedia.org/wiki/Greenwich_Mean_Time – LukeH

+0

Yup xin lỗi, đó là một sai lầm. Đã sửa. –

2

GMT là, đối với tất cả các mục đích thực tế, giống như tính theo giờ UTC.

Điều này có nghĩa là bạn chỉ có thể sử dụng một trong số DateTime constructors có tham số DateTimeKind, đặt tham số là DateTimeKind.Utc.

DateTime gmt = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
+0

UTC không phải là GMT - GMT tuân theo DLT (Tiết kiệm ánh sáng ban ngày), mặc dù nó tương đương với nhiều thời gian. – Noldorin

+2

UTC và GMT chỉ khác nhau theo tỷ lệ phần trăm của giây. GMT không có thời gian tiết kiệm ánh sáng ban ngày. – Erik

+3

@Noldorin: GMT và UTC * giống nhau *, cho mọi mục đích và mục đích. GMT * không * tuân thủ tiết kiệm ánh sáng ban ngày: Ở Vương quốc Anh, hiện tại BST là GMT + 1. http://en.wikipedia.org/wiki/Greenwich_Mean_Time – LukeH

3

Kiểm tra các DateTimeOffset cấu trúc

EDIT: Trên thực tế, sau khi đọc thêm về DateTimeOffset, nó có thể không phải là giải pháp thích hợp nhất cho những gì bạn đang cố gắng làm ... Tôi nghĩ rằng đây là câu trả lời trực tiếp nhất cho câu hỏi của bạn:

DateTime epoch = DateTime.SpecifyKind(new DateTime(1970, 1, 1), DateTimeKind.Utc); 
+0

Sử dụng DateTimeOffset sẽ là một giải pháp rất thú vị! Bạn có thể cho chúng tôi một số mã mẫu để cho biết bạn định sử dụng nó như thế nào để tìm giờ GMT? Bạn sẽ tìm thấy sự bù đắp giữa DateTime.Now và DateTime.UtcNow, và sau đó áp dụng bù đắp cho ngày 1 tháng 1 năm 1970 trong múi giờ của riêng bạn? Hay có cách tiếp cận trực tiếp hơn? Rất thú vị! –

+0

Ngoài ra, cách tiếp cận này có thể (theo giải thích của tôi về câu trả lời của bạn như được giải thích trong chú thích ở trên) làm việc cho mọi múi giờ mà bạn muốn chuyển đổi? Nói cách khác, có điều gì đó tương tự như DateTime.UtcBạn có sẵn cho các múi giờ khác không? Nếu không, tôi không nghĩ rằng đây sẽ là một giải pháp phổ quát khả thi. –

+0

@Thomas: Tôi không đồng ý rằng đây là "câu trả lời trực tiếp nhất" cho câu hỏi: Bạn đang xây dựng 'DateTime' và sau đó gọi phương thức' SpecifyKind'. Kết quả tương tự có thể đạt được chỉ bằng cách gọi một hàm tạo khác, không cần gọi phương thức bổ sung. (Xem câu trả lời của tôi để biết chi tiết.) – LukeH