使用C# AutoMapper将DateTime UTC转换为本地时间

3
我将使用ASP.NET与WebApi(Rest)和AngularJS。如果我从客户端(Angular)发送DateTime对象到服务器(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类型的对象都能自动转换,但是使用这段代码却没有实现。我做错了什么?有人可以帮助我解决这个问题吗?

提前感谢。


你在调试中查看了 inputDate.Kind 包含的值吗?我认为它是 DateTimeKind.Unspecified - Denis Krasakov
你的应用程序是否在不同的位置使用?如果是,那么它是否应该根据当前用户的本地时间显示时间? - Ananda G
我期望该函数能够自动调用。但是在从客户端获取包含日期时间对象的响应后,它并没有被调用。而且我的应用程序并没有在不同的位置使用... - H. Senkaya
看一下这个[链接][https://dev59.com/3Gcs5IYBdhLWcg3wVyel?rq=1],它可以帮助你。 - Ananda G
1个回答

2

我注意到在更新 AutoMapper 后(我使用的是非常老旧的版本),发生了一些变化。即使对于日期时间的映射配置,从 AutoMapper 映射而来的对象最终会在自定义转换器的 Convert 方法之后将日期转换为 UTC 时间。查看发布说明可能会有所帮助。我没有找到防止这种情况发生的选项。

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

您需要在创建配置对象后调用 initialize 吗?

AutoMapper.Mapper.Initialize(cfg);

so...

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接