繁体   English   中英

为什么在控制器操作上包含数据时日期时间值会发生变化? 使用 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

当我从客户端向服务器端发送数据时,日期时间类型“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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM