[英]Why Date time value change when contain data hit on controller action? Using AngularJs and Asp.Net Web API 2
当我从客户端向服务器端发送数据时,日期时间类型“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);
}
首先在 clint 端,在将数据发送到服务器之前,将其转换为 UTC。 但是你没有显示你的前端代码,我不知道在哪里。
但是,如果我正确理解您,您想将 utc 转换为本地时间,并且仅在服务器端执行此操作。 (它会起作用,但老实说最好改变客户端)
您可以在启动文件中更改 json 选项:
services.AddMvc()
.AddJsonOptions(
opt => opt.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Local)
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
例如我发送这个:
"execution_date": "2019-02-20T00:00:00.000Z" - UTC
并像这样序列化我的本地时间:
2/20/19 3:00:00 上午
Angular 在调用 post 方法时进行这种转换。 通过 GitHub 上的 Angular 文档,社区开发人员说它不是由 Angular 完成的,这种转换是根据 ISO 标准通过 JSON 序列化完成的。
从一点来看,这是真的,
假设您在纽约并在美国东部时间下午 12:00 保存您的成绩,它将到达后端服务器,并将作为 UTC 下午 4:00 保存在数据库中。
当您在旧金山的朋友尝试在 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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.