날짜와 시간은 거의 모든 애플리케이션에서 다루게 되는 필수적인 요소입니다. Swift에서는 Date
객체와 DateFormatter
클래스를 사용하여 날짜 정보를 다양한 형식으로 표시할 수 있습니다. 이 포스팅에서는 Swift 4에서 날짜 형식을 포맷팅하는 방법을 자세히 알아보겠습니다.
DateFormatter 기본 사용법
Swift에서 날짜 포맷팅의 핵심은 DateFormatter
클래스입니다. 이 클래스를 사용하면 Date
객체를 원하는 문자열 형식으로 변환할 수 있습니다.
// 현재 날짜 가져오기
let today = Date()
// DateFormatter 인스턴스 생성
let dateFormatter = DateFormatter()
// 원하는 형식 지정
dateFormatter.dateFormat = "yyyy-MM-dd EE"
// 로케일 설정 (한국어)
dateFormatter.locale = Locale(identifier: "ko_KR")
// 날짜를 문자열로 변환
print(dateFormatter.string(from: today))
// 출력 예: "2020-06-23 화"
자주 사용되는 날짜 포맷 패턴
dateFormat
속성에는 다양한 패턴 문자를 사용할 수 있습니다. 아래는 자주 사용되는 패턴들입니다:
년도 (Year)
y
: 연도 (1 또는 2자리) – 예: 8, 18yy
: 연도 (항상 2자리) – 예: 08, 18yyyy
: 연도 (항상 4자리) – 예: 2008, 2018
월 (Month)
M
: 월 (1 또는 2자리) – 예: 1, 12MM
: 월 (항상 2자리) – 예: 01, 12MMM
: 월 (축약형) – 예: Jan, DecMMMM
: 월 (전체) – 예: January, December
일 (Day)
d
: 일 (1 또는 2자리) – 예: 1, 31dd
: 일 (항상 2자리) – 예: 01, 31
요일 (Weekday)
E
: 요일 (축약형) – 예: 월, MonEEEE
: 요일 (전체) – 예: 월요일, Monday
시간 (Hour)
h
: 시간 (12시간제, 1 또는 2자리) – 예: 1, 12hh
: 시간 (12시간제, 항상 2자리) – 예: 01, 12H
: 시간 (24시간제, 1 또는 2자리) – 예: 1, 23HH
: 시간 (24시간제, 항상 2자리) – 예: 01, 23
분/초 (Minute/Second)
m
: 분 (1 또는 2자리) – 예: 1, 59mm
: 분 (항상 2자리) – 예: 01, 59s
: 초 (1 또는 2자리) – 예: 1, 59ss
: 초 (항상 2자리) – 예: 01, 59
오전/오후 (AM/PM)
a
: AM/PM 표시 – 예: 오전, AM
한국식 날짜 형식 예제
한국에서 자주 사용되는 날짜 형식을 구현하는 방법을 살펴보겠습니다:
YYYY-MM-DD 형식
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
dateFormatter.locale = Locale(identifier: "ko_KR")
print(dateFormatter.string(from: Date()))
// 출력 예: "2020-06-23"
YYYY. MM. DD(요일) 형식
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy. MM. dd(EE)"
dateFormatter.locale = Locale(identifier: "ko_KR")
print(dateFormatter.string(from: Date()))
// 출력 예: "2020. 06. 23(화)"
년월일 시분초 형식
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy년 MM월 dd일 HH시 mm분 ss초"
dateFormatter.locale = Locale(identifier: "ko_KR")
print(dateFormatter.string(from: Date()))
// 출력 예: "2020년 06월 23일 16시 39분 00초"
시간대(TimeZone) 설정
날짜와 시간을 표시할 때 시간대를 고려하는 것은 매우 중요합니다. DateFormatter
의 timeZone
속성을 사용하여 특정 시간대로 설정할 수 있습니다:
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateFormatter.timeZone = TimeZone(abbreviation: "KST") // 한국 표준시
print(dateFormatter.string(from: Date()))
날짜 계산하기
특정 날짜로부터 며칠 전이나 후의 날짜를 계산하는 것은 매우 일반적인 작업입니다. Swift에서는 여러 방법으로 이를 수행할 수 있습니다:
방법 1: timeIntervalSince1970 사용
// 7일 전 날짜 계산
let aWeekAgo: Double = Date().timeIntervalSince1970 - (7 * 24 * 60 * 60)
let sevenDaysAgoDate = Date(timeIntervalSince1970: aWeekAgo)
// 결과 출력
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
print(dateFormatter.string(from: sevenDaysAgoDate))
방법 2: Calendar 사용 (권장)
// 7일 전 날짜 계산
let calendar = Calendar.current
if let sevenDaysAgo = calendar.date(byAdding: .day, value: -7, to: Date()) {
// 결과 출력
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
print(dateFormatter.string(from: sevenDaysAgo))
}
Calendar
를 사용하는 방법이 더 권장됩니다. 이 방법은 윤년, 일광 절약 시간 등 복잡한 날짜 계산을 자동으로 처리해 줍니다.
문자열을 Date 객체로 변환하기
문자열을 Date
객체로 변환하는 것도 DateFormatter
를 사용하여 쉽게 할 수 있습니다:
let dateString = "2020-06-23"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
if let date = dateFormatter.date(from: dateString) {
print("변환된 Date: \(date)")
}
미리 정의된 날짜 스타일 사용하기
dateFormat
문자열을 직접 지정하는 대신 dateStyle
과 timeStyle
속성을 사용하여 미리 정의된 스타일을 적용할 수도 있습니다:
let dateFormatter = DateFormatter()
// 날짜 스타일 설정
dateFormatter.dateStyle = .full
dateFormatter.timeStyle = .none
print(dateFormatter.string(from: Date()))
// 출력 예: "2020년 6월 23일 화요일"
dateFormatter.dateStyle = .long
print(dateFormatter.string(from: Date()))
// 출력 예: "2020년 6월 23일"
dateFormatter.dateStyle = .medium
print(dateFormatter.string(from: Date()))
// 출력 예: "2020. 6. 23."
dateFormatter.dateStyle = .short
print(dateFormatter.string(from: Date()))
// 출력 예: "20. 6. 23."
특정 로케일에 맞는 날짜 형식
다양한 국가나 언어에 맞는 날짜 형식을 표시하기 위해 locale
속성을 설정할 수 있습니다:
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .full
dateFormatter.timeStyle = .none
// 한국어
dateFormatter.locale = Locale(identifier: "ko_KR")
print(dateFormatter.string(from: Date()))
// 출력 예: "2020년 6월 23일 화요일"
// 영어 (미국)
dateFormatter.locale = Locale(identifier: "en_US")
print(dateFormatter.string(from: Date()))
// 출력 예: "Tuesday, June 23, 2020"
// 일본어
dateFormatter.locale = Locale(identifier: "ja_JP")
print(dateFormatter.string(from: Date()))
// 출력 예: "2020年6月23日火曜日"
ISO 8601 형식 사용하기
웹 API와 통신할 때 자주 사용되는 ISO 8601 형식을 다루기 위해 Swift 4에서는 ISO8601DateFormatter
를 제공합니다:
let isoFormatter = ISO8601DateFormatter()
let isoDateString = isoFormatter.string(from: Date())
print(isoDateString)
// 출력 예: "2020-06-23T07:39:00Z"
// 옵션 설정
isoFormatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
let detailedIsoString = isoFormatter.string(from: Date())
print(detailedIsoString)
// 출력 예: "2020-06-23T07:39:00.123Z"
성능 고려사항
DateFormatter
객체 생성은 비용이 많이 드는 작업입니다. 반복적으로 날짜를 포맷팅해야 하는 경우(예: 테이블 뷰의 각 셀), DateFormatter
인스턴스를 재사용하는 것이 좋습니다:
// 전역 또는 속성으로 DateFormatter 인스턴스 선언
let sharedDateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
formatter.locale = Locale(identifier: "ko_KR")
return formatter
}()
// 필요한 곳에서 사용
func formatDate(_ date: Date) -> String {
return sharedDateFormatter.string(from: date)
}
날짜 비교하기
두 날짜를 비교하는 것도 중요한 작업입니다:
let now = Date()
let tomorrow = Calendar.current.date(byAdding: .day, value: 1, to: now)!
// 비교 연산자 사용
if now < tomorrow {
print("내일은 오늘 이후입니다.")
}
// timeIntervalSince 사용
let interval = tomorrow.timeIntervalSince(now)
print("오늘과 내일 사이의 시간 간격: \(interval) 초")
// Calendar 사용 (더 정확함)
let components = Calendar.current.dateComponents([.day], from: now, to: tomorrow)
if let days = components.day {
print("오늘과 내일 사이의 일 수: \(days)")
}
응용 예제: 상대적 시간 표시하기
소셜 미디어 앱에서 자주 볼 수 있는 “3분 전”, “2시간 전”과 같은 상대적 시간 표시 기능을 구현해 보겠습니다:
func relativeTimeString(for date: Date) -> String {
let calendar = Calendar.current
let now = Date()
let components = calendar.dateComponents([.year, .month, .day, .hour, .minute, .second], from: date, to: now)
if let years = components.year, years > 0 {
return "\(years)년 전"
}
if let months = components.month, months > 0 {
return "\(months)개월 전"
}
if let days = components.day, days > 0 {
return "\(days)일 전"
}
if let hours = components.hour, hours > 0 {
return "\(hours)시간 전"
}
if let minutes = components.minute, minutes > 0 {
return "\(minutes)분 전"
}
if let seconds = components.second, seconds > 0 {
return "\(seconds)초 전"
}
return "방금 전"
}
// 사용 예
let fiveMinutesAgo = Date(timeIntervalSinceNow: -5 * 60)
print(relativeTimeString(for: fiveMinutesAgo)) // "5분 전"
결론
Swift에서의 날짜 포맷팅은 DateFormatter
클래스를 통해 매우 유연하게 수행할 수 있습니다. 이 포스팅에서 다룬 내용을 바탕으로 여러분의 앱에서 다양한 날짜 표시 요구사항을 쉽게 구현할 수 있을 것입니다.
주요 핵심 포인트를 정리하면:
DateFormatter
의dateFormat
속성으로 원하는 날짜 형식을 지정할 수 있습니다.- 로케일(
locale
)과 시간대(timeZone
)를 설정하여 지역에 맞는 형식을 표시할 수 있습니다. - 날짜 계산은
Calendar
클래스를 사용하는 것이 더 정확합니다. - 성능을 위해
DateFormatter
인스턴스를 재사용하는 것이 좋습니다. - ISO 8601 형식을 다루기 위해
ISO8601DateFormatter
를 사용할 수 있습니다.
이러한 개념과 기술을 마스터하면 앱에서 날짜와 시간을 효과적으로 처리할 수 있을 것입니다.
답글 남기기