ColumnMapping.DataTableToObjectList为我提供了缺少时区信息的DateTime属性

时间:2016-10-11 13:45:31

标签: javascript asp.net angularjs datetime

我有一个webapi函数,它使用SqlConnection,SqlCommand等从T-SQL数据库中检索数据。我得到一个DataTable,我使用

转换为数据结构
var foobars = ColumnMapping.DataTableToObjectList<Foobar>(dt)

Foobar类包含DateTime字段。

当我从webapi方法返回foobar时,这些日期时间将通过网络以下列格式发送:

  

2016-10-12T12:00:00

这似乎是一个没有时区的日期时间。 AngularJS会将其视为12:00,而javascript的Date.getHours()将返回14(我在+2时区)。

如果我在从Web api方法返回之前执行此操作:

foobar.d = foobar.d.ToUniversalTime();

该字符串将获得额外的Z

  

2016-10-12T12:00:00Z

并且AngularJS和javascript都会同意哪个时间(12:00,这也是入侵时间)。

如果我这样做

foobar.d = foobar.d.DateStart.ToLocalTime();

字符串将是

  

2016-10-12T14:00:00 + 02:00

和AngularJS和javascript都报告它是14:00,比预定时间多两个小时。)

由此,我得出结论

  • DateTime对象可以是无时区的,但如果您尝试转换它,它将被视为UTC。
  • ColumnMapping.DataTableToObjectList创建DateTime对象无时区的结构。

我不想“修补”每个DateTime对象,这将是一个错误源(包括在每个DateTime对象上调用ToUniversalTime())。

我可以在调用ColumnMapping.DataTableToObjectList时指定语言环境吗?

1 个答案:

答案 0 :(得分:1)

在webapi中,您可以配置JsonFormatter以按您希望的方式序列化日期时间:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc;
    }
}

这样你就不必为每个日期时间做这件事,假设我理解你的问题......