鉴于:
DateTime.UtcNow
Run Code Online (Sandbox Code Playgroud)
如何获得符合ISO 8601格式的相同值的字符串?
请注意,ISO 8601定义了许多类似的格式.我正在寻找的具体格式是:
yyyy-MM-ddTHH:mm:ssZ
Run Code Online (Sandbox Code Playgroud) [ 更新:格式说明符与格式字符串不同; 格式说明符是自定义格式字符串的一部分,其中格式字符串为"stock",不提供自定义.我的问题是说明符不是格式 ]
我一直在尝试使用格式字符串执行往返DateTime转换,格式字符串使用'zzz'格式说明符,我知道绑定到本地时间.因此,如果我尝试使用UTC日期时间进行往返,则会抛出DateTimeInvalidLocalFormat异常,它应该使用以下文本:
正在将UTC日期时间转换为仅适用于本地时间的格式的文本.使用'z'格式说明符调用DateTime.ToString时会发生这种情况,该说明符将在输出中包含本地时区偏移量.在这种情况下,要么使用指定UTC时间的'Z'格式说明符,要么使用'o'格式字符串,这是在文本中保留DateTime的推荐方法.传递由XmlConvert或DataSet序列化的DateTime时也会发生这种情况.如果使用XmlConvert.ToString,则传入XmlDateTimeSerializationMode.RoundtripKind以正确序列化.如果使用DataSet,请将DataColumn对象上的DateTimeMode设置为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' …Run Code Online (Sandbox Code Playgroud)