九保すこひ@フリーランスエンジニア|累計300万PVのブログ運営中
さてさて、全89項目!Moment.js日付の操作&比較・実例の記事ではMoment.jsを使って時間を進めたり、過去・未来のものであるかをチェックする方法を紹介しました。
そして今回はMoment.jsの第3回として、年
、月
、日
、時
、分
、秒
など各日付データの取得と設定(つまりSetterとGetter)をする実例集をお届けします。
ぜひ効率的なコード構築のために役立ててください。
実行環境
Moment.js: バージョン 2.22.2(日本語対応コードも読み込んでいるものとします)
目次
- 1 各日付データの取得
- 1.1 year()で年を取得する
- 1.2 month()で月を取得する
- 1.3 date()で日を取得する
- 1.4 hour()で時を取得する
- 1.5 minute()で分を取得する
- 1.6 second()で秒を取得する
- 1.7 millisecond()でミリ秒を取得する
- 1.8 day()で曜日番号を取得する
- 1.9 weekday()でローカルの曜日番号を取得する
- 1.10 isoWeekday()でISO形式の曜日番号を取得する
- 1.11 dayOfYear()で年の何日目かを取得する
- 1.12 week()で年の何週目かを取得する
- 1.13 isoWeek()で年の何週目かをISO形式で取得する
- 1.14 quarter()で4半期(3ヵ月ごとの)番号を取得する
- 1.15 weekYear()で週年を取得する
- 1.16 isoWeekYear()で週年をISO形式で取得する
- 1.17 weeksInYear()で年に何週間あるか取得する
- 1.18 isoWeeksInYear()で年に何週間あるかをISO形式で取得する
- 1.19 get()で各日付データを取得する
- 1.20 fromNow()で現在時間からどれだけ差があるか取得する
- 1.21 from()で基準の時間からどれだけ差があるか取得する
- 1.22 toNow()で現在時間へどれだけ差があるか取得する
- 1.23 to()で基準の時間へどれだけ差があるか取得する
- 1.24 calendar()で相対的に見た日付データを取得する
- 1.25 diff()で2つの日付の差を取得する
- 1.26 valueOf()でタイムスタンプ(ミリ秒)を取得する
- 1.27 unix()でタイムスタンプ(秒)を取得する
- 1.28 daysInMonth()で月に何日あるかを取得する
- 1.29 toDate()でJavaScriptのDateオブジェクトを取得する
- 1.30 toArray()で各種日付データを配列として取得する
- 1.31 toJson()でJSON用の日付を取得する
- 1.32 toISOString()でISO8601形式の日付データを取得する
- 1.33 toObject()で各種日付データをオブジェクトとして取得する
- 1.34 toString()で日付データをテキストで取得する
- 1.35 inspect()で検査用文字列を取得する
- 2 各日付データの設定
- 2.1 year()で年を設定する
- 2.2 month()で月を設定する
- 2.3 date()で日を設定する
- 2.4 hour()で時を設定する
- 2.5 minute()で分を設定する
- 2.6 second()で秒を設定する
- 2.7 millisecond()でミリ秒を設定する
- 2.8 day()で曜日番号を設定する
- 2.9 weekday()でローカルの曜日番号を設定する
- 2.10 isoWeekday()でISO形式の曜日番号を設定する
- 2.11 dayOfYear()で年の何日目かを設定する
- 2.12 week()で年の何週目かを設定する
- 2.13 isoWeek()で年の何週目かをISO形式で設定する
- 2.14 quarter()で4半期(3ヵ月ごとの)番号を設定する
- 2.15 weekYear()で週年を設定する
- 2.16 isoWeekYear()で週年をISO形式で設定する
- 2.17 set()で各日付データを設定する
- 3 対応する月データ
- 4 対応する曜日番号
- 5 終わりに
各日付データの取得
year()で年を取得する
例えば、「2018年1月1日」の年データ(Number型)を取得する場合です。
moment('2018-01-01').year(); // 2018
years()
も同じ結果になります。
month()で月を取得する
例えば、「2018年11月22日」の月データ(Number型)を取得する場合です。
moment('2018-11-22').month(); // 10(ゼロから始まる数字)
ここで注意が必要なのは、month()
で取得できるデータはゼロから始まる数値だということです。
※ 詳しい月データは対応する月データをご覧ください。
months()
も同じ結果になります。
date()で日を取得する
例えば、「2018年11月22日」の日データ(Number型)を取得する場合です。
moment('2018-11-22').date(); // 22
直感的に日の取得はday()
を使ってしまいがちですが、実際にはdate()
なので注意してください。
dates()
も同じ結果になります。
hour()で時を取得する
例えば、「2018年1月1日 17時00分」の時データ(Number型)を取得する場合です。
moment('2018-01-01 17:00').hour(); // 17
hours()
も同じ結果になります。
minute()で分を取得する
例えば、「2018年1月1日 17時35分」の分データ(Number型)を取得する場合です。
moment('2018-01-01 17:35').minute(); // 35
minutes()
も同じ結果になります。
second()で秒を取得する
例えば、「2018年1月1日 17時35分22秒」の秒データ(Number型)を取得する場合です。
moment('2018-01-01 17:35:22').second(); // 22
seconds()
も同じ結果になります。
millisecond()でミリ秒を取得する
例えば、「2018年1月1日 17時35分22.999秒」のミリ秒データ(Number型)を取得する場合です。
moment('2018-01-01 17:35:22.999').millisecond(); // 999
milliseconds()
も同じ結果になります。
day()で曜日番号を取得する
例えば、「2018年8月29日(水)」の曜日番号(Number型)を取得する場合です。
moment('2018-08-29').day(); // 3
取得できる数値は0〜6
です。
※ 詳しい曜日番号は、対応する曜日番号をご覧ください。
days()
も同じ結果になります。
weekday()でローカルの曜日番号を取得する
例えば、「2018年8月29日(水)」の曜日番号(Number型)をローカル形式で取得する場合です。
moment('2018-08-29').weekday(); // 3
このメソッドは、現在適用されているローカル設定の曜日番号が適用されます。つまり、週がゼロから始まる場合は0〜6
、1から始まる場合は1〜7
が取得されます。
もし固定した数字にしたい場合は、day()かisoWeekday()を使いましょう。
isoWeekday()でISO形式の曜日番号を取得する
例えば、「2018年8月26日(日)」の曜日番号(Number型)をISO形式取得する場合です。
moment('2018-08-26').isoWeekday(); // 7
1〜7
の曜日番号が取得できます。
※ 詳しい曜日番号は、対応する曜日番号をご覧ください。
dayOfYear()で年の何日目かを取得する
例えば、「2018年8月29日」が年の何日目かを取得する場合です。
moment('2020-08-29').dayOfYear(); // 242
うるう年を含めると、取得できる数値は1〜366
となります。
moment('2020-12-31').dayOfYear(); // 366(うるう年)
week()で年の何週目かを取得する
例えば、「2018年8月29日」が年の何週目かを取得する場合です。
moment('2018-08-29').week(); // 35
weeks()
も同じ結果になります。
isoWeek()で年の何週目かをISO形式で取得する
例えば、「2018年8月29日」が年の何週目かを取得する場合です。
moment('2018-08-29').isoWeek(); // 35
※ week-year(週年)についてはこちらをご覧ください。
isoWeeks()
も同じ結果になります。
quarter()で4半期(3ヵ月ごとの)番号を取得する
moment('2018-03-31').quarter(); // 1
つまり、取得できる数値は1〜4
となります。
quarters()
も同じ結果になります。
weekYear()で週年を取得する
moment('2018-01-01').weekYear(); // 2018
※ week-year(週年)についてはこちらをご覧ください。
isoWeekYear()で週年をISO形式で取得する
moment('2018-01-01').isoWeekYear(); // 2018
※ week-year(週年)についてはこちらをご覧ください。
weeksInYear()で年に何週間あるか取得する
moment('2018-01-01').weeksInYear(); // 52
isoWeeksInYear()で年に何週間あるかをISO形式で取得する
moment('2018-01-01').isoWeeksInYear(); // 52
※ week-year(週年)についてはこちらをご覧ください。
get()で各日付データを取得する
「年月日時分秒」を取得する場合です。
moment('2018-08-29').get('year'); // 2018 moment('2018-08-29').get('month'); // 7(※ゼロから始まる数字) moment('2018-08-29').get('date'); // 29(※「day」ではない) moment('2018-08-29').get('hour'); // 17 moment('2018-08-29 17:33').get('minute'); // 33 moment('2018-08-29 17:30:25').get('second'); // 25 moment('2018-08-29 17:30:25.999').get('millisecond'); // 999
fromNow()で現在時間からどれだけ差があるか取得する
例えば、「2018年1月1日」から現在時刻がどのくらい離れているかを取得する場合です。
moment('2018-01-01').fromNow(); // 8ヶ月前
※英語環境の場合は8 months ago
となります。
※逆に現在時間へどれだけ差があるか取得したい場合はtoNow()を使ってください。
もし「前」「後」が不要な場合は、引数にtrue
を指定してください。
moment('2018-01-01').fromNow(true); // 8ヶ月
from()で基準の時間からどれだけ差があるか取得する
例えば、「2018年1月1日」から、「2018年4月1日」はどれだけ差があるかを取得する場合です。
var baseTime = moment('2018-01-15'); moment('2018-04-01').from(baseTime); // 3ヶ月後
ちなみにfrom()
は、momentオブジェクトだけでなく、配列なども指定することができます。
moment('2018-04-01').from([2018, 0, 15]); // 3ヶ月後。0は1月 moment('2018-04-01').from(new Date(2018, 0, 15)); // 3ヶ月後 moment('2018-04-01').from('2018-01-15'); // 3ヶ月後
もし「前」「後」が不要な場合は、第2引数にtrue
を指定してください。
moment('2018-04-01').from('2018-01-15', true); // 3ヶ月
※基準の時間へどれだけ差があるを取得する場合はto()を使ってください。
toNow()で現在時間へどれだけ差があるか取得する
例えば、「2018年1月1日」へ現在時刻からどのくらい離れているかを取得する場合です。
moment('2018-01-01').toNow(); // 8ヶ月後
※英語環境の場合はin 8 months
となります。
※逆に現在時間からどれだけ差があるか取得したい場合はfromNow()を使ってください。
もし「前」「後」が不要な場合は、引数にtrue
を指定してください。
moment('2018-01-01').toNow(true); // 8ヶ月
to()で基準の時間へどれだけ差があるか取得する
例えば、「2018年4月1日」へ「2018年1月15日」からどれだけ差があるかを取得する場合です。
var baseTime = moment('2018-01-15'); moment('2018-04-01').to(baseTime); // 3ヶ月前
ちなみにto()
は、momentオブジェクトだけでなく、配列なども指定することができます。
moment('2018-04-01').to([2018, 0, 15]); // 3ヶ月前。0は1月 moment('2018-04-01').to(new Date(2018, 0, 15)); // 3ヶ月前 moment('2018-04-01').to('2018-01-15'); // 3ヶ月前
もし「前」「後」が不要な場合は、第2引数にtrue
を指定してください。
moment('2018-04-01').to('2018-01-15', true); // 3ヶ月
※基準の時間からどれだけ差があるを取得する場合はfrom()を使ってください。
calendar()で相対的に見た日付データを取得する
例えば、明日から見た現在の日時を取得する場合です。
var tomorrow = moment('2018-01-02 17:00'); // 明日 var now = moment('2018-01-01 15:00'); now.calendar(tomorrow); // 昨日 15:00(明日から見た相対的な日付)
ちなみに表示形式には以下のようなものがあります。
- 先週木曜日 23:00
- 日曜日 23:00
- 今日 20:00
- 明日 21:00
- 来週火曜日 23:00
- 2018/08/15
なお、calendar()
の第2引数には表示フォーマットを指定することができます。
moment().calendar(null, { sameDay: '[きょう]', nextDay: '[あす]', nextWeek: 'dddd', lastDay: '[きのう]', lastWeek: '[前の] dddd', sameElse: 'YYYY年MM月DD日' });
※日付フォーマットとして置き換えたくない文字は、[
と]
の括弧で囲みます。
また、各フォーマットにはコールバック関数を指定することもできます。例は、日曜日の場合だけ表示を変えるコードです。
moment().calendar(null, { sameDay: function (now) { if(now.weekday() == 0) { // 日曜日 return '[今日(いい休日を!)]'; } return '[今日]'; } });
diff()で2つの日付の差を取得する
例えば、「2018年1月1日」と「2018年1月2日」の差をミリ秒で取得する場合です。
var dt1 = moment('2018-01-01'); var dt2 = moment('2018-01-02'); dt1.diff(dt2); // -86400000
注意が必要なのは、逆にdt2
を基準とした場合はプラスの数字になることです。
dt2.diff(dt1); // 86400000
また、第2引数にyears
やmonths
などを指定すると、そのフォーマットでデータを取得することができます。
var dt1 = moment('2018-01-01'); var dt2 = moment('2019-01-01'); // 1年後の日付 dt2.diff(dt1, 'years'); // 1 dt2.diff(dt1, 'months'); // 12 dt2.diff(dt1, 'days'); // 365 dt2.diff(dt1, 'hours'); // 8760 dt2.diff(dt1, 'minutes'); // 525600 dt2.diff(dt1, 'seconds'); // 31536000 dt2.diff(dt1, 'milliseconds'); // 31536000000
valueOf()でタイムスタンプ(ミリ秒)を取得する
moment().valueOf(); // 1535557480209
ちなみに以下でも同じ結果になります。
+moment(); //1535557480209
unix()でタイムスタンプ(秒)を取得する
moment().unix(); // 1535557585
daysInMonth()で月に何日あるかを取得する
例えば、1月と2月の日数を取得する場合です。
moment('2018-01-01').daysInMonth(); // 31(日) moment('2018-02-01').daysInMonth(); // 28(日)
toDate()でJavaScriptのDateオブジェクトを取得する
var date = moment().toDate(); // Dateオブジェクト
toArray()で各種日付データを配列として取得する
例えば、「2018年8月29日、17時30分25.999秒」を配列で取得する場合です。
var dateArray = moment().toArray();
取得できるデータは、以下のようになります。
[2018, 7, 29, 17, 30, 25, 999]
データの並びは、
- 年
- 月(ゼロから始まる数字。詳しくは対応する月データをご覧ください。)
- 日
- 時
- 分
- 秒
- ミリ秒
となります。
toJson()でJSON用の日付を取得する
moment('2018-08-29 17:30:25.999').toJSON(); // 2018-08-29T08:30:25.999Z(ISO8601)
ここで注意が必要なのは、取得できるのはJSONデータではなく、JSON用の日付データ(String型)だという点です。
つまり、もしJSONにしたい場合は以下のようにstringify()
を使う必要があります。
JSON.stringify({ postDate : dateForJson });
また、日付フォーマットを変更する場合は以下のよう事前にフォーマットを指定しておきます。
moment.fn.toJSON = function() { return this.format('YYYY年MM月DD日'); };
なお、以下のように直接シリアライズ化する場合は自動的にISO8601の文字列にしてくれます。
JSON.stringify({ postDate : moment('2018-08-29 17:30:25.999') });
toISOString()でISO8601形式の日付データを取得する
moment().toISOString(); // 2018-08-29T16:16:58.236Z
もしUTCへの変換をしたくない場合は第1引数にtrue
を指定してください。
moment().toISOString(true); // 2018-08-30T01:21:48.792+09:00
toObject()で各種日付データをオブジェクトとして取得する
例えば、「2018年8月29日、17時30分25.999秒」を配列で取得する場合です。
var dateObject = moment().toObject();
取得できるデータは、以下のようになります。
{ date: 29, // 「day」ではない hours: 17, milliseconds: 999, minutes: 30, months: 7, // ゼロから始まる数字 seconds: 25, years: 2018 }
toString()で日付データをテキストで取得する
moment('2018-08-29 17:30:25.999').toString(); // Wed Aug 29 2018 17:30:25 GMT+0900
※ ただし、日本語環境にしていても取得できるデータは英語です。
inspect()で検査用文字列を取得する
moment('2018-08-29 17:30:25.999').inspect(); // moment("2018-08-29T17:30:25.999")
※ 主な用途はデバッグです。
各日付データの設定
year()で年を設定する
例えば、「2018年1月1日」の年データを2020年にする場合です。
moment('2018-01-01').year(2020); // 2020年1月1日
years()
も同じ結果になります。
month()で月を設定する
例えば、「2018年1月1日」の月データを10月にする場合です。
moment('2018-01-01').month(9); // 2018年10月1日
ここで注意が必要なのは、month()
で設定できるデータはゼロから始まる数値だということです。
※ 詳しい月データは対応する月データをご覧ください。
months()
も同じ結果になります。
date()で日を設定する
例えば、「2018年1月1日」の日データを22日に設定する場合です。
moment('2018-01-01').date(22); // 2018年1月22日
直感的に日の設定はday()
を使ってしまいがちですが、実際にはdate()
なので注意してください。
dates()
も同じ結果になります。
hour()で時を設定する
例えば、「2018年1月1日 17時00分」の時データを20時に設定する場合です。
moment('2018-01-01 17:00').hour(20); // 2018年1月1 20:00
hours()
も同じ結果になります。
minute()で分を設定する
例えば、「2018年11月22日 17時35分」の分データを20分に設定する場合です。
moment('2018-01-01 17:35').minute(20); // 2018年1月1日 17:20
minutes()
も同じ結果になります。
second()で秒を設定する
例えば、「2018年11月22日 17時35分22秒」の秒データを55秒に設定する場合です。
moment('2018-01-01 17:35:22').second(55); // 2018年1月1日 17:35:55
seconds()
も同じ結果になります。
millisecond()でミリ秒を設定する
例えば、「2018年11月22日 17時35分22.999秒」のミリ秒データを111に設定する場合です。
moment('2018-01-01 17:35:22.999').millisecond(111); // 2018年1月1日 17:35:22.111
milliseconds()
も同じ結果になります。
day()で曜日番号を設定する
例えば、「2018年8月29日(水)」を今週日曜日に設定する場合です。
moment('2018-08-29').day(0); // 2018年8月26日(日)
つまり、指定する数値が0〜6
の場合は、今週の日付となります。
なお、数値にはマイナスを含めた他の数値も指定することができます。
例えば、「2018年8月29日(水)」を先週日曜日に設定する場合は以下のようになります。
moment('2018-08-29').day(-7); // 2018年8月19日(日)
※ 詳しい曜日番号は、対応する曜日番号をご覧ください。
days()
も同じ結果になります。
weekday()でローカルの曜日番号を設定する
例えば、「2018年8月29日(水)」を今週日曜日に設定する場合です。
moment('2018-08-29').weekday(0); // 2018年8月26日(日)
このメソッドは、現在適用されているローカル設定の曜日番号が適用されます。つまり、週がゼロから始まる場合は0〜6
、1から始まる場合は1〜7
が適用されます。
なお、マイナスを含めた他の数値も有効です。
isoWeekday()でISO形式の曜日番号を設定する
例えば、「2018年8月29日(水)」を今週月曜日に設定する場合です。
moment('2018-08-29').isoWeekday(1); // 2018年8月27日(月)
1〜7
の曜日番号を基準とした数値を指定できます。
なお、マイナスを含めた他の数値も有効です。
※ 詳しい曜日番号は、対応する曜日番号をご覧ください。
dayOfYear()で年の何日目かを設定する
例えば、日付を「2018年8月29日」に設定する場合です。
moment('2020-01-01').dayOfYear(242); // 2020年8月29日, 年の242日目は、8月29日
うるう年の最終日に設定する場合はこうなります。
moment('2020-01-01').dayOfYear(366); // 2020年12月31日, うるう年
なお、マイナスの数値も有効です。
week()で年の何週目かを設定する
例えば、「2018年1月1日」に年の2週目を設定する場合です。
moment('2018-01-01').week(2); // 2018年1月8日
このメソッドは実行環境の週がゼロではじまるか、1で始まるかで結果が変わってきます。
weeks()
も同じ結果になります。
isoWeek()で年の何週目かをISO形式で設定する
例えば、「2018年1月1日」に年の2週目を設定する場合です。
moment('2018-01-01').isoWeek(2); // 2018年1月8日
※ week-year(週年)についてはこちらをご覧ください。
isoWeeks()
も同じ結果になります。
quarter()で4半期(3ヵ月ごとの)番号を設定する
moment('2018-01-01').quarter(2); // 2018年4月1日
quarters()
も同じ結果になります。
weekYear()で週年を設定する
moment('2018-01-01').weekYear(2020); // 2019年12月30日
※ week-year(週年)についてはこちらをご覧ください。
isoWeekYear()で週年をISO形式で設定する
moment('2018-01-01').isoWeekYear(2020); // 2019年12月30日
※ week-year(週年)についてはこちらをご覧ください。
set()で各日付データを設定する
「年月日時分秒」を設定する場合です。
moment('2018-08-29').set('year', 2020); // 2020年8月29日 moment('2018-08-29').set('month', 7); // 2020年8月29日(※ゼロから始まる数字を指定) moment('2018-08-29').set('date', 15); // 2020年8月15日(※「day」ではない) moment('2018-08-29 17:00').set('hour', 8); // 2018年8月29日 08:00 moment('2018-08-29 17:33').set('minute', 8); // 2018年8月29日 17:08 moment('2018-08-29 17:30:25').set('second', 8); // 2018年8月29日 17:30:08 moment('2018-08-29 17:30:25.999').set('millisecond', 111); // 2018年8月29日 17:30:25.111
対応する月データ
- 0 ・・・ 1月
- 1 ・・・ 2月
- 2 ・・・ 3月
- 3 ・・・ 4月
- 4 ・・・ 5月
- 5 ・・・ 6月
- 6 ・・・ 7月
- 7 ・・・ 8月
- 8 ・・・ 9月
- 9 ・・・ 10月
- 10 ・・・ 11月
- 11 ・・・ 12月
対応する曜日番号
(ゼロから始まる場合)
- 0 ・・・ 日
- 1 ・・・ 月
- 2 ・・・ 火
- 3 ・・・ 水
- 4 ・・・ 木
- 5 ・・・ 金
- 6 ・・・ 土
(1から始まる場合)
- 7 ・・・ 日
- 1 ・・・ 月
- 2 ・・・ 火
- 3 ・・・ 水
- 4 ・・・ 木
- 5 ・・・ 金
- 6 ・・・ 土
終わりに
ということで、今回Moment.jsのSetter、Getter、その他のデータ取得をまとめてみました。
ただ、今回の作業で一番はじめに感じたことは以下の2点でした。
- day()は日データのメソッドではない。直感的にはdate()ではなくこちらの方がいいのでは・・・???
- 海外の月名がテキストなので仕方ないといえば仕方ないんですが、やはり月データだけゼロから始まる数字というのに違和感があります。なんとか設定できないものかな??
他にはcalendar()で相対的に見た日付データというのが、とても便利なんじゃないかと思いました。こういう計算を自動的にやってくれるってホント作業効率の向上につながります。
みなさんは、どの項目に注目したでしょうか。
ぜひ作業の効率化に役立ててくださいね。
ではでは!