【问题标题】:How do I exclude dates from angular material datepicker?如何从角度材料日期选择器中排除日期?
【发布时间】:2019-04-25 23:49:41
【问题描述】:

我正在使用 Angular Material,并且我有一个动态的日期数组,我希望从我的日期选择器中排除这些日期。此外,我还试图排除星期六。如何使用 matDatepickerFilter 返回多个日期? 请记住,我不能单独对数组的每个项目进行硬编码,因为数组是流动的,一段时间后它的值和长度都会发生变化。

这是我的 HTML:

<mat-form-field style="text-align: center;"
[ngClass]="{'hideTitle': submitted && f4.houseNumber.errors?.required && f4.aptNumber.errors?.required}">
    <input matInput 
      [matDatepicker]="picker" 
      placeholder="Desired Delivery Date" 
      [matDatepickerFilter]="myFilter"
      formControlName="deliveryDate" 
      style="font-family: 'Open Sans Condensed', sans-serif; color:white;">
    <mat-datepicker-toggle matSuffix [for]="picker" 
    style="color:gold;outline:none;"></mat-datepicker-toggle>
    <mat-datepicker touchUi #picker disabled="false"></mat-datepicker>
</mat-form-field>

这是我的数组:

this.allDupedDates = [
  new Date('2019-04-30T00:00:00+02:00'),
  new Date('2019-04-28T00:00:00+02:00'),
  new Date('2019-05-21T00:00:00+02:00'),
  new Date('2019-05-23T00:00:00+02:00')
]

这是代码:

myFilter = (d: Date): boolean => {
 const time = d.getTime();
 const day = d.getDay();
for (let i = 0; i < this.allDupedDates.length; i++) {
  var date = this.allDupedDates[i].getTime();
  return time !== date
}
return day !== 6;
}

【问题讨论】:

  • 您确认d 和所有allDupDates 已将小时/分钟/秒/毫秒设置为0 吗?另外,任何 allDupDates 都可以是星期六吗?最好在for 之前有if (day === 6) {return false;}
  • 小时/分钟/秒/毫秒设置为 0。如果我返回 false 则每个日期都无效。
  • 时区表示小时不为零 - 例如,(new Date('2019-05-23T00:00:00+02:00').getTime() / (1000 * 60 * 60)) % 24 返回 22。所以最好比较时间部分是否与您给出的“d”相匹配 - 例如, displaytime % (1000 * 60 * 60 * 24)date % (1000 * 60 * 60 * 24) 以确保比较。返回false时,是否切换了比较(注意我有=== 6,而不是原来的!== 6)?

标签: angular typescript datepicker angular-material


【解决方案1】:

您需要的过滤代码:

myFilter = (d: Date): boolean => {
  const day = d.getDay();
  const blockedDates = this.allDupedDates.map(d => d.valueOf());
  return (!blockedDates.includes(d.valueOf())) && day !== 6;
}

- 使用 valueOf() 方法可以轻松地将日期对象相互比较,该方法返回它们自纪元以来的毫秒数。

需要注意的重要提示:

  • 确保您在 dupedDates 中创建的日期对象与执行过滤器的时区相同。这样可以确保时区相同,并且不会出现时区偏移问题。 例如:2019 年 4 月 30 日 00:00:00 更改为 2019 年 4 月 29 日 23:30:00。
  • 过滤器函数中的参数 d:Date 将始终提供代表客户端位置时区午夜的日期。例如:如果从印度访问应用程序:d 将包含 2019 年 4 月 29 日 00:00:00 +05:30、2019 年 4 月 30 日 00:00:00 +05:30,依此类推...

StackBlitz 示例:https://stackblitz.com/edit/angular-datepicker-filter-so?file=app%2Fdatepicker-filter-example.ts

【讨论】:

  • 非常感谢!现在是凌晨 4 点,我仍在努力解决这个问题。你帮了大忙!
  • 好答案 :) 请注意,虽然 getTime() 和 valueOf() 基本相同,但 getTime() 是应该使用的。请参阅 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 并注意“此方法通常由 JavaScript 内部调用,而不是在代码中显式调用。”
  • @JulianDave 很高兴为您提供帮助!如果此答案解决了您的问题,请单击答案旁边的复选标记将其标记为已接受。谢谢!
猜你喜欢
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-23
相关资源
最近更新 更多