web-dev-qa-db-ja.com

指定された曜日に与えられた次の日付を取得する瞬間

特定の日付を指定すると、前の月曜日を取得するのに少し問題があるようです。タスクにMoment jsを使用しようとしています。明らかに、私は手でそれを行うことができますが、彼らのウェブサイト上のmoment.jsドキュメントの例を使用してそれを動作させることができなかったことに興味がありました: http://momentjs.com/docs/#/get-set/day /

私は次のようなものを試していました:

moment([2013, 08, 15, 15, 20]).day(-1).format('ddd, MMM DD')

結果は「2日前」の日付になり、9月9日ではなく9月13日となります。

ここに誰か手がかりがありますか?ありがとう。

26

仕組みは次のとおりです。

_moment().day(1) // this monday
moment().day(-6) // last monday, think of it as this monday - 7 days = 1 - 7 = -6
_

同じことが他の方向にも当てはまります。

_moment().day(8) // next monday, or this monday + 7 days = 1 + 7 = 8
_

コードmoment().day(-1)は、この日曜日-1日= 0-1 = -1またはこの土曜日-7日= 6-7 = -1として説明できます。

56
mechanicalfish

受け入れられた回答は、問題の日が今週か来週かを既に知っている場合にのみ機能します。わからない場合はどうしますか?任意の日付の次の利用可能な木曜日が必要ですか?

まず、問題の日が希望の日よりも小さいか大きいかを知りたいです。大きい場合は、来週を使用します。小さい場合は、同じ週の月曜日または木曜日を使用できます。

_const dayINeed = 4; // for Thursday
if (moment().isoWeekday() <= dayINeed) { 
  return moment().isoWeekday(dayINeed);
} else...
_

すでに希望の日を過ぎている場合(たとえば、モーメントが金曜日で、次の利用可能な木曜日が必要な場合)、「私たちの瞬間の次の週の木曜日」を提供するソリューションが必要です。私たちの瞬間が何であるかに関係なく、命令的な加算/減算はありません。簡単に言えば、moment().add(1, 'weeks')を使用して、まず来週に行きたいと思います。次の週に来たら、moment().day(1)を使用して、その週の任意の曜日を選択できます。

これにより、最初の瞬間が週のどこにあるかに関係なく、要件を満たす次の利用可能な日になります。

_const dayINeed = 4; // for Thursday

// if we haven't yet passed the day of the week that I need:
if (moment().isoWeekday() <= dayINeed) { 
  // then just give me this week's instance of that day
  return moment().isoWeekday(dayINeed);
} else {
  // otherwise, give me next week's instance of that day
  return moment().add(1, 'weeks').isoWeekday(dayINeed);
}
_

参照: https://stackoverflow.com/a/27305748/800457

14
XML

ポイントは、day()またはisoWeekday()を使用すると、今日の曜日に関係なく、現在の週の日付を取得できることだと思います。結果として、あなたが得る日付は過去か、またはまだ来ている可能性があります。

例:

今日が水曜日の場合、moment().isoWeekday(5).format()は次の金曜日の日付を返します。

moment().isoWeekday(1).format()は前の月曜日を返します。

したがって、たとえば「先週の火曜日」の日付が必要な場合、この日付は、今日の曜日に応じて、現在の週または前の週に属する可能性があります。

最後のdayOfTheWeekの日付を取得するための可能な関数は

function getDateOfPreviousDay(dayOfTheWeek) {
  currentDayOfTheWeek = moment().isoWeekday();   
  if ( currentDayOfTheWeek >= dayOfTheWeek ) {
    return moment().isoWeekday(dayOfTheWeek).format(); // a date in the current week
  }
  else {
    return moment().add(-1,'weeks').isoWeekday(dayOfTheWeek).format(); // a date in the previous week
  }
}
1
tHomas