我有一个 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/