仍然在与JSON.net Dateformat挣扎

时间:2014-03-12 16:57:19

标签: c# asp.net json json.net

我在将Date(以字符串格式)传输到对象中时遇到问题,因为序列化程序似乎始终将其转换为错误。

格式实际为dd.MM.yyyy(瑞士时间格式),序列化程序会尝试将其转换为MM-dd-YYYY(将天数转换为月份)。

所以,如果我有一个像06.03.1992(3月6日)这样的日期,转换器将成为6月3日。 如果当天高于12天,该程序将完全崩溃。

我知道我可以某种方式指定日期格式,但我还没有真正有效的解决方案。 对我的问题有任何想法吗?

提前致谢, 丹尼尔

2 个答案:

答案 0 :(得分:1)

您可以通过创建IsoDateTimeConverter类的新实例来控制Json.Net用于序列化和反序列化日期的格式,根据需要在其上设置DateTimeFormat属性,然后传递转换器到序列化器。

这是一个演示:

class Program
{
    static void Main(string[] args)
    {
        IsoDateTimeConverter dateConverter = new IsoDateTimeConverter
        {
            DateTimeFormat = "dd.MM.yyyy"
        };

        Foo foo = new Foo { Date = new DateTime(2014, 3, 12) };

        // serialize an object containing a date using the custom date format
        string json = JsonConvert.SerializeObject(foo, dateConverter);
        Console.WriteLine(json);

        // deserialize the JSON with the custom date format back into an object
        Foo foo2 = JsonConvert.DeserializeObject<Foo>(json, dateConverter);
        Console.WriteLine("Day = " + foo2.Date.Day);
        Console.WriteLine("Month = " + foo2.Date.Month);
        Console.WriteLine("Year = " + foo2.Date.Year);
    }
}

class Foo
{
    public DateTime Date { get; set; }
}

输出:

{"Date":"12.03.2014"}
Day = 12
Month = 3
Year = 2014

注意:使用此方法,日期格式将应用于您正在序列化或反序列化的所有对象上的所有日期。如果您需要不同日期的不同格式,请参阅this question,其中提供了几种可能的解决方案。

答案 1 :(得分:0)

很可能.net将日期序列化如下:

\/Date(1293034567877)\/

您需要解析该日期并手动安排:

function ndateFormatter(cellval, opts, rwdat, _act) {
    var time = cellval.replace(/\/Date\(([0-9]*)\)\//, '$1');
    var date = new Date();
    date.setTime(time);
    var month = date.getMonth() + 1;
    var day = date.getDate();
    var year = date.getFullYear();
    return ((month > 9 ? month : "0" + month) + "/" + (day > 9 ? day : "0" + day) + "/" + year);
};

或者在你的情况下函数会返回:

return ((day > 9 ? day : "0" + day) + "." + (month > 9 ? month : "0" + month) + "." + year);