使用C#AutoMapper将DateTime UTC转换为Local

时间:2017-03-30 09:07:10

标签: c# asp.net angularjs datetime automapper

我将ASP.NET与WebApi(Rest)和AngularJS一起使用。如果我将DateTime对象从Client(Angular)发送到Server(C#),我会收到由于时区而导致的扭曲(-2小时)日期。所以我决定使用Automapper。

我目前的代码如下:

AutoMapperConfiguration.cs:

public class AutoMapperConfiguration
{
    public void Configure()
    {
        var config = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<DateTime, DateTime>().ConvertUsing<UtcToLocalConverter>();
        });
    }
}

UtcToLocalConverter.cs:

public class UtcToLocalConverter : AutoMapper.ITypeConverter<DateTime, DateTime>
{
    public DateTime Convert(DateTime source, DateTime destination, ResolutionContext context)
    {
        var inputDate = source;
        if (inputDate.Kind == DateTimeKind.Utc)
        {
            return inputDate.ToLocalTime();
        }
        return inputDate;
    }
}

的Global.asax.cs:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        new AutoMapperConfiguration().Configure();
        //...some more stuff...
    }
}

我想拥有DateTime类型的所有对象,我从客户端自动转换,但这不会发生在这段代码中。我错了什么?有人可以帮我解决这个问题吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

我注意到从旧版本更新后使用AutoMapper进行了更改(我的版本非常旧)。即使使用DateTimes的地图配置,从AutoMapper映射的对象最终会在转换方法之后将日期转换为UTC时间自定义转换器。查看发行说明可能会有所帮助。我还没有找到防止这种情况发生的选择。

另外,检查您的配置设置是否正在使用。

创建配置对象后是否需要调用initialize?

AutoMapper.Mapper.Initialize(cfg);

所以...

public void Configure()
{
    var config = new MapperConfiguration(cfg =>
    {
        cfg.CreateMap<DateTime, DateTime>().ConvertUsing<UtcToLocalConverter>();
    });
    AutoMapper.Mapper.Initialize(cfg);
}