【问题标题】:Dates, Angularjs, WebAPI日期,Angularjs,WebAPI
【发布时间】:2017-10-26 19:03:11
【问题描述】:

对于如何处理 Angularjs 和 WebAPI 之间的日期,我们一直有一些真正的困惑。我们只关心日期,不关心时间或时区。角度站点将日期对象发布回我们的 api,但日期对象上仍然有时区,因此,根据用户所在的位置,保存的日期会相差一天。

我宁愿不必逐个处理这些日期,所以我们为所有的 put 和 post 放置了一个 http 拦截器,它循环通过所有表单字段并剥离时区日期并只返回日期但是这感觉不对。

关于处理此问题的最佳方法有什么建议吗?

更新:

如果有帮助,请提供更多详细信息。我们正在使用 kendo 日期选择器并使用 k-ng-model 设置模型值。这有助于我们获得一个有效的 Date 对象。今天我删除了拦截器并添加了以下内容:

               kendo.ui.DatePicker.prototype.valueOld = kendo.ui.DatePicker.prototype.value;
           kendo.ui.DatePicker.prototype.value = function (e) {
               var val = this._value;
               if (val != null) {
                   this._value = moment(val).format("YYYY-MM-DD");
               }
               return this.valueOld(e);
           }

现在,当用户更改日期时,模型值将只是日期,而时区在发送回 API 时会被忽略。

在将日期发送到前端的 API 中,我们有一个格式化程序,它也去除了时区:

config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(
            new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd" });

我不希望我们的开发人员单独处理日期。我们最初是这样做的,代码中没有一致性。

【问题讨论】:

  • 您应该使用 UTC 日期。剥离时区而不将日期转换为 UTC 可能会导致更多错误。
  • 你想多了。 UTC 一切,忽略时间。

标签: javascript angularjs date datetime asp.net-web-api


【解决方案1】:

以 UTC 格式发送和接收您的日期。在 Web API 中,您可以添加它,以便假设DateTime 实例的属性Kind 设置为DateTimeKind.Utc,则发送的所有内容都将作为UTC 发送。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // add this to whatever code you have now
        config.SetTimeZoneInfo(TimeZoneInfo.Utc);
    }

angularjsISO8601 格式发送您的日期为UTC yyyy-MM-ddTHH:mm:ss.fffffZ。然后,您只需担心用于显示日期的任何 UI 控件中的时间部分。

【讨论】:

  • 我认为 Jon 的情况令人困惑,因为他的 api 期望给定字段是 Day(这是 Time Range)而不是 DateTime,这是 Time Moment。那么我们应该使用Moment 来表示听起来不正确的Day,还是使用两个Moments 来表示Day 这是Time Range,还是有更好的方法?无论如何,无论我使用什么语言,日期通常都有令人困惑的实现,但值得讨论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-17
  • 2017-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多