从JavaScript到C#解析日期和时间
我有一些JavaScript代码,我正试图传递给我的Web服务。 我的JavaScript代码应该以UTC格式发送日期。 在本地,我生成代码的时间是在12:30:43 pm。 当我执行JavaScript代码时,生成了以下日期/时间:
2012-06-03T20:30:43.000Z
该日期/时间是根据以下代码生成的:
var now = new Date(); var utcDate = new Date( now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds() );
当我将日期/时间从JavaScript传递回我的Web服务时,它会被序列化,如下所示:
20120603163043
在这一点上,这对我来说是正确的。 然后我需要获取该字符串并将其转换为C#中的日期/时间。 为了做到这一点,我使用以下C#代码:
DateTime _value = DateTime.MinValue; DateTime.TryParseExact(value, "yyyyMMddHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out _value)
当发生这种情况时,我会得到以下日期/时间。 6/3/2012 12:30:43 PM
我究竟做错了什么? 我期待的日期/时间是6/3/2012 4:30:43 PM
您得到的结果是正确的,但请检查您的DateTime
的Kind
属性。 你会注意到它没有设置为UTC
而是设置为Local
。
您可以使用DateTimeStyles.AdjustToUniversal
生成DateTime
设置为UTC
的DateTime
。
DateTime dateTime; DateTime.TryParseExact( value, "yyyyMMddHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out dateTime);
看到它在ideone上工作。
如果您只想使用序列化(例如webAPI),我发现JS toISOString
非常有用且兼容。
//JAVASCRIPT var d = new Date(); $toPut.dateTime = d.toISOString(); $toPut.put() //C# [Put("/setup/dateTime"), HttpPut] public HttpResponseMessage SetDateTime([FromBody]DateTime dateTimeSettings )
这样您就可以保留数据结构而不处理解析。
您必须将日期参数作为UTC格式传递给Web服务,然后使用TryParse方法将其转换为C#日期对象。
试试这个:
//Javascript var now = new Date(); //just like: 'Thu, 21 Mar 2013 12:44:40 GMT' var utcNowString = now.toUTCString(); //pass this parameter to your web service
这是C#代码:
DateTime date; DateTime.TryParse(jsDateString, out date); //parsed as: '21.03.2013 14:44:40'
希望这可以帮助。