JavaScript
moment.js
moment-h25

moment.jsで午前1時30分を "25: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"

以上です。30分ぐらいでざっくり書いたコードですので、見落としがあるかもしれません。
何かツッコミあれば下さい。