如何得到这个日期格式CCYY-MM-DDThh:mm:ss.sss-hh:mm

时间:2015-06-19 22:31:01

标签: c# .net datetime

我希望将datetime传递给其中一个服务,格式应为“CCYY-MM-DDThh:mm:ss.sss-hh:mm”。它必须是日期时间而不是字符串。

传递请求的变量类似于:Request.Timestamp并且是Datetime。

我尝试了什么 (所有这些都有例外)

DateTime.Parse(DateTime.UtcNow.ToString(@"yyyy-MM-ddTHH\:mm\:ss.fffffffzzz"), null, System.Globalization.DateTimeStyles.AssumeLocal);
DateTime.Parse(DateTime.UtcNow.ToString(@"yyyy-MM-ddTHH\:mm\:ss.fffffffzzz"), null, System.Globalization.DateTimeStyles.None)
DateTime.Parse(DateTime.UtcNow.ToString(@"yyyy-MM-ddTHH\:mm\:ss.fffffffzzz"), null, System.Globalization.DateTimeStyles.RoundtripKind)
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-ddThh:mm:ss.sss-hh:mm"));
DateTime.Parse(DateTime.Now.ToString(@"yyyy-MM-ddTHH\:mm\:ss.fffffffzzz"), null, System.Globalization.DateTimeStyles.AssumeLocal);

任何帮助都将得到帮助。我正在使用的Progarmming语言是C#.NET

2 个答案:

答案 0 :(得分:5)

DateTime值没有格式。仅当您将值表示为字符串时,格式才有意义。换句话说,它被格式化为" CCYY-MM-DDThh:mm:ss.sss-hh:mm"而且它不是一个字符串是相互排斥的。

如果它确实需要是DateTime,您应该只传递DateTime.UtcNowDateTime.Now。如果确实需要使用指定的格式,那么您应该删除DateTime.Parse调用,并将正确的格式字符串传递给ToString方法。

DateTime的值存储为64位。通过调用DateTime.Parse(DateTime.Now.ToString(formatString))来考虑您正在做的事情:您正在基于64位DateTime值创建格式化字符串,然后您将该字符串解析为另一个64位DateTime值。如果以这种方式看待它,这相当愚蠢。

答案 1 :(得分:2)

DateTime是一种二进制数据类型,包含100纳秒刻度的计数,表示与内部日历的纪元的偏移:1月1日开始时的1月1日(00:00) :00.000)。除了在格式化显示内容时,它没有任何其他表示形式。

您的代码正在将其转换为ISO 8601格式的字符串,然后尝试将解析为DateTime。解析失败,因为几乎可以肯定,字符串表示不是当前Culture的默认表示。

如果您需要以预期的格式将其传递给服务,无论是通过网络发送它的任何序列化都需要正确格式化。这意味着要么自己将其转换为字符串,要么确保序列化程序知道所需的格式。

在任何一种情况下,您可能希望将其转换为DateTimeOffset,而不是DateTime,因此UTC的偏移量是对象的属性:

DateTimeOffset now = DateTime.SpecifyKind( DateTime.Now , DateTimeKind.Local ) ;
string formattedNow = now.ToString("yyyy-MM-ddTHH:mm:ss.fffzzz") ;

这会产生这样的结果:

2015-06-19T16:01:27.384-07:00
相关问题