Skip to content

Not Moment

DateTime Extends Date

dateTime.js

js
const DAYS = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];

const MONTHS = [
  "January",
  "February",
  "March",
  "April",
  "May",
  "June",
  "July",
  "August",
  "September",
  "October",
  "November",
  "December"
];

/**
 * @method strToDate
 * @param {String|Date} strDate Date (As String)
 * @param {RegExp} re RegExp (As Separator)
 * @returns {Date}
 */
const strToDate = (strDate, re = /[+,-./:\\_|]/) => {
  if (typeof strDate === "string") {
    const utcDate = strDate.split(re).reverse().join("-");
    return new Date(utcDate);
  }
  return strDate;
};

/**
 * @class DateTime
 * @param {String|Date} dateTime Date (21/05/1993)
 */
class DateTime extends Date {
  constructor(dateTime = new Date()) {
    dateTime = strToDate(dateTime);
    super(dateTime);
  }

  getProperMonth() {
    return this.getMonth() + 1;
  }

  setProperMonth(value) {
    this.setMonth(value - 1);
  }

  format(formatPattern = "DD/MM/YYYY") {
    const dayOfWeek = this.getDay();
    const dayOfMonth = this.getDate();
    const month = this.getProperMonth();
    const year = this.getFullYear();
    const hours = this.getHours();
    const minutes = this.getMinutes();
    const seconds = this.getSeconds();

    return formatPattern
      .replace("DDD", DAYS[dayOfWeek - 1])
      .replace("MMM", MONTHS[month - 1])
      .replace("DD", `${dayOfMonth}`.padStart(2, "0"))
      .replace("MM", `${month}`.padStart(2, "0"))
      .replace("YYYY", year)
      .replace("HH", `${hours}`.padStart(2, "0"))
      .replace("mm", `${minutes}`.padStart(2, "0"))
      .replace("ss", `${seconds}`.padStart(2, "0"));
  }

  isBefore(dateTime = new Date()) {
    dateTime = strToDate(dateTime);
    return this.getTime() < dateTime.getTime();
  }

  isAfter(dateTime = new Date()) {
    dateTime = strToDate(dateTime);
    return this.getTime() > dateTime.getTime();
  }

  /**
   * @method add
   * @param {Number} value Time Value (Default: 0)
   * @param {String} key Enum Key ('DAYS', 'MONTHS', 'YEARS', 'HOURS', 'MINUTES', 'SECONDS')
   * @returns {DateTime}
   */
  add(value = 0, key) {
    switch (key) {
      case "days":
      case "DAYS":
        this.setDate(this.getDate() + value);
        break;
      case "months":
      case "MONTHS":
        this.setProperMonth(this.getProperMonth() + value);
        break;
      case "years":
      case "YEARS":
        this.setFullYear(this.getFullYear() + value);
        break;
      case "hours":
      case "HOURS":
        this.setHours(this.getHours() + value);
        break;
      case "minutes":
      case "MINUTES":
        this.setMinutes(this.getMinutes() + value);
        break;
      case "seconds":
      case "SECONDS":
        this.setSeconds(this.getSeconds() + value);
        break;
      default:
        this.setTime(this.getTime() + value);
    }

    return this;
  }

  /**
   * @method del
   * @param {Number} value Time Value (Default: 0)
   * @param {String} key Enum Key ('DAYS', 'MONTHS', 'YEARS', 'HOURS', 'MINUTES', 'SECONDS')
   * @returns {DateTime}
   */
  del(value = 0, key) {
    switch (key) {
      case "days":
      case "DAYS":
        this.setDate(this.getDate() - value);
        break;
      case "months":
      case "MONTHS":
        this.setProperMonth(this.getProperMonth() - value);
        break;
      case "years":
      case "YEARS":
        this.setFullYear(this.getFullYear() - value);
        break;
      case "hours":
      case "HOURS":
        this.setHours(this.getHours() - value);
        break;
      case "minutes":
      case "MINUTES":
        this.setMinutes(this.getMinutes() - value);
        break;
      case "seconds":
      case "SECONDS":
        this.setSeconds(this.getSeconds() - value);
        break;
      default:
        this.setTime(this.getTime() - value);
    }

    return this;
  }
}

export default DateTime;

dateTime.test.js

js
import DateTime from "../dateTime";

describe("DateTime", () => {
  it("Instance Of Date", () => {
    const dateTime = new DateTime();
    expect(dateTime.getTime()).toEqual(new Date(dateTime).getTime());
  });

  it("Format", () => {
    const dateTime = new DateTime("21/05/1993");
    expect(dateTime.format("YYYY-MM-DD")).toEqual("1993-05-21");
    // NOTE: GMT +2
    expect(dateTime.format("HH:mm:ss")).toEqual("02:00:00");
    expect(dateTime.format("the DDD DDth MMM YYYY at HHhmm")).toEqual("the Friday 21th May 1993 at 02h00");
  });

  describe("Add Function", () => {
    it("Days", () => {
      const dateTime = new DateTime("21/05/1993");
      dateTime.add(3, "DAYS");
      expect(dateTime.getDate()).toEqual(24);
    });

    it("Months", () => {
      const dateTime = new DateTime("21/05/1993");
      dateTime.add(3, "MONTHS");
      expect(dateTime.getMonth()).toEqual(7);
    });

    it("Years", () => {
      const dateTime = new DateTime("21/05/1993");
      dateTime.add(3, "YEARS");
      expect(dateTime.getFullYear()).toEqual(1996);
    });

    it("Hours", () => {
      const dateTime = new DateTime("21/05/1993");
      dateTime.add(3, "HOURS");
      // NOTE: GMT +2
      expect(dateTime.getHours()).toEqual(5);
    });

    it("Minutes", () => {
      const dateTime = new DateTime("21/05/1993");
      dateTime.add(3, "MINUTES");
      expect(dateTime.getMinutes()).toEqual(3);
    });

    it("Seconds", () => {
      const dateTime = new DateTime("21/05/1993");
      dateTime.add(3, "SECONDS");
      expect(dateTime.getSeconds()).toEqual(3);
    });
  });

  describe("Del Function", () => {
    it("Days", () => {
      const dateTime = new DateTime("21/05/1993");
      dateTime.del(3, "DAYS");
      expect(dateTime.getDate()).toEqual(18);
    });

    it("Months", () => {
      const dateTime = new DateTime("21/05/1993");
      dateTime.del(3, "MONTHS");
      expect(dateTime.getMonth()).toEqual(1);
    });

    it("Years", () => {
      const dateTime = new DateTime("21/05/1993");
      dateTime.del(3, "YEARS");
      expect(dateTime.getFullYear()).toEqual(1990);
    });

    it("Hours", () => {
      const dateTime = new DateTime("21/05/1993");
      dateTime.del(3, "HOURS");
      // NOTE: GMT +2
      expect(dateTime.getHours()).toEqual(23);
    });

    it("Minutes", () => {
      const dateTime = new DateTime("21/05/1993");
      dateTime.del(3, "MINUTES");
      expect(dateTime.getMinutes()).toEqual(57);
    });

    it("Seconds", () => {
      const dateTime = new DateTime("21/05/1993");
      dateTime.del(3, "SECONDS");
      expect(dateTime.getSeconds()).toEqual(57);
    });
  });

  it("isBefore", () => {
    const dateTime = new DateTime("21/05/1993");
    expect(dateTime.del(2, "hours").isBefore(new DateTime("21/05/1993"))).toBe(true);
  });

  it("isAfter", () => {
    const dateTime = new DateTime("21/05/1993");
    expect(dateTime.add(2, "hours").isAfter(new DateTime("21/05/1993"))).toBe(true);
  });
});

Released under the MIT License.