Help us understand the problem. What is going on with this article?

moment.jsで午前1時30分を "25:30" という文字列で出力させる。

More than 1 year has passed since last update.

実現したいこと

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした