为啥当包含控制器动作的数据时日期时间值会发生变化?使用 AngularJs 和 Asp.Net Web API 2
Posted
技术标签:
【中文标题】为啥当包含控制器动作的数据时日期时间值会发生变化?使用 AngularJs 和 Asp.Net Web API 2【英文标题】:Why Date time value change when contain data hit on controller action? Using AngularJs and Asp.Net Web API 2为什么当包含控制器动作的数据时日期时间值会发生变化?使用 AngularJs 和 Asp.Net Web API 2 【发布时间】:2019-07-13 22:05:15 【问题描述】:当我从客户端向服务器端发送数据时,日期时间类型“ReviewStartDate”和“ReviewEndDate”的两个属性会发生变化。客户端的两个属性日期时间不变。但是服务器端的两个属性值发生了变化。 怎样才能很好地解决这个问题?
客户端发送数据截图
点击控制器操作时的服务器端调试屏幕截图
转换为当地时间后
这是我的模型类
public class Product
public int ProductId get; set;
public DateTime? ReviewStartDate get; set;
public DateTime? ReviewEndDate get; set;
这是我的控制器
[HttpPost]
[Route("AddProduct")]
public IHttpActionResult AddProduct(Product product)
return Ok(services.AddProduct(product).Data);
【问题讨论】:
听起来像ReviewStartDate
和 ReviewEndDate
参数值将转换为 UTC 日期,因为这两个日期都减去了 6 小时的时间部分,如图所示。您可能希望将它们作为 UTC/ISO 时间传递,然后将它们转换为本地时间。
我在哪里转换这个?
我遇到的完全相同的问题,不知道日期在哪里减去 6 小时
【参考方案1】:
首先在 clint 方面,在将数据发送到服务器之前,将其转换为 UTC。但是你没有显示你的前端代码,我不知道在哪里。
但如果我正确理解您,您希望将 utc 转换为本地时间,并且仅在服务器端执行此操作。 (它会起作用,但老实说最好改变客户端)
您可以在启动文件中更改 json 选项:
services.AddMvc()
.AddJsonOptions(
opt => opt.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Local)
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
例如我发送这个:
“执行日期”:“2019-02-20T00:00:00.000Z”-UTC
并像这样序列化,对于我的当地时间:
2/20/19 凌晨 3:00:00
【讨论】:
【参考方案2】:Angular 在调用 post 方法时进行此转换。 通过 GitHub 上的 Angular 文档,社区开发人员说它不是由 Angular 完成的,这种转换是通过 JSON 序列化按照其 ISO 标准完成的。
从一个点来看是真的,
假设您在纽约并在东部时间下午 12:00 保存您的成绩,它 将到达后端服务器,并将作为下午 4:00 保存在数据库中 UTC。
当您在旧金山的朋友尝试访问您在 UI 上的记录时 浏览器,他将看到它,因为成绩已保存为太平洋时间上午 9:00。
这使得 对我有感觉。
但如果您希望您的朋友也希望看到在下午 12:00 保存的成绩,那么您必须做一些修改。
我花了几个小时发现有一些 3rd 方库,例如 moment.js,我们可以使用它们。
但是这个问题的解决方案是
发帖
在用户界面上
1) 将您的日期时间转换为字符串并将此字符串发送到后端
Date date = new Date();
var d = date.toDateString();
2) 将此字符串转换回日期时间并保存在数据库中。
DateTime dateTime = DateTime.Parse(d)
获取
在服务器上
1) 将日期时间(UTC 格式)后端转换为字符串。
DateTime dateTime = //from DataBase
Strind d = dateTime.ToString()
在用户界面上
2) 从后端获取此字符串到客户端 ui 并转换回日期时间
Date date = new Date(d);
【讨论】:
以上是关于为啥当包含控制器动作的数据时日期时间值会发生变化?使用 AngularJs 和 Asp.Net Web API 2的主要内容,如果未能解决你的问题,请参考以下文章
java - 为啥在java中的poll方法之后PriorityQueue中的值会发生变化? [复制]