
ํ์บ๋ฆฐ๋(FullCalendar) ์์ฑ - 1
FullCalendar JS๋ฅผ ํ์ฉํ๋ค ๋ณด๋ฉด ๊ต์ฅํ ๋ค์ํ ์์ฑ๊ณผ ์ด๋ฒคํธ๋ฅผ ๋ณผ ์ ์๋ค. ์ฌ๋ฌ ์์ฑ๋ค์ด ์ด๋ค ํน์ง๋ค์ ๊ฐ์ง๊ณ ์๋์ง, ํ์บ๋ฆฐ๋๊ฐ ๊ฐ์ง๊ณ ์๋ ์ด๋ฒคํธ์๋ ์ด๋ค ๊ฒ๋ค์ด ์์ผ๋ฉฐ ํด๋น ์ด๋ฒคํธ๋ ์ด๋ค ๋์๋ค์ ํฌํจํ๊ณ ์๋์ง ๋ฑ๋ฑ์ ๋ํด์ ์ ๋ชจ๋ฅผ ๋๊ฐ ๋ง๋ค. FullCalendar JS ๊ณต์ ํํ์ด์ง์์ ์ ๊ณตํ๋ Documents ํ์ผ์ ๋ณด๊ธด ํ์ง๋ง Docs ๋ฌธ์๋ค์ ํ์ธํ๋ ๊ฒ ์์ง ์ต์์ง ์์ ์ฌ๋์ ๋ฌธ์ ๋ณด๋ ๋ฐฉ๋ฒ์กฐ์ฐจ ์ด๋ ค์ธ ์ ์๋ค. ๊ทธ๋์ FullCalendar JS์์ ์ฌ์ฉํ ์ ์๋ ์์ฑ๋ค์ ํ๋์ ์ดํด๋ณด๊ณ ์ ํ๋ค. ๋ฌผ๋ก 100% ๋ชจ๋ ์์ฑ๋ค์ ์ ๋ถ ๋ณด๋ฉด ์ข๊ฒ ์ง๋ง, ๊ฐ์ฅ ์ค์ํ ์์ฑ๋ค ์์ฃผ๋ก ํ์ธํด ๋ณด๊ณ ๊ทธ ์ธ์ ์์ฑ๋ค์ ์ง์ Documents๋ฅผ ํ์ธํด ๋ณด๊ธธ ๋ฐ๋๋ค.
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
// ์ฌ๋ฌ ์์ฑ๋ค
});
calendar.render();
์ ์ฝ๋๋ธ๋ก์์ ์ค๋ช ํ๋ฏ์ด, Calendar ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ธฐ ์ํด์ ์ค์ ํ๊ธฐ ์ํ ์ฌ๋ฌ ์์ฑ๋ค์ด ์กด์ฌํฉ๋๋ค. ๊ฐ ์์ฑ๋ค์ default๊ฐ์ด ์กด์ฌํ๊ธฐ๋ ๋๋ ์กด์ฌํ์ง ์๊ธฐ๋ ํ๋๋ฐ ํด๋น ๊ฐ๋ค์ ๋ฐ๋ผ์ Calendar ๊ฐ์ฒด๊ฐ ๋ค์ํ๊ฒ ๋ง๋ค์ด์ง ์ ์๋ค. ์ฌ๋ฌ ์์ฑ๋ค์ '// ์ฌ๋ฌ ์์ฑ๋ค'์ด๋ผ๊ณ ์ฃผ์ ํ์ํด๋ ์์น์ ๋ค์ด๊ฐ๋๋ฐ ๊ฐ์ฉํ ์ ์๋ ์์ฑ๋ค ์ค Demo์์ ์ ๊ณตํ๊ณ ์๋ ์์ฑ๋ค ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ธ ๋ค์ํ ์์ฑ๋ค์ ํ์ธํด ๋ณด์.
๐ 1. ๊ธฐ๋ณธ ์ค์ (General Settings)
initialView
' ์บ๋ฆฐ๋๊ฐ load ๋ ๋, ์ด๊ธฐ ๋ณด๊ธฐ ์ค์ '
์บ๋ฆฐ๋๊ฐ load ๋ ๋, ์ด๊ธฐ ๋ณด๊ธฐ ์ค์ ์ initialView ์์ฑ์ ํตํด์ ์ค์ ํ ์ ์๋ค. ์ด๊ธฐ ๋ณด๊ธฐ ์ค์ ์ ์ค์ ํ์ง ์๋ ๊ฒฝ์ฐ์ defualt๊ฐ์ธ 'dayGridMonth'๋ก ์ค์ ๋๋ค. ๋ณด๊ธฐ ์ค์ ์๋ ๋ค์ํ ๊ฐ์ด ์กด์ฌํ๋๋ฐ, 'dayGridYear', 'dayGridMonth', 'dayGridWeek', 'dayGridDay', 'dayGrid', 'timeGridWeek', 'timeGridDay', 'timeGrid', 'listYear', 'listMonth', 'listWeek', 'listDay', 'list'๊ฐ ์ฌ์ฉ๋ ์ ์๋ค. ๊ทธ ์ธ์ timeline ์ข ๋ฅ ๋๋ resource ์ข ๋ฅ๋ ๊ธฐ๋ณธ ๋ฒ๋ค์์๋ ์ฌ์ฉํ ์ ์๋ค. (์ฌ์ฉ ์, ์คํฌ๋ฆฝํธ ์๋ฌ๋ฐ์)
๊ธฐ๋ณธ ๋ฒ๋ค์์ ์ฌ์ฉ ๊ฐ๋ฅํ ์์ฑ ๊ฐ
์ข ๋ฅ 1) 'dayGridYear', 'dayGridMonth', 'dayGridWeek', 'dayGridDay', 'dayGrid'
์ข ๋ฅ 2) 'timeGridWeek', 'timeGridDay', 'timeGrid'
์ข ๋ฅ 3) 'listYear', 'listMonth', 'listWeek', 'listDay', 'list'
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView : 'dayGridMonth',
});
calendar.render();
});



์ด ์ด๋ฏธ์ง 3์ฅ ์ค, ์ผ์ชฝ ์๋จ ์ด๋ฏธ์ง๋ ' dayGridYear ' ๋ก ์ค์ ํ ์ด๋ฏธ์ง์ด๊ณ , ์ค๋ฅธ์ชฝ ์๋จ ์ด๋ฏธ์ง๋ ' dayGridMonth ' ๋ก ์ค์ ํ ์ด๋ฏธ์ง์ด๊ณ , ํ๋จ ์ด๋ฏธ์ง๋ ' dayGridWeek ' ๋ก ์ค์ฅํ ์ด๋ฏธ์ง์ด๋ค. ๊ฐ ์์ฑ์ ๋ค๋ฅธ ์์ฑ ๊ฐ๋ค์ ๋ฃ์ ๋๋ง๋ค ๊ฐ๊ฐ ์ด๊ธฐ ์ค์ ํ๋ฉด์ด ๋ฌ๋ผ์ง๋ ๊ฑธ ํ์ธํ ์ ์๋ค. dayGridYear๋ ํ์ฌ ๋ ์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ช ํ์๋ฉด 2024๋ ๋ 1์๋ถํฐ 12์๊น์ง์ ๋ฌ๋ ฅ์ด ํ๊บผ๋ฒ์ ์ถ๋ ฅ๋๋ค. dayGridMonth๋ 2024๋ ๋ ํ์ฌ ๋ฌ์ ๊ธฐ์ค์ผ๋ก 1๋ฌ์ฉ ์ถ๋ ฅ๋๋ค. dayGridWeek๋ 2024๋ ๋ ํด๋น ๋ฌ์ ์ฃผ ๋จ์๋ก ์ถ๋ ฅ๋๋ค.
initialDate
' ์บ๋ฆฐ๋๊ฐ load ๋ ๋, ์ด๊ธฐ ๋ ์ง ์ค์ '
์บ๋ฆฐ๋๊ฐ load ๋ ๋, ์ด๊ธฐ ๋ ์ง ์ค์ ์ initialDate ์์ฑ์ ํตํด์ ์ค์ ํ ์ ์๋ค. ์ด๊ธฐ ๋ ์ง ์ค์ ์ ์ค์ ํ์ง ์๋ ๊ฒฝ์ฐ์, default ๊ฐ์ ํด๋นํ๋ ํ์ฌ ๋ ์ง๊ฐ ์ค์ ๋๋ค. ๋ ์ง ๋ฐ์ดํฐ๋ ISO8601 ์ธ์ฝ๋ฉ์ผ๋ก ๋ ์ง ๋ฌธ์์ด์ ํฌํจํ์ฌ Date๋ก ๊ตฌ๋ฌธ๋ถ์์ด ๊ฐ๋ฅํ๋๋ก ๋์ด ์๋ค. ๋ฌธ์์ด์ ํด๋นํ๋ ๋ ์ง ๋ฐ์ดํฐ๋ฅผ ํด๋น ์์ฑ ๊ฐ์ผ๋ก ์ ๋ ฅ๋ง ํด์ฃผ๋ฉด ๋๋ค.
ISO8601 ๋ฌธ์์ด๋ก ์ถ๋ ฅํ๊ธฐ
- 2024-06-17
- 2024-06-17T12:30:00
- 2024-06-17T12:30:00-14:00
๋ฐ๋ฆฌ์ด ์๊ฐ์ผ๋ก ์ถ๋ ฅํ๊ธฐ
- 1537302134028 // Tue Sep 18 2018 16:22:14 GMT-0400
๊ธฐ๋ณธ Javascript ๋ ์ง๋ก ์ถ๋ ฅํ๊ธฐ
- new Date(2024,6,10)
- new Date(Date.UTC(2024,6,10))
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
timeZone : 'local',
initialDate : '2024-08-01'
// initialDate : '2024-08-01'
// initialDate : '2024-08-01'
// initialDate : 1537302134028 // Tue Sep 18 2018 16:22:14
// initialDate : new Date(2019, 10, 1)
// initialDate : new Date(Date.UTC(2024, 10, 10))
});
calendar.render();
});
ISO8601 ๋ฌธ์์ด๋ก ์ถ๋ ฅ ์, '2024-06-17'๊ณผ ๊ฐ์ ๋ฌธ์์ด์ ํ์ฉ๋์ง๋ง '20240617'๊ณผ ๊ฐ์ ๋ฌธ์์ด์ ํ์ฉ๋์ง ์๋๋ค. ๊ธฐ๋ณธ์ ์ธ timeZone์ ์ฌ์ฉ์๊ฐ ์ฌ์ฉ ์ค์ธ ์ด์์ฒด์ ์ค์ ์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ ๊ธฐ๋ณธ ์๊ฐ๋์ธ 'local'๋ก ์ค์ ๋๋ค. ์ด๋ 'ํ์ง' ์๊ฐ๋๋ก ๊ฐ์ฃผ๋๋ค.
locale
' ์ธ์ด ๋ฐ ์ง์ญํ ์ค์ '
locale ์์ฑ์ FullCalendar์ ์ธ์ด ๋ฐ ์ง์ญํ ์ค์ ์ ๋ณ๊ฒฝํ๋๋ฐ ์ฌ์ฉํฉ๋๋ค. ํด๋น ์์ฑ์ ํตํด ๋ ์ง ํ์, ์์ผ ์ด๋ฆ, ๋ฒํผ ํ ์คํธ ๋ฑ์ ์ฌ์ฉ์์ ์ธ์ด์ ๋ง๊ฒ ํ์ํ ์ ์์ต๋๋ค.
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
locale: 'ko', // ํ๊ตญ์ด ์ค์
});
calendar.render();
});
๋ํ์ ์ธ locale ์ฝ๋๋ก๋ en(์์ด:๊ธฐ๋ณธ๊ฐ), ko(ํ๊ตญ์ด), fr(ํ๋์ค์ด), ja(์ผ๋ณธ์ด), zh-cn(์ค๊ตญ์ด:๊ฐ์ฒด), de(๋ ์ผ์ด), es(์คํ์ธ์ด) ๋ฑ์ด ์์ต๋๋ค. FullCalendar๋ Moment.js์ Locale์ ๊ธฐ๋ฐ์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ ๋๋ถ๋ถ์ Locale์ ๊ธฐ๋ณธ์ ์ผ๋ก ํฌํจ๋์ด ์์ต๋๋ค. ํ์ง๋ง, ์ ์ฒด์ ์ธ Locale์ ์ฌ์ฉํด์ผ ํ๋ค๋ฉด ์๋ cdn์ ์ค์ ํฉ๋๋ค.
<script src="https://cdn.jsdelivr.net/npm/fullcalendar@6.1.8/locales-all.min.js"></script>
์ ์คํฌ๋ฆฝํธ๋ฅผ ์ค์ ํ๋ค๋ฉด ์ ์ฒด์ ์ธ Locale์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฃผ์ Locale ์ฝ๋ ์์
์์ด (๊ธฐ๋ณธ) | en | ๋ ์ผ์ด | de |
ํ๊ตญ์ด | ko | ํ๋์ค์ด | fr |
์ผ๋ณธ์ด | ja | ์คํ์ธ์ด | es |
์ค๊ตญ์ด (๊ฐ์ฒด) | zh-cn | ์ดํ๋ฆฌ์์ด | it |
์ค๊ตญ์ด (๋ฒ์ฒด) | zh-tw | ํฌ๋ฅดํฌ๊ฐ์ด | pt |
๋ฌ์์์ด | ru | ๋ค๋๋๋์ด | nl |
์๋์ด | ar | ํ๋ธ๋ฆฌ์ด | he |
ํ๊ตญ์ด | th | ํฐํค์ด | tr |
๋ฒ ํธ๋จ์ด | vi | ํด๋๋์ด | pl |
์ธ๋๋ค์์์ด | id | ์ค์จ๋ด์ด | sv |
ํ๋๋์ด | fi | ์ฒด์ฝ์ด | cs |
ํ๊ฐ๋ฆฌ์ด | hu | ํฌ๋ก์ํฐ์์ด | hr |
์ฐํฌ๋ผ์ด๋์ด | uk | ์ฌ๋ก๋ฐํค์์ด | sk |
๋ฃจ๋ง๋์์ด | ro | ๋ถ๊ฐ๋ฆฌ์์ด | bg |
๋ด๋งํฌ์ด | da | ๋ฆฌํฌ์๋์์ด | lt |
๋ ธ๋ฅด์จ์ด์ด | no ๋๋ nb | ์์คํ ๋์์ด | et |
์นดํ๋ฃจ๋์ด | ca | ์ฌ๋ก๋ฒ ๋์์ด | sl |
๋ถ๊ฐ๋ฆฌ์์ด | bg | ๋ผํธ๋น์์ด | lv |
๋ง๋ ์ด์ด | ms | ์ธ๋ฅด๋น์์ด | sr |
๊ฐ๋ฆฌ์์์ด | gl | ๋ฐ์คํฌ์ด | eu |
timeZone
' ์๊ฐ๋ ์ค์ '
timeZone ์์ฑ์ ์บ๋ฆฐ๋์ ์๊ฐ๋๋ฅผ ์ค์ ํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ํด๋น ์์ฑ์ ํตํด ์ด๋ฒคํธ ์๊ฐ ๋ฐ ๋ ์ง๊ฐ ํน์ ์๊ฐ๋์ ๋ง๊ฒ ํ์๋๋๋ก ํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก๋ ๋ธ๋ผ์ฐ์ ์ ๋ก์ปฌ ์๊ฐ๋๋ฅผ ์ฌ์ฉํ์ง๋ง, ํ์์ ๋ฐ๋ผ UTC๋ ํน์ ์๊ฐ๋๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
timeZone: 'local', // ๊ธฐ๋ณธ๊ฐ: ๋ธ๋ผ์ฐ์ ์ ๋ก์ปฌ ์๊ฐ๋ ์ฌ์ฉ
});
calendar.render();
});
timeZone ์์ฑ์ ๋ํ์ ์ผ๋ก 3๊ฐ์ง ๋ฐฉ์์ผ๋ก ์ค์ ํ ์ ์์ต๋๋ค.
- local : ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์๊ฐ๋์ ๋ง๊ฒ ํ์ (๊ธฐ๋ณธ๊ฐ)
- UTC : ์ธ๊ณ ํ์ ์(Universal Time Coordinated)๋ก ํ์
- IANA ์๊ฐ๋ : 'Asia/Seoul', 'America/New_York', 'Europe/London' ๋ฑ์ผ๋ก ์ง์ ๊ฐ๋ฅ
1. locale ์ฌ์ฉ๋ฒ (๊ธฐ๋ณธ๊ฐ)
timeZone : 'local'
๋ชจ๋ ๋ธ๋ผ์ฐ์ ์๋ ๊ธฐ๋ณธ ์๊ฐ๋๊ฐ ์์ผ๋ฉฐ, ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์์ ์ด์ ์ฒด์ ์ค์ ์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค. ์ด๋ ๋ก์ปฌ ์๊ฐ๋๋ก ๊ฐ์ฃผ๋๊ณ ์บ๋ฆฐ๋ ์ฌ์ฉ์๋ง๋ค ๋ค๋ฅด๋ฉฐ, ๊ฑฐ์ฃผ์ง ๋๋ ์ปดํจํฐ ๊ตฌ์ฑ ๋ฐฉ์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
์ด๋ฒคํธ ๋ ์ง๊ฐ UTC๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ์๋ ๊ฒฝ์ฐ, ๋ฐ๋ฆฌ์ด ์๊ฐ ๋๋ UTC ์คํ์ ์ด ์๋ ISO8601 ๋ฌธ์์ด์ ํตํด ๋ ์ง๊ฐ ์ฌ์ฉ์์ ๋ก์ปฌ ์๊ฐ๋๋ก ํ์๋๋๋ก ์ ์ ํ ๋ณ๊ฒฝ๋ฉ๋๋ค. ๋ ์ง๊ฐ UTC ์คํ์ ์ด ์๋ ISO8601 ๋ฌธ์์ด๋ก ์ ๊ณต๋ ๊ฒฝ์ฐ ๋ก์ปฌ์ธ ๊ฒ์ฒ๋ผ ๊ตฌ๋ฌธ ๋ถ์๋ฉ๋๋ค.
2. UTC ์ฌ์ฉ๋ฒ
timeZone : 'UTC'
๋ก์ปฌ ์๊ฐ๋๋ ๋ธ๋ผ์ฐ์ ๋ง๋ค ๋ค๋ฅด์ง๋ง UTC ์๊ฐ๋๋ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ๋์ผํ๋๋ก ๋ณด์ฅ๋ฉ๋๋ค. ๋ํ ์ผ๊ด ์ ์ฝ ์๊ฐ์ ๋ฅผ ๊ฒฝํํ์ง ์์ต๋๋ค. UTC ์๊ฐ๋๋ ์ด๋ฐ ๋ฐฉ์์ผ๋ก ์ค๊ณ๋์์ผ๋ฉฐ ๋ค๋ฅธ ์๊ฐ๋๊ฐ ์๋์ ์ผ๋ก ์ ์ํ๋ ์๊ฐ๋ ์ญํ ์ ํฉ๋๋ค.
์ด๋ฒคํธ ๋ ์ง๊ฐ UTC ์คํ์ ์ด ์๋ ISO8601 ๋ฌธ์์ด๋ก ์ ์๋ ๊ฒฝ์ฐ ๋ ์ง๊ฐ 00:00 ์คํ์ ์ผ๋ก ํ์๋๋๋ก ์ ์ ํ ์ด๋ํฉ๋๋ค. ๋ ์ง๊ฐ ์๊ฐ๋ ์คํ์ ์์ด ISO8601 ๋ฌธ์์ด๋ก ์ ๊ณต๋ ๊ฒฝ์ฐ UTC์ธ ๊ฒ์ฒ๋ผ ๊ตฌ๋ฌธ ๋ถ์๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ API์์ ๋ฐฉ์ถ๋ ๋ ์ง๋ฅผ ์ฌ์ฉ ์, Date ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํตํด UTC๊ฐ์ ์ก์ธ์คํ๊ณ ์ถ์ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. .getURCMonth(), .getUTCHours(), .toUTCString() ๋ฉ์๋๋ฅผ ํตํด ์ค์ ํ ์ ์์ต๋๋ค.
timeZone ์์ฑ์ 'UTC'๋ก ์ค์ ํจ์ผ๋ก ์ฌ์ฉ์์ ๋ก์ปฌ ์๊ฐ๋์ ์๊ด์์ด ๋ชจ๋ ์ด๋ฒคํธ๊ฐ ๋ธ๋ผ์ฐ์ ์์ ์ผ๊ด๋๊ฒ ํ์๋๊ธฐ๋ฅผ ์ํ๋ค๋ฉด UTC๊ฐ ์ ์ ํ ์ค์ ์ผ๊ฒ์ ๋๋ค.
์ฆ, ์ฝ๊ฒ ๋งํด์ timeZone ์์ฑ์ 'UTC'๋ก ์ค์ ํ๋ฉด ๋ชจ๋ ๋ ์ง์ ์๊ฐ์ด ํ์ ์ธ๊ณ์(UTC) ๊ธฐ์ค์ผ๋ก ํ์๋๊ณ ์ฒ๋ฆฌ๋ฉ๋๋ค. ์ด๋ ์๊ฐ๋ ๋ณํ ์์ด ๋ชจ๋ ์ด๋ฒคํธ๊ฐ ๋์ผํ ์๊ฐ ๊ธฐ์ค์ผ๋ก ์ ์ง๋๋ฏ๋ก ๊ธ๋ก๋ฒ ์ฌ์ฉ์, ์๋ฒ-ํด๋ผ์ด์ธํธ ๋๊ธฐํ, ๊ตญ์ ์ผ์ ๊ด๋ฆฌ์ ์ ์ฉํ ๊ฒ์ ๋๋ค.
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'timeGridWeek',
timeZone: 'UTC', // ์๊ฐ๋๋ฅผ UTC๋ก ์ค์
events: [
{ title: 'UTC ํ์', start: '2025-02-07T12:00:00Z' } // UTC ๊ธฐ์ค
]
});
calendar.render();
'UTC' ์ค์ ์์ค๋ฅผ ๋ณด๋๋ฐ์ ๊ฐ์ด, ๋ธ๋ผ์ฐ์ ์ ๋ก์ปฌ ์๊ฐ์ ๊ด๊ณ์์ด UTC ์๊ฐ๋๋ก ํ์๋๊ณ ์๊ฐ ๊ฐ ๋ค์๋ 'Z'๊ฐ ๋ถ๋๋ฐ ์ด๋ 'UTC' ์๊ฐ๋๋ฅผ ์๋ฏธํฉ๋๋ค. (2025-02-07T12:00:00Z โ UTC 12์)
local๊ณผ UTC์ ์ฐจ์ด์
์๊ฐ ๊ธฐ์ค | ๋ธ๋ผ์ฐ์ (์ฌ์ฉ์) ๋ก์ปฌ ์๊ฐ๋ | UTC(์ธ๊ณ ํ์ค ์๊ฐ) ๊ธฐ์ค |
์๊ฐ ํ์ ๋ฐฉ์ | ๋ก์ปฌ ์๊ฐ์ผ๋ก ์๋ ๋ณํ | ๋ณํ ์์ด UTC ๊ทธ๋๋ก ํ์ |
๊ธ๋ก๋ฒ ์ฌ์ฉ์ ๋์ | ์๊ฐ๋ ์ฐจ์ด๋ก ํผ๋ ๊ฐ๋ฅ | ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ๋์ผํ ์๊ฐ์ผ๋ก ํ์ |
์๋ฒ์์ ์๊ฐ ๋๊ธฐํ | ์๋ฒ-ํด๋ผ์ด์ธํธ ๊ฐ ์๊ฐ๋ ๋ณํ ํ์ | ์๋ฒ์ UTC ์๊ฐ๊ณผ ๋ฐ๋ก ์ผ์น |
3. IANA ์๊ฐ๋ ์ฌ์ฉ๋ฒ
timeZone : 'Asia/Seoul'
๋ช ๋ช ๋ ์๊ฐ๋๋ 'America/New_York', 'Asia/Seoul' ๊ณผ ๊ฐ์ ๋ฌธ์์ด๋ก ์ง์ ๋ ์ธ๊ณ์ ํน์ ์ง์ญ์ ๋๋ค. UTC ์๊ฐ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ชจํธํจ์ด ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ์ผ๊ด๋๊ฒ ํ์๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ก์ปฌ ๋๋ UTC์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ช ๋ช ๋ ์๋จ๋๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํ์ง๋ ์์ต๋๋ค. ๋ ๊ตฌ์ฒด์ ์ผ๋ก ๋ค์ดํฐ๋ธ Date ๊ฐ์ฒด๋ ์๊ฐ๋ ์คํ์ ์ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฆ ๋๋ค. ๋ฐ๋ผ์ ๋ช ๋ช ๋ ์๊ฐ๋๋ฅผ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ FullCalendar๊ฐ ํ๋ฌ๊ทธ์ธ ํํ๋ก ์ ๊ณต๋๋ ์ด๋ค ์๊ฐ๋ ๊ตฌํ์ ์ฌ์ฉํด์ผ ํ๋์ง ๊ฒฐ์ ํด์ผ ํฉ๋๋ค.
- '๋๋ฅ/๋์'์ ํํ๋ฅผ ๊ฐ์ง๋ฉฐ 'Asia/Seoul', 'America/Los_Angeles' ๋ฑ ์ฒ๋ผ ํ๊ธฐํ ์ ์๋ค.
- ์๋จธํ์(DST) ์๋ ์ฒ๋ฆฌ : ํด๋น ์๊ฐ๋์ ์ผ๊ด ์ ์ฝ ์๊ฐ์ (์๋จธํ์)๊ฐ ์๋ ์ ์ฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ์ Local ์๊ฐ๋๊ฐ ๋ฌ๋ผ์ง๋ค ํ๋๋ผ๋ ์๊ฐ๋๊ฐ ๋ฌ๋ฆฌ์ง์ง ์๊ณ IANA๋ก ์ค์ ๋ ์๊ฐ๋์ ๋ง์ถฐ์ง๋ค.
UTC, local, IANA ๋น๊ต
๊ธฐ์ค ์๊ฐ๋ | ๋ธ๋ผ์ฐ์ ๋ก์ปฌ ์๊ฐ๋ | UTC (์ธ๊ณ ํ์ค ์๊ฐ) | ํน์ ๋์/๊ตญ๊ฐ ์๊ฐ๋ ๊ธฐ์ค |
์๊ฐ๋ ์๋ ๋ณํ | ๋ธ๋ผ์ฐ์ ์๊ฐ์ ๋ฐ๋ผ ๋ณํ | UTC๋ก ๊ณ ์ | ํด๋น ์ง์ญ ์๊ฐ๋์ ๋ฐ๋ผ ํ์ |
์๋จธํ์ ์ฒ๋ฆฌ | ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ ์ฒ๋ฆฌ | ์์ | ์๋ ์ ์ฉ (DST ๋ฐ์) |
๊ธ๋ก๋ฒ ์ผ์ ๊ด๋ฆฌ | โ ์๊ฐ๋ ํผ๋ ๊ฐ๋ฅ | โ ๏ธ UTC ์ดํด ํ์ | โ ์ง์ญ ์๊ฐ์ ์ต์ ํ |
IANA ์๊ฐ๋ ํ๊ธฐ ๋ชฉ๋ก
1. ์์์ (Asia)
ํ๊ตญ | Asia/Seoul | ํ๊ตญ ํ์ค์ (KST) |
์ผ๋ณธ | Asia/Tokyo | ์ผ๋ณธ ํ์ค์ (JST) |
์ค๊ตญ | Asia/Shanghai | ์ค๊ตญ ํ์ค์ (CST) |
ํ์ฝฉ | Asia/Hong_Kong | ํ์ฝฉ ํ์ค์ (HKT) |
๋๋ง | Asia/Taipei | ๋๋ง ํ์ค์ (CST) |
์ธ๋ | Asia/Kolkata | ์ธ๋ ํ์ค์ (IST) |
์ฑ๊ฐํฌ๋ฅด | Asia/Singapore | ์ฑ๊ฐํฌ๋ฅด ํ์ค์ (SGT) |
ํ๊ตญ | Asia/Bangkok | ํ๊ตญ ํ์ค์ (ICT) |
์ธ๋๋ค์์ (์์นด๋ฅดํ) | Asia/Jakarta | ์๋ถ ์ธ๋๋ค์์ ์๊ฐ (WIB) |
์๋์๋ฏธ๋ฆฌํธ | Asia/Dubai | ๊ฑธํ ํ์ค์ (GST) |
2. ์ ๋ฝ (Europe)
์๊ตญ | Europe/London | ๊ทธ๋ฆฌ๋์น ํ์ค์ (GMT) / ์๋จธํ์(BST) |
๋ ์ผ | Europe/Berlin | ์ค์ ์ ๋ฝ ์๊ฐ (CET) / ์๋จธํ์(CEST) |
ํ๋์ค | Europe/Paris | ์ค์ ์ ๋ฝ ์๊ฐ (CET) |
์ดํ๋ฆฌ์ | Europe/Rome | ์ค์ ์ ๋ฝ ์๊ฐ (CET) |
์คํ์ธ | Europe/Madrid | ์ค์ ์ ๋ฝ ์๊ฐ (CET) |
๋ฌ์์ (๋ชจ์คํฌ๋ฐ) | Europe/Moscow | ๋ชจ์คํฌ๋ฐ ํ์ค์ (MSK) |
ํ๋๋ | Europe/Helsinki | ๋์ ๋ฝ ์๊ฐ (EET) |
ํฐํค | Europe/Istanbul | ํฐํค ํ์ค์ (TRT) |
ํด๋๋ | Europe/Warsaw | ์ค์ ์ ๋ฝ ์๊ฐ (CET) |
๋ค๋๋๋ | Europe/Amsterdam | ์ค์ ์ ๋ฝ ์๊ฐ (CET) |
3. ์๋ฉ๋ฆฌ์นด (America)
๋ฏธ๊ตญ (๋ด์) | America/New_York | ๋๋ถ ํ์ค์ (EST) / ์๋จธํ์(EDT) |
๋ฏธ๊ตญ (์์นด๊ณ ) | America/Chicago | ์ค๋ถ ํ์ค์ (CST) / ์๋จธํ์(CDT) |
๋ฏธ๊ตญ (๋ด๋ฒ) | America/Denver | ์ฐ์ง ํ์ค์ (MST) / ์๋จธํ์(MDT) |
๋ฏธ๊ตญ (๋ก์ค์ค์ ค๋ ์ค) | America/Los_Angeles | ํํ์ ํ์ค์ (PST) / ์๋จธํ์(PDT) |
์บ๋๋ค (ํ ๋ก ํ ) | America/Toronto | ๋๋ถ ํ์ค์ (EST) |
๋ธ๋ผ์ง (์ํ์ธ๋ฃจ) | America/Sao_Paulo | ๋ธ๋ผ์ง ํ์ค์ (BRT) |
์๋ฅดํจํฐ๋ (๋ถ์๋ ธ์ค์์ด๋ ์ค) | America/Argentina/Buenos_Aires | ์๋ฅดํจํฐ๋ ์๊ฐ (ART) |
์น ๋ (์ฐํฐ์๊ณ ) | America/Santiago | ์น ๋ ํ์ค์ (CLT) |
๋ฉ์์ฝ (๋ฉ์์ฝ์ํฐ) | America/Mexico_City | ์ค์ ํ์ค์ (CST) |
ํ๋ฃจ (๋ฆฌ๋ง) | America/Lima | ํ๋ฃจ ํ์ค์ (PET) |
4. ์ํ๋ฆฌ์นด (Africa)
์ด์งํธ (์นด์ด๋ก) | Africa/Cairo | ๋์ ๋ฝ ์๊ฐ (EET) |
๋จ์ํ๋ฆฌ์นด (์ํ๋ค์ค๋ฒ๊ทธ) | Africa/Johannesburg | ๋จ์ํ๋ฆฌ์นด ํ์ค์ (SAST) |
๋์ด์ง๋ฆฌ์ (๋ผ๊ณ ์ค) | Africa/Lagos | ์์ํ๋ฆฌ์นด ์๊ฐ (WAT) |
์ผ๋ (๋์ด๋ก๋น) | Africa/Nairobi | ๋์ํ๋ฆฌ์นด ์๊ฐ (EAT) |
์์ ๋ฆฌ (์์ ) | Africa/Algiers | ์ค์ ์ ๋ฝ ์๊ฐ (CET) |
๋ชจ๋ก์ฝ (์นด์ฌ๋ธ๋์นด) | Africa/Casablanca | ์์ ๋ฝ ์๊ฐ (WET) |
ํ๋์ง (ํ๋์ค) | Africa/Tunis | ์ค์ ์ ๋ฝ ์๊ฐ (CET) |
5. ์ค์ธ์๋์ (Australia/Pacific)
ํธ์ฃผ (์๋๋) | Australia/Sydney | ํธ์ฃผ ๋๋ถ ํ์ค์ (AEST) / ์๋จธํ์(AEDT) |
ํธ์ฃผ (ํผ์ค) | Australia/Perth | ํธ์ฃผ ์๋ถ ํ์ค์ (AWST) |
๋ด์ง๋๋ (์คํด๋๋) | Pacific/Auckland | ๋ด์ง๋๋ ํ์ค์ (NZST) / ์๋จธํ์(NZDT) |
ํผ์ง | Pacific/Fiji | ํผ์ง ํ์ค์ (FJT) |
๊ด | Pacific/Guam | ๊ด ํ์ค์ (ChST) |
ํ์์ด | Pacific/Honolulu | ํ์์ด ํ์ค์ (HST) |
6. UTC ๋ฐ ๊ธฐํ (Etc)
Etc/UTC | UTC (ํ์ ์ธ๊ณ์) |
Etc/GMT+0 | GMT+0 (UTC์ ๋์ผ) |
Etc/GMT+9 | GMT+9 (ํ๊ตญ ์๊ฐ๊ณผ ์ ์ฌ) |
Etc/GMT-5 | GMT-5 (EST์ ์ ์ฌ) |
weekends
' ๋ชจ๋ ๋ฌ๋ ฅ ๋ณด๊ธฐ์ ํ ์์ผ/์ผ์์ผ ์ด์ ํฌํจํ ์ง ์ฌ๋ถ '
weekends ์์ฑ์ ์ฃผ๋ง(ํ ์์ผ๊ณผ ์ผ์์ผ)์ ํ์ ์ฌ๋ถ๋ฅผ ์ ์ดํ๋ boolean ์์ฑ์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ true์ด๊ณ false๋ก ์ค์ ํ๋ฉด ์ฃผ๋ง์ด ์บ๋ฆฐ๋์์ ์จ๊ฒจ์ง๋๋ค.
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'dayGridMonth',
weekends: true // ์ฃผ๋ง ํ์ฑํ
// weekends: false // ์ฃผ๋ง ๋นํ์ฑํ
});
calendar.render();

height
' ์บ๋ฆฐ๋ ๋จธ๋ฆฌ๊ธ๊ณผ ๋ฐ๋ฅ๊ธ์ ํฌํจํ ์ ์ฒด ๋ฌ๋ ฅ์ ๋์ด๋ฅผ ์ค์ '
๊ธฐ๋ณธ์ ์ผ๋ก ํด๋น ์ต์ ์ ์ค์ ๋์ง ์์ผ๋ฉฐ ๋ฌ๋ ฅ์ ๋์ด๋ aspectRatio์ ์ํด ๊ณ์ฐ๋ฉ๋๋ค. ์ ์๊ฐ ์ง์ ๋๋ฉด ๋ฌ๋ ฅ์ ๋์ด๋ ์ ํํ ๊ทธ ํฝ์ ๋์ด๊ฐ ๋ณด์ฅ๋ฉ๋๋ค. ๋ด์ฉ์ด ๋์ด์ ๋ง์ง ์์ผ๋ฉด ์คํฌ๋กค๋ฐ๊ฐ ๋ํ๋ฉ๋๋ค. 'auto' ๋ก ์ง์ ๋ ๊ฒฝ์ฐ ๋ทฐ์ ๋ด์ฉ์ ์์ฐ์ค๋ฌ์ด ๋์ด๋ก ๊ฐ์ ๋๊ณ ์คํฌ๋กค๋ฐ๋ ์ฌ์ฉ๋์ง ์์ต๋๋ค. '100%' ๋ก ์ง์ ๋ ๊ฒฝ์ฐ ๋ฌ๋ ฅ์ ๋์ด๋ ๋ถ๋ชจ ์ปจํ ์ด๋ ์์์ ๋์ด์ ์ผ์นํฉ๋๋ค.
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'dayGridMonth',
height: 'auto', // ๋์ด๋ฅผ auto๋ก ์ค์
// height: '100%' // ๋์ด๋ฅผ 100%๋ก ์ค์
// height: 650 // ๋์ด๋ฅผ 650px๋ก ์ค์
});
calendar.render();

height์ ์ค์ ๋ฐฉ๋ฒ
๊ฐ ์ ํ | ์ค๋ช | ์์ |
์ซ์ (ํฝ์ ) | ๊ณ ์ ๋ ํฝ์ ๊ฐ์ผ๋ก ์ค์ | height: 700 (700px) |
'auto' | ์บ๋ฆฐ๋ ๋ด์ฉ์ ๋ฐ๋ผ ๋์ด๊ฐ ์๋์ผ๋ก ์กฐ์ ๋จ | height: 'auto' |
'parent' | ๋ถ๋ชจ ์์์ ๋์ด์ ๋ง๊ฒ ์๋ ์กฐ์ | height: 'parent' |
CSS ํผ์ผํธ | CSS๋ก ๋ถ๋ชจ ์์์ % ๋จ์๋ก ์ค์ ๊ฐ๋ฅ | style="height: 100%;" |
contentHeight
' ์บ๋ฆฐ๋ ๋ณด๊ธฐ ์์ญ์ ๋์ด๋ฅผ ์ค์ '
contentHeight ์์ฑ์ ์บ๋ฆฐ๋์ ๋ณธ๋ฌธ(Content) ์์ญ์ ๋์ด๋ฅผ ์ค์ ํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ณธ๋ฌธ ์์ญ์ ์ด๋ฒคํธ๊ฐ ํ์๋๋ ๋ถ๋ถ์ผ๋ก ํค๋์ ํธํฐ๋ ์ ์ธ๋ฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋น ์ต์ ์ ์ค์ ๋์ง ์์ผ๋ฉฐ ๋ฌ๋ ฅ์ ๋์ด๋ aspectRatio์ ์ํด ๊ณ์ฐ๋ฉ๋๋ค. ์ ์๊ฐ ์ง์ ๋๋ฉด ๋ทฐ์ ๋์ด๋ ์ ํํ ๊ทธ ํฝ์ ๋์ด๊ฐ ๋ณด์ฅ๋ฉ๋๋ค. ๋ด์ฉ์ด ๋์ด์ ๋ง์ง ์์ผ๋ฉด ์คํฌ๋กค๋ฐ๊ฐ ๋ํ๋ฉ๋๋ค. 'auto'๋ก ์ง์ ๋ ๊ฒฝ์ฐ ๋ทฐ์ ๋ด์ฉ์ ์์ฐ์ค๋ฌ์ด ๋์ด๋ก ๊ฐ์ ๋๊ณ ์คํฌ๋กค๋ฐ๋ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
- height โ ์บ๋ฆฐ๋์ ์ ์ฒด ๋์ด (ํค๋ค + ๋ถ๋ชฌ + ํธํฐ)
- contentHeight โ ๋ณธ๋ฌธ ์์ญ์ ๋์ด๋ง ์กฐ์
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'dayGridMonth',
contentHeight: 'auto', // ๋ณธ๋ฌธ ๋์ด๋ฅผ auto๋ก ์ค์
// contentHeight: 500 // ๋ณธ๋ฌธ ๋์ด๋ฅผ 500px๋ก ์ค์
});
calendar.render();

aspectRatio
' ๋ฌ๋ ฅ์ ๋๋น ๋ ๋์ด ์ข ํก๋น๋ฅผ ์ค์ '
aspectRatio ์์ฑ์ ๋๋น ๋ ๋์ด์ ์ข ํก๋น๋ฅผ ์ค์ ํ๋ ์์ฑ์ผ๋ก ์ค์ ์ ๊ธฐ๋ณธ๊ฐ์ '1.35' ์ข ํก๋น ์ ๋๋ค. ๋ฌ๋ ฅ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ ์ฒด ๋๋น๋ฅผ ์ฑ์ฐ๋ ๋ธ๋ก ์์ค ์์์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ฌ๋ ฅ์ ๋์ด๋ ๋๋น ๋ ๋์ด์ ๋น์จ์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค. (์ข ํก๋น ์ซ์๊ฐ ํด์๋ก ๋์ด๊ฐ ์์์ง๋๋ค.)

var calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'dayGridMonth',
aspectRatio: 1.5, // ๋๋น:๋์ด ๋น์จ์ด 1.5:1
events: [
{ title: 'ํ ํ์', start: '2025-02-15' },
{ title: 'ํ๋ก์ ํธ ๋ง๊ฐ', start: '2025-02-20' }
]
});
calendar.render();
์ฃผ์ ์ค์ ๊ฐ
aspectRatio ๊ฐ | ์ค๋ช | ๊ฒฐ๊ณผ ์์ |
1 | ๋๋น์ ๋์ด๊ฐ ๋์ผํ ์ ์ฌ๊ฐํ ๋น์จ | 1:1 ์ ์ฌ๊ฐํ ํํ |
1.5 | ๊ฐ๋ก๊ฐ ์ธ๋ก๋ณด๋ค 1.5๋ฐฐ ๋์ | ํ์ค ์์ด๋ ํ๋ฉด ๋๋ |
2 | ๊ฐ๋ก๊ฐ ์ธ๋ก์ 2๋ฐฐ๋ก ๋งค์ฐ ๋์ | ๋์ ํ๋ฉด์ ์ ํฉํ ๋ ์ด์์ |
0.75 | ์ธ๋ก๊ฐ ๋ ๊ธธ์ด์ง๋ ๋น์จ | ๋์ด๊ฐ ๊ฐ์กฐ๋ ๋ ์ด์์ |
FullCalendar JS๋ฅผ ์๊ฐํ๋ ๋ด์ฉ์, FullCalendar ๊ณต์ ํํ์ด์ง์ ๋ด์ฉ์ ์ ๊ทน ์ฐธ๊ณ ํ์ฌ ์์ฑ๋ ๊ธ์์ ๋ช ์ํฉ๋๋ค. ๋ชจ๋ ๋ด์ฉ์ ๊ณต์ ํํ์ด์ง ๋ฉ์ธ ๋ด์ฉ ๋ฐ Documents๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ์์ต๋๋ค.
@Junesker