- Published on
시간을 다루는 프로그래밍 기술(with date-fns)
- Authors
- Name
- 테크버킷
목차
- 사용 기술
- Skills
- 1. 현재 날짜와 시간 가져오기
- 2. 특정 날짜와 시간 설정하기
- 3. 날짜 포맷팅하기
- 4. 특정 기간 더하기 및 빼기
- 5. 특정 요일까지 남은 일수 계산하기
- 6. 두 날짜 사이의 차이 계산하기
- 7. 동일한 날짜인지 비교하기
- 8. 윤년 확인하기
- 9. 날짜 유효성 검사하기
- 10. 로컬과 UTC 사이 변환하기
- 11. 특정 포맷에 맞는 날짜 파싱하기
- 12. 날짜를 상대적 형식으로 표시하기
- 13. 특정 날짜가 과거인지 미래인지 확인하기
- 14. 특정 기간 동안의 날짜 배열 생성하기
- 15. 년도의 첫째 날과 마지막 날 구하기
- 16. 날짜 간격을 간단한 문자열로 표현하기
- 17. 시간대를 고려한 날짜 계산하기
- 18. 특정 날짜의 시작과 끝 시간 구하기
- 19. 국제화된 날짜 포맷팅
- 20. 날짜 데이터의 유효성 검증
- 21. 특정 기간 내 특정 요일의 모든 날짜 구하기
- 22.현재 날짜로부터 N일 후의 날짜 계산하기
- 23. 특정 날짜가 포함된 분기 구하기
date-fns 라이브러리는 JavaScript에서 날짜와 시간을 다루는데 매우 유용한 도구입니다. 시간을 다루는 라이브러리는 day.js, moment.js, luxon 등이 있지만 date-fns는 더 작은 크기와 모듈화, 그리고 불변성을 지원하는 현대적인 대안으로 인기가 있는 라이브러리입니다. 이 글에서는 date-fns를 활용하여 시간 데이터를 다루는 프로그래밍 스킬을 주제별로 나누어 소개합니다.
사용 기술
- javascript
- date-fns
Skills
1. 현재 날짜와 시간 가져오기
가장 기본적이면서 필수적인 스킬입니다. new Date()
로 현재 날짜와 시간을 얻을 수 있습니다.
const now = new Date()
2. 특정 날짜와 시간 설정하기
setHours
, setMinutes
등의 함수를 사용해 특정 날짜와 시간을 설정합니다.
const specificTime = setHours(setMinutes(new Date(), 30), 17) // 오후 5시 30분으로 설정
3. 날짜 포맷팅하기
format
함수를 사용해 날짜를 다양한 형식으로 표현할 수 있습니다.
const formattedDate = format(new Date(), 'yyyy-MM-dd') // '2023-01-01' 형식
4. 특정 기간 더하기 및 빼기
addDays
, subMonths
같은 함수로 특정 기간을 더하거나 뺄 수 있습니다.
const oneWeekLater = addDays(new Date(), 7)
const oneMonthAgo = subMonths(new Date(), 1)
5. 특정 요일까지 남은 일수 계산하기
다음 특정 요일까지 남은 일수를 계산합니다.
const today = new Date()
const nextMonday = nextDay(today, 1)
const daysUntilMonday = differenceInDays(nextMonday, today)
6. 두 날짜 사이의 차이 계산하기
differenceInDays
함수를 사용해 두 날짜 사이의 차이를 계산합니다.
const start = new Date(2023, 0, 1) // 2023년 1월 1일
const end = new Date(2023, 11, 31) // 2023년 12월 31일
const diffDays = differenceInDays(end, start)
7. 동일한 날짜인지 비교하기
isSameDay
함수로 두 날짜가 동일한 날짜인지 확인합니다.
const isSame = isSameDay(new Date(2023, 0, 1), new Date('2023-01-01T05:00:00.000Z'))
8. 윤년 확인하기
isLeapYear
함수로 특정 연도가 윤년인지 확인합니다.
const isLeap = isLeapYear(new Date(2023, 0, 1))
9. 날짜 유효성 검사하기
잘못된 날짜 형식을 걸러내는 데 필요합니다.
const isValidDate = isValid(new Date('2023-02-30')) // false 반환
10. 로컬과 UTC 사이 변환하기
utcToZonedTime
, zonedTimeToUtc
함수로 변환할 수 있습니다.
import { utcToZonedTime, zonedTimeToUtc } from 'date-fns-tz'
const nowUTC = utcToZonedTime(new Date(), 'UTC')
const nowLocal = zonedTimeToUtc(nowUTC, 'Local')
11. 특정 포맷에 맞는 날짜 파싱하기
사용자가 입력한 날짜 문자열을 Date 객체로 변환합니다.
import { utcToZonedTime, zonedTimeToUtc } from 'date-fns-tz'
const nowUTC = utcToZonedTime(new Date(), 'UTC')
const nowLocal = zonedTimeToUtc(nowUTC, 'Local')
12. 날짜를 상대적 형식으로 표시하기
'3일 전', '2시간 후'와 같은 형식으로 표시합니다.
const relativeDate = formatDistanceToNow(subDays(new Date(), 3)) // '3일 전'
13. 특정 날짜가 과거인지 미래인지 확인하기
isPast
, isFuture
함수를 사용해 날짜가 과거인지 미래인지 확인합니다.
const isPastDate = isPast(new Date('2023-01-01'))
14. 특정 기간 동안의 날짜 배열 생성하기
이 기능은 date-fns와 JavaScript의 for문을 사용하여 구현할 수 있습니다. 예를 들어, 한 달 동안의 모든 날짜를 배열로 만드는 예시입니다. 이 코드는 주어진 달의 시작일부터 종료일까지 모든 날짜를 순회하며 배열에 추가합니다.
import { addDays, startOfMonth, endOfMonth } from 'date-fns'
const getDatesOfMonth = (date) => {
const start = startOfMonth(date)
const end = endOfMonth(date)
let dates = []
for (let day = start; day <= end; day = addDays(day, 1)) {
dates.push(day)
}
return dates
}
const dates = getDatesOfMonth(new Date(2023, 0)) // 2023년 1월의 날짜들
15. 년도의 첫째 날과 마지막 날 구하기
연간 리포트나 계획을 세울 때 유용합니다.
const startOfYear = startOfYear(new Date())
const endOfYear = endOfYear(new Date())
16. 날짜 간격을 간단한 문자열로 표현하기
예를 들어, '2개월 5일'과 같이 간격을 문자열로 표현합니다.
const intervalString = formatDuration(
intervalToDuration({ start: new Date(2023, 0, 1), end: new Date(2023, 1, 1) })
)
17. 시간대를 고려한 날짜 계산하기
다양한 국가의 사용자를 대상으로 할 때 중요합니다. 시간대를 고려한 날짜 계산을 위해서는 date-fns-tz
와 같은 추가적인 라이브러리가 필요합니다. 이 라이브러리를 사용하여 특정 시간대의 날짜와 시간을 계산할 수 있습니다.
import { format, utcToZonedTime, zonedTimeToUtc } from 'date-fns-tz'
const date = new Date('2023-01-01T12:00:00Z')
const timeZone = 'America/New_York'
// UTC에서 뉴욕 시간대로 변환
const nyDate = utcToZonedTime(date, timeZone)
// 날짜 포맷팅
const formattedDate = format(nyDate, 'yyyy-MM-dd HH:mm:ssXXX', { timeZone })
18. 특정 날짜의 시작과 끝 시간 구하기
특정 날짜의 첫 시간과 마지막 시간을 구합니다.
const startOfDate = startOfDay(new Date())
const endOfDate = endOfDay(new Date())
19. 국제화된 날짜 포맷팅
date-fns
는 다양한 언어를 지원하지만, 특정 언어의 지원을 위해서는 해당 언어의 로케일 데이터가 필요합니다. 예를 들어, 한국어는 ko
, 스페인어(Spanish)는 es
를 사용합니다.
import { format } from 'date-fns'
import { ko, es } from 'date-fns/locale'
const date = new Date(2023, 0, 1)
const formattedDateKo = format(date, 'PPP', { locale: ko }) // 한국어 포맷팅
const formattedDateEs = format(date, 'PPP', { locale: es }) // 스페인어 포맷팅
20. 날짜 데이터의 유효성 검증
잘못된 날짜 데이터를 필터링하고 오류를 처리합니다.
const isValidDate = isValid(parseISO('2023-01-01'))
21. 특정 기간 내 특정 요일의 모든 날짜 구하기
특정 기간 내에서 특정 요일(예: 모든 월요일)에 해당하는 모든 날짜를 구하는 작업입니다. 이를 위해서는 시작 날짜부터 종료 날짜까지 순회하며 해당 요일을 찾아야 합니다.
import { eachWeekOfInterval, endOfYear, startOfYear, format } from 'date-fns'
const getSpecificDayOfWeekInYear = (date, dayOfWeek) => {
const start = startOfYear(date)
const end = endOfYear(date)
const allWeeks = eachWeekOfInterval({ start, end })
return allWeeks.map((week) => addDays(week, dayOfWeek))
}
const allMondays = getSpecificDayOfWeekInYear(new Date(2023, 0), 1) // 2023년의 모든 월요일
22.현재 날짜로부터 N일 후의 날짜 계산하기
현재 날짜로부터 N일 후의 날짜를 계산합니다.
import { addDays } from 'date-fns'
const getDateAfterNDays = (n) => {
return addDays(new Date(), n)
}
const dateAfter10Days = getDateAfterNDays(10) // 오늘로부터 10일 후의 날짜
23. 특정 날짜가 포함된 분기 구하기
주어진 날짜가 포함된 연도의 분기(1분기, 2분기, 3분기, 4분기)를 계산하는 방법입니다.
import { getQuarter } from 'date-fns'
const quarter = getQuarter(new Date(2023, 5)) // 2023년 6월이 포함된 분기
이러한 스킬들은 웹 개발, 특히 프런트엔드 및 백엔드 개발에 있어서 다양한 시나리오에서 매우 유용하게 쓰일 수 있습니다. 각 스킬은 개발자가 자주 마주치는 문제를 해결하고, 사용자에게 더 나은 경험을 제공하는 데 도움이 됩니다. date-fns 라이브러리를 통해 여러분의 JavaScript 개발 능력을 한 단계 끌어올려 보세요!