Ответ 1
Какой браузер вы видите, что это происходит? Поскольку проблема, с которой вы на самом деле справляетесь, - это разбор Javascript, по моему опыту, проблема на самом деле - это миллисекундное округление, а не наличие Z или нет.
Попробуйте это в IE9: http://jsfiddle.net/b9chris/HaBP8/
'2013-06-13T20:43:55.6',
'2013-06-13T20:43:55.61',
'2013-06-13T20:43:55.61Z',
'2013-06-13T20:43:55.611',
'2013-06-13T20:43:55.611Z'
В большинстве браузеров все даты прекрасно разбираются; в IE9 первые 3 сбой, независимо от Z или нет, потому что для IE9 требуется 3 места для миллисекундного числа. Второе 2 преуспевает с Z и без него. Что имеет значение, это 3 миллисекунды цифр - Z не имеет значения, в том числе потому, что Javascript не содержит DateTimeKind, как .Net, поэтому Z или нет, не имеет значения, как Javascript интернализует дату. Поскольку число миллисекундных цифр иногда будет равным одному или 2 в зависимости от времени, если вы пропустите отметки времени, вы получите случайные сбои.
Я сообщил об этом как об ошибке на странице Json.Net Codeplex; он был отклонен сопровождающим в комментариях об ошибке и закрыт. Откройте исходный код.
Вы можете обойти эту ошибку, используя код в этом ответе:
fooobar.com/questions/2322/...
Чтобы быть ясным, отсутствие Z неверно в части JSON.Net, если оно выдает без него для DateTimeKind.UTC, но это не является недопустимой датой ISO-8601 в более общем смысле - нет Z неявно означает Local Time:
http://en.wikipedia.org/wiki/ISO_8601#Times
Если информация о соотношении UTC не указана с представлением времени, время считается локальным.
И, как упоминалось выше, анализ Javascript не заботится о Z, поэтому для ваших целей это не имеет значения.
Обратите внимание, что вы не можете передавать UTC на JSON.Net и запускать эту проблему. Объекты DateTime в С# могут быть натуральными Local, Unspecified или UTC. Нечестно предположить, что DateTimes, которые не являются UTC, фактически являются UTC; передача его без информации о часовом поясе - самая безопасная ставка. Структура .Net DateTime выполняет временные интервалы, поэтому JSON.Net не имеет выбора, кроме как выдать значение по умолчанию DateTimes (DateTimeKind.Unspecified) как локальное, запрещая интеграцию с .Net TimeZone library.