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

标签 javascript asp.net angularjs datetime

我有一个 webapi 函数,它使用 SqlConnection、SqlCommand 等从 T-SQL 数据库检索数据。我得到一个 DataTable,我使用它转换为数据结构

var foobars = ColumnMapping.DataTableToObjectList<Foobar>(dt)

Foobar 类包含 DateTime 字段。

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

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 时可以指定区域设置吗?

最佳答案

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

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

这样,假设我理解您的问题,您就不必为每个日期时间都执行此操作...

关于javascript - ColumnMapping.DataTableToObjectList 为我提供缺少时区信息的 DateTime 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39978753/

相关文章:

Javascript 正则表达式用于包含数字的字符串

ASP.NET - 我正在生成一个 .XLS 文件,我需要将其发送给访问者

javascript - 使用过滤器对 ng-repeat 中的 $scope 对象进行排序

php - 无法使用 AngularJS $http.json/get 从远程服务器获取 JSON

javascript - 如何在 document.body.innerHTML 上使用 jQuery 选择器

javascript - 如何从 Angular 回调中更改范围对象?

ASP.NET:如何在多行上重新排列 GridView 单元格

java - 使用 Oracle、Java 和 AngularJS 构建实时数据网格的策略

Javascript/Jquery 评论导致 IE 错误

jquery - 使用 Jquery 管理 Asp.Net 验证器