PageSourceSearch

https://www.rakuten-sec.co.jp/web/shared/js/schedule-display.js

js rakuten-sec.co.jp collected 2026-10-01 10:30:54 UTC 6,622 bytes, 165 lines download raw bytes

1// 日本時間を取得する関数
2function getJapanTime() {
3  // # test確認用
4  // const urlParams = new URLSearchParams(window.location.search);
5  // const timeParam = urlParams.get('time');
6  // if (timeParam) {
7  //   // クエリパラメータが存在する場合
8  //   // 例: ?time=202510300000 (YYYYMMDDHHmm形式)
9  //   const year = timeParam.substring(0, 4);
10  //   const month = parseInt(timeParam.substring(4, 6)) - 1; // 月は0から始まるため-1
11  //   const day = timeParam.substring(6, 8);
12  //   const hour = timeParam.substring(8, 10);
13  //   const minute = timeParam.substring(10, 12);
14
15  //   // 日本時間としてDateオブジェクトを作成
16  //   // ISO 8601形式で文字列を作成し、Dateオブジェクトに渡すことでタイムゾーンの指定が容易になります。
17  //   // 'YYYY-MM-DDTHH:mm:00+09:00'
18  //   const japanTimeStr = `${year}-${(month + 1).toString().padStart(2, '0')}-${day}T${hour}:${minute}:00+09:00`;
19  //   return new Date(japanTimeStr);
20  // } else {
21  //   // クエリパラメータが存在しない場合、現在の日本時間を返す
22  //   let now = new Date();
23  //   let utc = now.getTime() + (now.getTimezoneOffset() * 60000);
24  //   let japanTime = new Date(utc + (3600000 * 9));
25  //   return japanTime;
26  // }
27  // # リリース用
28  let now = new Date();
29  let utc = now.getTime() + (now.getTimezoneOffset() * 60000);
30  let japanTime = new Date(utc + (3600000 * 9));
31  return japanTime;
32}
33
34
35// 曜日と時間帯に基づいて要素の表示・非表示を更新する関数
36async function updateScheduleVisibility() {
37  // 現在の日時を設定
38  const jstNow = getJapanTime();
39
40  // 現在の曜日と時刻を取得
41  const currentDay = jstNow.getDay(); // 0:日曜日, 1:月曜日, ..., 6:土曜日
42  const currentTime = jstNow.getHours() * 60 + jstNow.getMinutes(); // 現在の時刻を分単位に変換
43  const year = jstNow.getFullYear();
44  const month = (jstNow.getMonth() + 1).toString().padStart(2, '0'); // 月は0-11なので+1し、2桁にする
45  const day = jstNow.getDate().toString().padStart(2, '0'); // 日を2桁にする
46  const currentDate = `${year}-${month}-${day}`;
47
48  // 曜日を短縮形で取得
49  const daysShort = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
50  const today = daysShort[currentDay]; // 現在の曜日を短縮形で取得
51
52  // 特定の日付条件(祝日や特別な日)を取得
53  const specialDates = {};
54  const dateFiles = {
55    "cs-holiday": "/web/shared/json/holidays.json",
56    "ifa-holiday": "/web/shared/json/holidays_ifa.json"
57    // "bu-holiday": "bu_holidays.json",
58    // "ifa-day": "ifa_days.json"
59  };
60
61  // 各 JSON ファイルを非同期で取得
62  await Promise.all(
63    Object.entries(dateFiles).map(async ([key, file]) => {
64      try {
65        const response = await fetch(file);
66        const data = await response.json();
67        specialDates[key] = data.holidays || [];
68      } catch (error) {
69        console.error(`${file} の取得に失敗しました:`, error);
70        specialDates[key] = []; // エラー時は空配列を設定
71      }
72    })
73  );
74
75  // コンソールログで確認
76  console.log(`現在の日時(日本時間): ${jstNow}`);
77  console.log(`現在の曜日: ${today}`);
78  console.log(`現在の日付: ${currentDate}`);
79  console.log(`特定の日付リスト:`, specialDates);
80
81  const elements = document.querySelectorAll('.schedule-item');
82
83  elements.forEach(element => {
84    const dataDays = element.getAttribute('data-days');
85    const dataTime = element.getAttribute('data-time');
86    const dataDate = element.getAttribute('data-date');
87
88    // 曜日判定
89    let isDayMatch = true; // デフォルトで true
90    if (dataDays) {
91      const daysArray = dataDays.split(',');
92      const positiveDays = daysArray.filter(day => !day.startsWith('!')); // 通常条件
93      const negativeDays = daysArray.filter(day => day.startsWith('!')); // 否定条件
94
95      if (positiveDays.length > 0) {
96        isDayMatch = positiveDays.some(day => today === day);
97      }
98
99      if (negativeDays.length > 0) {
100        isDayMatch = isDayMatch && negativeDays.every(day => today !== day.slice(1));
101      }
102    }
103
104    // 時間帯判定
105    let isTimeMatch = true; // デフォルトで true
106    if (dataTime) {
107      const timeRanges = dataTime.split(',');
108      isTimeMatch = timeRanges.some(range => {
109        if (range.startsWith('!')) {
110          const [start, end] = range.slice(1).split('-');
111          const [startHour, startMinute] = start.split(':').map(Number);
112          const [endHour, endMinute] = end.split(':').map(Number);
113          const startTime = startHour * 60 + startMinute;
114          const endTime = endHour * 60 + endMinute;
115          return !(currentTime >= startTime && currentTime <= endTime);
116        } else {
117          const [start, end] = range.split('-');
118          const [startHour, startMinute] = start.split(':').map(Number);
119          const [endHour, endMinute] = end.split(':').map(Number);
120          const startTime = startHour * 60 + startMinute;
121          const endTime = endHour * 60 + endMinute;
122          return currentTime >= startTime && currentTime <= endTime;
123        }
124      });
125    }
126
127    // 特定の日付条件判定
128    let isDateMatch = true; // デフォルトで true
129    if (dataDate) {
130      const dateConditions = dataDate.split(',');
131      const positiveDates = dateConditions.filter(date => !date.startsWith('!')); // 通常条件
132      const negativeDates = dateConditions.filter(date => date.startsWith('!')); // 否定条件
133
134      if (positiveDates.length > 0) {
135        isDateMatch = positiveDates.some(date => {
136          if (specialDates[date]) {
137            return specialDates[date].includes(currentDate);
138          }
139          return false;
140        });
141      }
142
143      if (negativeDates.length > 0) {
144        isDateMatch = isDateMatch && negativeDates.every(date => {
145          if (specialDates[date.slice(1)]) {
146            return !specialDates[date.slice(1)].includes(currentDate);
147          }
148          return true;
149        });
150      }
151    }
152
153    // 最終判定
154    if (isDayMatch && isTimeMatch && isDateMatch) {
155      element.classList.add('is-active');
156      element.classList.remove('is-disabled');
157    } else {
158      element.classList.add('is-disabled');
159      element.classList.remove('is-active');
160    }
161  });
162}
163
164// 初期化処理
165updateScheduleVisibility();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.