【问题标题】:Use momentjs in angular to format time在角度中使用 momentjs 来格式化时间
【发布时间】:2014-10-01 01:55:42
【问题描述】:

我无法让 Angular 中的 Moment 像我想要的那样格式化我的时间。我有日期过滤器在这里工作:

<h4>{{event.date | amDateFormat:'MMMM Do'}}</h4>

但是当我尝试使用这种格式打印时间时,我的时间完全从浏览器中消失了。这是我正在输入的内容:

<div class="row">
           {{event.time | amDateFormat: 'h:mm a'}}
         </div>

如果这很重要,我正在使用 Firebase。另外,获取时间的输入是 HTML5 输入 type=time 属性。

【问题讨论】:

  • event.time 不代表有效的“日期”值

标签: angularjs time momentjs


【解决方案1】:

当您将type=time 用于输入时,该值将存储为仅表示时间的字符串,例如“1:00”或“13:00”。 amDateFormat 过滤器需要一个可以解释为日期的值,该日期可以是 Date 对象、时间戳的数字值或格式正确的字符串日期。您将使用type=time 获得的时间值不是有效的日期字符串,因此amDateFormat 无法正确解析该值。

使其工作的最简单方法是在使用 amDateFormat 过滤器之前连接 event.dateevent.time 的值:

<div class="row">
  {{event.date + ' ' + event.time | amDateFormat: 'h:mm a'}}
</div>

更好的解决方案是使用一个函数,您可以在其中传入日期和时间,或者只是时间,然后构造一个可以被解释为日期或日期对象的东西。 p>

<div class="row">
  {{ combine(event.date,event.time) | amDateFormat: 'h:mm a'}}
</div>

简单的合并函数

  $scope.combine = function(date,time) {
    if (date && time) {
      return date + ' ' + time;
    } else {
      return "";
    }
  };

我仍然认为必须像这样在时间上添加日期有点笨拙,但它确实有效,而且您甚至可能最终在您的数据模型中将它们连接在一起。我认为最好的解决方案是只拥有一个 event.dateAndTime 对象,您可以使用它来表示日期和时间both - 您可以使用type=datetime-local html5 类型(至少在 Chrome 中它对我有用)。

<dir>Date and time: <input type="datetime-local" ng-model="event.datetime"></dir>
<h4>{{event.datetime | amDateFormat:'MMMM Do'}}</h4>
<div class="row">
  event.datetime time: {{ event.datetime | amDateFormat: 'h:mm a'}}
</div>

这是一个正常工作的插件:http://plnkr.co/edit/OERKK9ilxFwUlKLKirtl?p=preview

【讨论】:

  • 非常感谢——我使用了你的第二个解决方案(创建一个函数),效果很好。你做主。
  • @Margaret 如果我的回答对你有用,请不要忘记accept my answer
  • 非常好的答案。谢谢!
  • 为什么我们不能使用 angularJs 中的默认日期过滤器进行这种类型的格式化。
  • 您可以使用默认日期过滤器进行这种类型的(时间)格式化,请参阅更新的 plunker:plnkr.co/edit/OERKK9ilxFwUlKLKirtl?p=preview
猜你喜欢
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
  • 2015-09-08
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多