C#自动将日期时间格式转换为iso字符串

C#自动将日期时间格式转换为iso字符串,c#,automapper,C#,Automapper,当Automapper将强制转换为对象的日期时间转换为字符串时,它使用ToString()方法,该方法以区域性定义的格式返回字符串。如何配置它,使其始终映射到ISO字符串 var data = new Dictionary<string, object> { { "test", new DateTime(2016, 7, 6, 9, 33, 0) } }; var config = new Ma

当Automapper将强制转换为对象的日期时间转换为字符串时,它使用ToString()方法,该方法以区域性定义的格式返回字符串。如何配置它,使其始终映射到ISO字符串

        var data = new Dictionary<string, object>
        {
            { "test", new DateTime(2016, 7, 6, 9, 33, 0) }
        };

        var config = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<DateTime, string>().ConvertUsing(dt => dt.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ"));
        });

        var mapper = config.CreateMapper();

        Assert.AreEqual("2016-07-06T07:33:00Z", mapper.Map<string>(data["test"]));
        Assert.AreEqual("2016-07-06T07:33:00Z", mapper.Map<IDictionary<string, string>>(data)["test"]);

下面是一个示例,说明如何做到这一点:

示例模型:

class A
{
    public DateTime DateTime { get; set; }
}

class B
{
    public string DateTime { get; set; } 
}
static void Main()
{
    var config = new MapperConfiguration(
        cfg =>
            {
                cfg.CreateMap<A, B>();
                cfg.CreateMap<DateTime, string>().ConvertUsing(dt => dt.ToString("u"));
            });

    var mapper = config.CreateMapper();

    var a = new A();

    Console.WriteLine(a.DateTime); // will print DateTime.ToString
    Console.WriteLine(mapper.Map<B>(a).DateTime); // will print DateTime in ISO string
    Console.ReadKey();
}
static void Main()
{
    var data = new Dictionary<string, DateTime> // here is main problem
    {
        { "test", new DateTime(2016, 7, 6, 9, 33, 0) }
    };

    var config = new MapperConfiguration(cfg =>
    {
        cfg.CreateMap<DateTime, string>().ConvertUsing(dt => dt.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ"));
    });

    var mapper = config.CreateMapper();

    Console.WriteLine(mapper.Map<string>(data["test"]));
    Console.WriteLine(mapper.Map<IDictionary<string, string>>(data)["test"]);
    Console.ReadKey();
}
代码片段:

class A
{
    public DateTime DateTime { get; set; }
}

class B
{
    public string DateTime { get; set; } 
}
static void Main()
{
    var config = new MapperConfiguration(
        cfg =>
            {
                cfg.CreateMap<A, B>();
                cfg.CreateMap<DateTime, string>().ConvertUsing(dt => dt.ToString("u"));
            });

    var mapper = config.CreateMapper();

    var a = new A();

    Console.WriteLine(a.DateTime); // will print DateTime.ToString
    Console.WriteLine(mapper.Map<B>(a).DateTime); // will print DateTime in ISO string
    Console.ReadKey();
}
static void Main()
{
    var data = new Dictionary<string, DateTime> // here is main problem
    {
        { "test", new DateTime(2016, 7, 6, 9, 33, 0) }
    };

    var config = new MapperConfiguration(cfg =>
    {
        cfg.CreateMap<DateTime, string>().ConvertUsing(dt => dt.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ"));
    });

    var mapper = config.CreateMapper();

    Console.WriteLine(mapper.Map<string>(data["test"]));
    Console.WriteLine(mapper.Map<IDictionary<string, string>>(data)["test"]);
    Console.ReadKey();
}
static void Main()
{
var config=新的MapperConfiguration(
cfg=>
{
CreateMap();
CreateMap().ConvertUsing(dt=>dt.ToString(“u”);
});
var mapper=config.CreateMapper();
var a=新的a();
Console.WriteLine(a.DateTime);//将打印DateTime.ToString
Console.WriteLine(mapper.Map(a.DateTime);//将以ISO字符串打印日期时间
Console.ReadKey();
}
代码片段#2:

class A
{
    public DateTime DateTime { get; set; }
}

class B
{
    public string DateTime { get; set; } 
}
static void Main()
{
    var config = new MapperConfiguration(
        cfg =>
            {
                cfg.CreateMap<A, B>();
                cfg.CreateMap<DateTime, string>().ConvertUsing(dt => dt.ToString("u"));
            });

    var mapper = config.CreateMapper();

    var a = new A();

    Console.WriteLine(a.DateTime); // will print DateTime.ToString
    Console.WriteLine(mapper.Map<B>(a).DateTime); // will print DateTime in ISO string
    Console.ReadKey();
}
static void Main()
{
    var data = new Dictionary<string, DateTime> // here is main problem
    {
        { "test", new DateTime(2016, 7, 6, 9, 33, 0) }
    };

    var config = new MapperConfiguration(cfg =>
    {
        cfg.CreateMap<DateTime, string>().ConvertUsing(dt => dt.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ"));
    });

    var mapper = config.CreateMapper();

    Console.WriteLine(mapper.Map<string>(data["test"]));
    Console.WriteLine(mapper.Map<IDictionary<string, string>>(data)["test"]);
    Console.ReadKey();
}
static void Main()
{
var data=newdictionary//这里是主要问题
{
{“测试”,新的日期时间(2016,7,6,9,33,0)}
};
var config=new-MapperConfiguration(cfg=>
{
cfg.CreateMap().ConvertUsing(dt=>dt.ToUniversalTime().ToString(“yyyy-MM-ddTHH:MM:ssZ”);
});
var mapper=config.CreateMapper();
Console.WriteLine(mapper.Map(数据[“测试]));
Console.WriteLine(mapper.Map(data)[“test”]);
Console.ReadKey();
}

如果要对所有日期时间执行此操作,只需创建一个。如果要对特定值执行此操作,请对这些属性使用
FormMember
语法。@stuartd我尝试的是:Mapper.CreateMap().ConvertUsing(x=>x.ToString(“u”);然而,这似乎从来没有被称为它看起来会起作用。你能设置一个失败的测试用例吗?你的例子确实很好,我发现这个问题有点复杂。请看更新后的帖子。我添加了代码片段#2。代码中的问题是您的字典
,而不是
。我相信在使用集合映射的情况下,它使用声明的集合类型,而不是实际的集合类型。如您所见,如果您在字典中从
object`更改为
DateTime
,它将起作用。问题是,它之所以是dictionary,是因为它可以包含日期时间,但也可以包含字符串、数字或其他任何内容。如果没有其他方法,我想我们会有一些再工程要做…@巴顿堡再工程应该是一条路。当存在泛型类型时,它不应该使用对象。