【问题标题】:NancyFX not serializing dates with a trailing Z to indicate UTC/ZuluNancyFX 不使用尾随 Z 序列化日期以指示 UTC/Zulu
【发布时间】:2014-08-06 00:22:24
【问题描述】:

我们将数据库中的所有日期都存储为 UTC。

从API返回给我们时,格式如下

"createdDate":"2014-07-30T18:34:45"

但如您所见,日期没有尾随 Z(这向我们的 Angular 应用程序表明它是 UTC / Zulu)。它应该是这样的

"createdDate":"2014-07-30T18:34:45Z"

我的引导程序中确实有以下设置

JsonSettings.ISO8601DateFormat = true;

我可以确保在我的配置中的哪个位置有一个尾随 Z 用于 UTC 解析?

【问题讨论】:

    标签: angularjs datetime nancy


    【解决方案1】:

    您使用的是哪个版本的 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)。

    【讨论】:

    • 是的,目前是 22 - 我会尝试更新。我确实尝试在我的视图模型中设置 Kind(如上所述),但由于我使用的是旧版本,我认为这就是问题所在。
    猜你喜欢
    • 2013-06-27
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    相关资源
    最近更新 更多