[TypeScript] 指定年月のカレンダー二次元配列を出力するプログラムサンプル

[TypeScript] 指定年月のカレンダー二次元配列を出力するプログラムサンプル:


これはなに?

年、月を渡すと、以下のような配列を返します。

/* 2000年2月の場合 */ 
[ 
      [null, null, 1, 2, 3, 4, 5], 
      [6, 7, 8, 9, 10, 11, 12], 
      [13, 14, 15, 16, 17, 18, 19], 
      [20, 21, 22, 23, 24, 25, 26], 
      [27, 28, 29, null, null, null, null] 
] 
/* 数値の部分は、実際にはDateオブジェクトです。*/ 


プログラム

full-calendar.ts
export class FullCalendarService { 
  // 通常年の日数/月 
  private daysOfMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; 
  // うるう年の日数/月 
  private daysOfMonthOfLeap = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; 
 
  /** 
   * 二次元配列を返します。 
   *  
   * @param year 年 
   * @param month 月1〜12 
   */ 
  public generateWeeksArray(year: number, month: number): Date[][] { 
    const monthIndex = month - 1; 
 
    const maxDay = (this.isLeapYear(year) 
      ? this.daysOfMonthOfLeap 
      : this.daysOfMonth)[monthIndex]; 
    // 1日の曜日 
    const firstDayOfMonth = new Date(Date.UTC(year, monthIndex, 1, 0)).getUTCDay(); 
    const weeksArray = new Array<Array<Date>>(); 
 
    for (let i = 1; i <= maxDay; i++) { 
      const row = Math.floor((i - 1 + firstDayOfMonth) / 7); 
      const col = (i - 1 + firstDayOfMonth) % 7; 
 
      if (!weeksArray[row]) { 
        weeksArray[row] = [null, null, null, null, null, null, null]; 
      } 
 
      weeksArray[row][col] = new Date(Date.UTC(year, monthIndex, i, 0)); 
    } 
 
    return weeksArray; 
  } 
 
  private isLeapYear(year: number): boolean { 
    // 4で割り切れて、100で割り切れなければうるう年 
    // ただし400で割り切れればうるう年 
    return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; 
  } 
} 


使い方

const cal200002 = new FullCalendarService().generateWeeksArray(2000, 2); 

コメント

このブログの人気の投稿

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

投稿時間:2021-04-30 23:37:32 RSSフィード2021-04-30 23:00 分まとめ(42件)

投稿時間:2023-02-05 02:09:04 RSSフィード2023-02-05 02:00 分まとめ(9件)