为啥当包含控制器动作的数据时日期时间值会发生变化?使用 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);
    

【问题讨论】:

听起来像 ReviewStartDateReviewEndDate 参数值将转换为 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的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的数组值会发生变化? [复制]

为啥将数据导出到 Excel 时日期格式会发生变化?

为啥 Keras Dropout 中的非零值会发生变化?

java - 为啥在java中的poll方法之后PriorityQueue中的值会发生变化? [复制]

为啥 GL_MAX_UNIFORM_BLOCK_SIZE 的值会发生变化?

为啥jquery看不到html的变化? [复制]