title: Where's the DateTime 'Z' format specifier?
body: <p>[<strong>Update</strong>: <em>Format specifiers are not the same thing as format strings; a format specifier is a piece of a custom format string, where a format string is 'stock' and doesn't provide customization. My problem is with specifiers not formats</em>]</p>
  
  <p>I've been trying to perform roundtrip DateTime conversions with a format string that uses 'zzz' format specifier, which I know is bound to local time. So, if I attempt to round trip with a UTC date time it throws a DateTimeInvalidLocalFormat exception, which it should, with this text:</p>
  
  <p><em>A UTC DateTime is being converted to text in a format that is only correct for local times. This can happen when calling DateTime.ToString using the 'z' format specifier, which will include a local time zone offset in the output. <strong>In that case, either use the 'Z' format specifier, which designates a UTC time</strong>, or use the 'o' format string, which is the recommended way to persist a DateTime in text. This can also occur when passing a DateTime to be serialized by XmlConvert or DataSet. If using XmlConvert.ToString, pass in XmlDateTimeSerializationMode.RoundtripKind to serialize correctly. If using DataSet, set the DateTimeMode on the DataColumn object to DataSetDateTime.Utc.</em></p>
  
  <p>Based on this suggestion, all I need to do to get my code to work is to replace 'zzz' with 'ZZZ' so I can stand in a UTC format. The problem is, 'Z' isn't found anywhere in the documentation and any 'Z' format combination I try, i.e. 'Z', 'ZZ', 'ZZZ', always just converts the DateTime instance with those Z's treated like literals.</p>
  
  <p>Did someone forget to implement 'Z' without telling the exception message author, or am I missing how to swap out a valid local time offset with "+0000" without hacking?</p>
  
  <p><strong>Code Example:</strong></p>
  
  <pre><code>// 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);
  </code></pre>