2010-07-23 40 views
30

Tôi có một ngày giờ được lưu trữ trong giờ quốc tế (UTC) có giá trị 2010-01-01 01:01:01.datetime thành chuỗi có múi giờ

Tôi muốn hiển thị nó trong EST ở định dạng này 2010/01/01 04: 01: 01GMT-04: 00, tuy nhiên 'K' định dạng cho múi giờ không hoạt động trong ToString

+0

Bạn có thời gian trong giờ quốc tế (UTC) hoặc Giờ chuẩn Greenwich (GMT) không? – Guffa

+0

UTC xin lỗi vì lỗi đánh máy – Comma

Trả lời

48

Sử dụng công cụ định dạng "zzz" để lấy bù UTC. Ví dụ:

 var dt = new DateTime(2010, 1, 1, 1, 1, 1, DateTimeKind.Utc); 
     string s = dt.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss \"GMT\"zzz"); 
     Console.WriteLine(s); 

Output: 2009/12/31 19:01:01 GMT-06: 00

Tôi đang ở múi giờ CDT. Hãy chắc chắn rằng DateTime là DateTimeKind.Utc rõ ràng.

+3

GMT không rõ ràng để tiết kiệm ánh sáng ban ngày. Nó không thay đổi để tiết kiệm ánh sáng ban ngày –

3

Điều gì đó giống như vậy. Bạn có thể làm sạch nó thêm một chút:

string newDate = string.Format("{0:yyyy-MM-dd HH:mm:ss} GMT {1}", dt.ToLocalTime(), dt.ToLocalTime().ToString("%K")); 
+1

Bạn, có thể, có nghĩa là 'HH', không phải 'hh'. – Sasha

+0

Có lẽ ... "hh" cho kết quả 12 giờ trong đó "HH" cho kết quả quân sự. – Robaticus

+0

Robaticus, tôi có nghĩa là định dạng 12 giờ không tương thích với phần còn lại của câu trả lời của bạn, bởi vì bạn không chỉ định AM/PM. I E. hoặc 't' /' tt' nên được thêm vào để làm cho 'hh' có ý nghĩa (ví dụ:' 02:00 AM', '03:00 PM'), hoặc' hh' sẽ được thay thế bằng 'HH' để tạo ra 24 giờ định dạng (ví dụ: '02: 00', '15: 00'). Vì vậy, định dạng 'yyyy-MM-dd hh: mm: ss' tạo ra đầu ra mơ hồ không thể giải mã được: ( – Sasha

1

Phương pháp này sẽ trở lại với thời gian quy định ở Đông Giờ chuẩn (như câu hỏi yêu cầu), ngay cả khi EST không phải là địa phương múi giờ:

public string GetTimeInEasternStandardTime(DateTime time) 
{ 
    TimeZoneInfo easternStandardTime = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
    DateTimeOffset timeInEST = TimeZoneInfo.ConvertTime(time, easternStandardTime); 
    return timeInEST.ToString("yyyy-MM-dd hh:mm:ss tt\" GMT\"zzz"); 
} 

Lưu ý: Tôi đã không kiểm tra này trong một hệ điều hành không phải tiếng Anh. Xem tài liệu MSDN trên TimeZoneInfo.FindSystemTimeZoneById.

+1

@Sasha Đó là một điểm tốt, câu trả lời này trước khi không phân biệt giữa AM và PM. thêm "tt" vào chuỗi định dạng thời gian để thêm AM/PM. Theo nhận xét của bạn, bạn có thể thay thế "hh" bằng "HH" để xuất giờ bằng cách sử dụng đồng hồ 24 giờ (từ 00 đến 23). –

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