duration.ts

PHOTO EMBED

Thu Jul 21 2022 21:35:16 GMT+0000 (Coordinated Universal Time)

Saved by @nolawnchairs #typescript

export interface IDuration {
  readonly milliseconds: number
  readonly seconds: number
  readonly minutes: number
  readonly hours: number
  readonly days: number
}

export class Duration implements IDuration {

  readonly total: number

  constructor(input: IDuration) {
    const { days = 0, hours = 0, minutes = 0, seconds = 0, milliseconds = 0 } = input
    this.total = days + hours + minutes + seconds + milliseconds
  }

  static of(input: Partial<IDuration>): Duration {
    const { days = 0, hours = 0, minutes = 0, seconds = 0, milliseconds = 0 } = input
    return new Duration({
      days: days * 86400000,
      hours: hours * 3600000,
      minutes: minutes * 60000,
      seconds: seconds * 1000,
      milliseconds,
    })
  }

  add(other: Duration): Duration {
    return Duration.of({ milliseconds: this.total + other.total })
  }

  subtract(other: Duration): Duration {
    return Duration.of({ milliseconds: this.total - other.total })
  }

  get days() {
    return Math.floor(this.total / 86400000)
  }

  get hours() {
    return Math.floor(this.total / 3600000)
  }

  get minutes() {
    return Math.floor(this.total / 60000)
  }

  get seconds() {
    return Math.floor(this.total / 1000)
  }

  get milliseconds() {
    return this.total
  }
}
content_copyCOPY