moment.jsで午前1時30分を "25:30" という文字列で出力させる。
moment.jsで午前1時30分を "25:30" という文字列で出力させる。:
以上です。30分ぐらいでざっくり書いたコードですので、見落としがあるかもしれません。
何かツッコミあれば下さい。
実現したいこと
- 午前(つまり深夜の)1時30分を、
"01:30"
ではなくて、"25:30"
と表示させたい。 - 時間を加える演算、例えば「25時30分の2.25時間後は、27時45分」ということも実現したい。
書いたコード
- 上記の、実現したいことは、Moment.js にちょっと手を入れたらできるのでは?と思ったので、ざっくりスパイクしてみました。
-
書いたコードは、以下のレポジトリにあります。
- Momentに手を入れてるコードは以下の
momentH25conf(startHour)
です。
function momentH25conf(startHour) { // checking the parameter "startHour" if (!Number.isInteger(startHour)) return; if (startHour <= 0 || startHour > 12) return; // add getter "hhmm" moment() .constructor .prototype .__defineGetter__('hhmm', function() { let hour = this.hour(); if (hour < startHour) hour += 24; const hh = `${hour < 10 ? '0':''}${hour}`; return `${hh}:${this.format('mm')}`; }); // enhance moment() to handle the parameter with "HH:mm"(HH >= 25) format String const _moment = moment; window.moment = function() { if (arguments.length === 2 && arguments[1]=== 'HH:mm') { const matches = /^([0-9]{2}):([0-9]{2})$/.exec(arguments[0]); if (matches) { const h = parseInt(matches[1]); if (24 < h && h < 24 + startHour) { return _moment().add(1, 'day').hour(h-24).minute(parseInt(matches[2])).second(0); } } } return _moment(...[...arguments]); }; window.hhmm = function(s) { return window.moment(s, 'HH:mm'); }; }
できること
-
READMEのsamples にも書きましたが、以下のようなことができます。
const t0 = hhmm('00:00'); console.log(t0.hhmm); // "24:00"
const t1 = hhmm('24:00'); console.log(t1.hhmm); // "24:00"
const t2 =hhmm('21:45'); console.log(t2.hhmm); // "21:45"
const t3 = hhmm('05:21'); console.log(t3.hhmm); // "29:21"
const t4 = hhmm('28:15'); console.log(t4.hhmm); // "28:15"
const t5 = hhmm('21:00'); const t6 = hhmm('26:45'); console.log(t6.isAfter(t5)); // true console.log(t5.isBefore(t6)); // true console.log(t6.diff(t5, 'minutes')); // 345 console.log(t6.diff(t5, 'hours')); // 5 console.log(t6.diff(t5, 'hours', true)); // 5.750271388888889 (or float value nearly 5.75 )
const t7 = hhmm('22:45'); const t8 = t7.add(4.5, 'hours'); console.log(t8.hhmm); // "27:15" const t9 = t8.add(-20, 'minutes'); console.log(t9.hhmm); // "26:55"
何かツッコミあれば下さい。
コメント
コメントを投稿