您使用的是哪个版本的 NancyFx?因为在 v0.23.0 或更高版本中,JsonSerializer 代码已更改为使用“o”日期格式而不是“s”日期格式,这应该会为您提供您正在寻找的尾随 Z。 (但仅限于 UTC 日期时间。)
This is the commit that made this change. 注意DateTimeKind.Unspecified 日期如何被视为本地日期;如果您没有将 DateTime 对象显式创建为DateTimeKind.Utc,这可能是您的问题的一个可能原因。
下面是序列化 DateTime 值的 NancyFx 代码,从 v0.23.0 开始(提交之后)。来自https://github.com/NancyFx/Nancy/blob/v0.23.0/src/Nancy/Json/JsonSerializer.cs,第 480-518 行:
void WriteValue (StringBuilder output, DateTime value)
{
if (this.iso8601DateFormat)
{
if (value.Kind == DateTimeKind.Unspecified)
{
// To avoid confusion, treat "Unspecified" datetimes as Local -- just like the WCF datetime format does as well.
value = new DateTime(value.Ticks, DateTimeKind.Local);
}
StringBuilderExtensions.AppendCount(output, maxJsonLength, string.Concat("\"", value.ToString("o", CultureInfo.InvariantCulture), "\""));
}
else
{
DateTime time = value.ToUniversalTime();
string suffix = "";
if (value.Kind != DateTimeKind.Utc)
{
TimeSpan localTZOffset;
if (value >= time)
{
localTZOffset = value - time;
suffix = "+";
}
else
{
localTZOffset = time - value;
suffix = "-";
}
suffix += localTZOffset.ToString("hhmm");
}
if (time < MinimumJavaScriptDate)
time = MinimumJavaScriptDate;
long ticks = (time.Ticks - InitialJavaScriptDateTicks)/(long)10000;
StringBuilderExtensions.AppendCount(output, maxJsonLength, "\"\\/Date(" + ticks + suffix + ")\\/\"");
}
}
如您所见,请求 ISO 8601 日期格式将为您获取 2014-07-30T18:34:45 格式,而不是自纪元以来的毫秒数,但如果被序列化的值具有种类等于DateTimeKind.Local。
所以我有两个建议给您:如果您仍在使用 v0.22 或更早版本,请升级到 NancyFx 的 v0.23(v0.22 使用不包含时区信息的“s”日期格式进行序列化日期时间值)。如果您要序列化的 DateTime 对象未显式设置为 DateTimeKind.Utc,请确保指定 Utc(因为默认值为 Unspecified,NancyFx 将其视为等同于 Local)。