実現したいこと
-
午前(つまり深夜の)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分ぐらいでざっくり書いたコードですので、見落としがあるかもしれません。
何かツッコミあれば下さい。