sth

A thing that is thought to be important or worth taking notice of.

Decade Calendar

TypeScript

const m = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
function getDayOfYear(date: Date) {
  let day = date.getDate() + m[date.getMonth()];
  if (m > 1) {
    let y = date.getFullYear();
    if (y % 4 === 0 && y % 100 !== 0 || y % 400 === 0)
      day++;
  }
  
  return day;
}

export class DecadeDate {
  #inner: {
      y: number;
      d: number;
  };

  constructor(date?: string | number | Date | null | undefined) {
    if (!date) date = new Date();
    if (typeof date === 'number') {
      #inner = {
        y: Math.floor(date / 1000),
        d: Math.floor(date % 1000)
      };
    } else if (date instanceof Date) {
      #inner = {
        y: date.getFullYear(),
        d: getDayOfYear(date)
      };
    } else if (typeof date !== 'string') {
      #inner = {
        y: NaN,
        d: NaN
      };
    } else {
      let arr = date.split('/');
      #inner = arr.length > 1 ? {
        y: parseInt(arr[0]),
        d: parseInt(arr[1])
      } : {
        y: NaN,
        d: NaN
      };
    }
  }

  public get isValid() {
    return !isNaN(#inner.y) && !isNaN(#inner.d);
  }

  public get date() {
    return #inner.d % 10;
  }

  public get decade() {
    return Math.floor(#inner.d / 10);
  }

  public get year() {
    return #inner.y;
  }

  public toDate() {
    return new Date(#inner.y, 0, #inner.d);
  }

  public toString() {
    if (isNaN(#inner.y) || isNaN(#inner.d))
      return "Invalid Date";
    let d = #inner.d.toString(10);
    if (d.length < 2) d = '0' + d;
    return #inner.y.toString(10)  + '/' + d;
  }
}

© Kingcean Tuan, 2021.

< Back to article