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

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分ぐらいでざっくり書いたコードですので、見落としがあるかもしれません。

何かツッコミあれば下さい。

コメント

このブログの人気の投稿

投稿時間:2021-06-17 22:08:45 RSSフィード2021-06-17 22:00 分まとめ(2089件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)