[Cập nhật: Định dạng thông số không giống với chuỗi định dạng; một trình định dạng định dạng là một phần của chuỗi định dạng tùy chỉnh, trong đó chuỗi định dạng là 'chứng khoán' và không cung cấp tùy chỉnh. Vấn đề của tôi là với các định danh không phải là định dạng]Trình định dạng định dạng DateTime 'Z' ở đâu?
Tôi đã cố gắng thực hiện các chuyển đổi theo thời gian của DateTime với chuỗi định dạng sử dụng định dạng 'zzz' mà tôi biết là ràng buộc theo giờ địa phương. Vì vậy, nếu tôi cố gắng làm tròn chuyến đi với thời gian ngày UTC, nó sẽ ném ra một ngoại lệ DateTimeInvalidLocalFormat, mà nó nên, với văn bản này:
Một giờ UTC đang được chuyển thành văn bản ở định dạng chỉ đúng cho giờ địa phương . Điều này có thể xảy ra khi gọi DateTime.ToString bằng cách sử dụng định dạng 'z' định dạng, trong đó sẽ bao gồm một múi giờ địa phương bù đắp trong đầu ra. Trong trường hợp đó, hãy sử dụng trình định dạng định dạng 'Z', chỉ định thời gian UTC hoặc sử dụng chuỗi định dạng 'o', đây là cách được khuyến nghị để duy trì DateTime trong văn bản. Điều này cũng có thể xảy ra khi chuyển một DateTime được xê-ri hóa bởi XmlConvert hoặc DataSet. Nếu sử dụng XmlConvert.ToString, vượt qua trong XmlDateTimeSerializationMode.RoundtripKind để tuần tự một cách chính xác. Nếu sử dụng DataSet, hãy đặt DateTimeMode trên đối tượng DataColumn thành DataSetDateTime.Utc.
Dựa trên đề xuất này, tất cả những gì tôi cần làm để mã của tôi hoạt động là thay thế 'zzz' bằng 'ZZZ' để tôi có thể ở định dạng UTC. Vấn đề là, 'Z' không được tìm thấy ở bất kỳ nơi nào trong tài liệu và bất kỳ sự kết hợp định dạng 'Z' nào tôi thử, tức là 'Z', 'ZZ', 'ZZZ', luôn chuyển đổi phiên bản DateTime với những chữ Z được xử lý như chữ .
Có ai đó quên triển khai 'Z' mà không nói cho tác giả thông báo ngoại lệ hay tôi không biết cách hoán đổi khoảng thời gian địa phương hợp lệ bằng "+0000" mà không bị hack?
Mã số Ví dụ:
// This is the format with 'zzzzz' representing local time offset
const string format = "ddd MMM dd HH:mm:ss zzzzz yyyy";
// create a UTC time
const string expected = "Fri Dec 19 17:24:18 +0000 2008";
var time = new DateTime(2008, 12, 19, 17, 24, 18, 0, DateTimeKind.Utc);
// If you're using a debugger this will rightfully throw an exception
// with .NET 3.5 SP1 because 'z' is for local time only; however, the exception
// asks me to use the 'Z' specifier for UTC times, but it doesn't exist, so it
// just spits out 'Z' as a literal.
var actual = time.ToString(format, CultureInfo.InvariantCulture);
Assert.AreEqual(expected, actual);
lẽ bạn có thể cung cấp cho chúng với một mẫu mã thực tế về những gì bạn đang cố gắng để làm, vì vậy chúng tôi không cần phải dành nhiều thời gian cố gắng đoán nó? –
Tôi vừa cập nhật một mẫu. Tôi đang bối rối vì tôi biết 'Z' không được hỗ trợ theo MSDN, nhưng ngoại lệ yêu cầu tôi sử dụng nó. Và những gì tôi muốn có thể làm là chuyển đổi với chuỗi tùy chỉnh này, ngay cả khi đó là UTC và nhận được "+0000" trong kết quả, như tôi sẽ nhận được "-04: 00" nếu tôi sử dụng 'zzz' với giờ địa phương. –
Tôi thấy bạn đang gặp vấn đề; cảm ơn bạn đã cập nhật mã. Sẽ đi sâu vào nó một lúc và đăng một cái gì đó nếu tôi tìm thấy nó. –