【问题标题】:Incrementing and decrementing the date from where it stopped增加和减少停止的日期
【发布时间】:2017-09-21 02:25:14
【问题描述】:

这是我的控制器:

private day: any = '';
private add: number = 0;
private remove: number = 0;
private days: any = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];

dayBefore() {
    let now = new Date();
    this.remove += 1;
    let newDate = this.decrementDays(now, this.remove);
    this.day = this.days[newDate.getDay()];
}

dayAfter() {
    let now = new Date();
    this.add += 1;
    let newDate = this.incrementDays(now, this.add);
    this.day = this.days[newDate.getDay()];
}

dayToday() {
    let now = new Date();
    this.day = this.days[now.getDay()];
    this.add = 0;
    this.remove = 0;
}

decrementDays: any = function removeDay(date: any, days: any) {
    return new Date(date.getFullYear(), date.getMonth(), date.getDate() - days, date.getHours(), date.getSeconds(), date.getMilliseconds());
};

incrementDays: any = function addDay(date: any, days: any) {
    return new Date(date.getFullYear(), date.getMonth(), date.getDate() + days, date.getHours(), date.getSeconds(), date.getMilliseconds());
};

HTML:

<ul>
    <li (click)="dayBefore()"></li>
    <li (click)="dayToday()"></li>
    <li (click)="dayAfter()"></li>
</ul>

<span>{{day}}</span>

这个问题是,虽然递增和递减有效,但当我想在 dayAfter() 之后转到 dayBefore() 时,我不会立即转到前一天的日期。

如果我点击dayAfter(),它将带我到Tuesday(如果今天是Mondayand 当我点击dayBefore() 时,它会带我到Sunday,而不是星期一。我该如何解决这个问题?我知道为什么会这样。这是因为它是从今天的日期 (Monday) 开始计算的,而不是从我停止它的地方开始计算的。

谢谢大家。

【问题讨论】:

  • 只是备注,请不要写days: any = ["Sunday", ...,您正在丢弃有价值的信息并编写超出您需要的代码。请改写days = ["Sunday", ...
  • 只使用一个变量来跟踪添加/删除的天数。因此,不要使用两个变量 addremove,而是只使用一个变量,然后在 dayBeforedayAfter 函数中将其更改为一个。
  • 伙计们等一下:)
  • 仍然没有解决我提出的问题..
  • 你的函数和变量太多了。基本上就像@Titus说的那样。也不需要递增和递减。

标签: javascript html angular date typescript


【解决方案1】:

试试这个:

private day: any = '';
private add: number = 0;
private remove: number = 0;
private days: any = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];
private today = new Date();

dayBefore() {
    let newDate = this.decrementDays(1);
    this.day = this.days[newDate.getDay()];
}

dayAfter() {
    let newDate = this.incrementDays(1);
    this.day = this.days[newDate.getDay()];
}

dayToday() {
    this.today = new Date();
    this.day = this.days[this.today.getDay()];
}

decrementDays: any = function removeDay(days: any) {
let date = this.today;
this.today = new Date(date.getFullYear(), date.getMonth(), date.getDate() - days, date.getHours(), date.getSeconds(), date.getMilliseconds());
return this.today;
};

incrementDays: any = function addDay(days: any) {
let date = this.today;
this.today = new Date(date.getFullYear(), date.getMonth(), date.getDate() + days, date.getHours(), date.getSeconds(), date.getMilliseconds());
return this.today;
};

这可以进一步重构并且可以变得更简单。我刚刚做了一个快速修复。

【讨论】:

  • @eric.dummy 你现在面临什么问题?
  • @eric.dummy 它正在传递一个变量。我把它改成了一个常数。成功了吗?
  • dayToday() 不工作,其他一切似乎都工作正常 :)
  • @eric.dummy 您是否希望它始终是当前日期?
  • @eric.dummy 没问题 :)
【解决方案2】:
@Component({
  // boilerplate and ceremony
})
export class DayOfWeekComponent {
  days = [
    "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"
  ];

  dayOfWeek = new Date().getDay();

  resetDayOfWeek() {
    this.dayOfWeek = new Date().getDay();
  }

  offsetDayOfWeek(offset: number) {
    let dayOfWeek = (this.dayOfWeek + offset) % 7;
    if (dayOfWeek < 0) {
      dayOfWeek += 7;
    }
    this.dayOfWeek = dayOfWeek;
  }
}

模板:

<ul>
    <li (click)="offsetDayOfWeek(-1)">Previous</li>
    <li (click)="resetDayOfWeek()">Today</li>
    <li (click)="offsetDayOfWeek(1)">Next</li>
</ul>

<span>{{days[dayOfWeek]}}</span>

https://plnkr.co/edit/7is6uMGtkvcQ5V4VzqYp?p=preview

【讨论】:

  • 我有一个错误,因子是 7 而不是 6 :o
  • 我注意到了,已修复。 :) 8 天背后的逻辑是什么?
  • 好点,我也解决了这个问题。需要先取模数。
  • 你不需要,它仍然有效,但现在可能更干净了。 :) 谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
相关资源
最近更新 更多