[ Обновление : Спецификаторы формата - это не то же самое, что строки формата; спецификатор формата - это часть строки пользовательского формата, где строка формата - «сток» и не обеспечивает настройку. Моя проблема со спецификаторами, а не с форматами ]
Я пытался выполнить преобразование DateTime в обе стороны с помощью строки формата, которая использует спецификатор формата 'zzz', который, я знаю, привязан к местному времени. Таким образом, если я пытаюсь выполнить обратную поездку с указанием времени UTC, он выдает исключение DateTimeInvalidLocalFormat, которое должно произойти, с таким текстом:
Дата и время по Гринвичу преобразуются в текст в формате, который подходит только для местного времени. Это может произойти при вызове DateTime.ToString с использованием спецификатора формата 'z', который будет включать в вывод смещение местного часового пояса. В этом случае либо используйте спецификатор формата 'Z', который обозначает время UTC , либо используйте строку формата 'o', которая является рекомендуемым способом сохранения DateTime в тексте. Это также может происходить при передаче DateTime для сериализации с помощью XmlConvert или DataSet. Если используется XmlConvert.ToString, передайте XmlDateTimeSerializationMode.RoundtripKind для правильной сериализации. При использовании DataSet установите для DateTimeMode объекта DataColumn значение DataSetDateTime.Utc.
Исходя из этого предложения, все, что мне нужно, чтобы заставить мой код работать, - это заменить 'zzz' на 'ZZZ', чтобы я мог стоять в формате UTC. Проблема в том, что «Z» нигде не встречается в документации, и любая комбинация форматов «Z», которую я пробую, то есть «Z», «ZZ», «ZZZ», всегда просто конвертирует экземпляр DateTime с теми, которые Z обрабатываются как литералы. .
Кто-то забыл внедрить 'Z', не сообщая об этом автору сообщения об исключении, или мне не хватает, как поменять местами корректное местное время с "+0000" без взлома?
Пример кода:
// 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);