我希望将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
答案 0 :(得分:5)
DateTime
值没有格式。仅当您将值表示为字符串时,格式才有意义。换句话说,它被格式化为" CCYY-MM-DDThh:mm:ss.sss-hh:mm"而且它不是一个字符串是相互排斥的。
如果它确实需要是DateTime,您应该只传递DateTime.UtcNow
或DateTime.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