Swift 4에서 날짜(Date) 형식 포맷팅 완벽 가이드

날짜와 시간은 거의 모든 애플리케이션에서 다루게 되는 필수적인 요소입니다. 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, 18
  • yy: 연도 (항상 2자리) – 예: 08, 18
  • yyyy: 연도 (항상 4자리) – 예: 2008, 2018

월 (Month)

  • M: 월 (1 또는 2자리) – 예: 1, 12
  • MM: 월 (항상 2자리) – 예: 01, 12
  • MMM: 월 (축약형) – 예: Jan, Dec
  • MMMM: 월 (전체) – 예: January, December

일 (Day)

  • d: 일 (1 또는 2자리) – 예: 1, 31
  • dd: 일 (항상 2자리) – 예: 01, 31

요일 (Weekday)

  • E: 요일 (축약형) – 예: 월, Mon
  • EEEE: 요일 (전체) – 예: 월요일, Monday

시간 (Hour)

  • h: 시간 (12시간제, 1 또는 2자리) – 예: 1, 12
  • hh: 시간 (12시간제, 항상 2자리) – 예: 01, 12
  • H: 시간 (24시간제, 1 또는 2자리) – 예: 1, 23
  • HH: 시간 (24시간제, 항상 2자리) – 예: 01, 23

분/초 (Minute/Second)

  • m: 분 (1 또는 2자리) – 예: 1, 59
  • mm: 분 (항상 2자리) – 예: 01, 59
  • s: 초 (1 또는 2자리) – 예: 1, 59
  • ss: 초 (항상 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) 설정

날짜와 시간을 표시할 때 시간대를 고려하는 것은 매우 중요합니다. DateFormattertimeZone 속성을 사용하여 특정 시간대로 설정할 수 있습니다:

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 문자열을 직접 지정하는 대신 dateStyletimeStyle 속성을 사용하여 미리 정의된 스타일을 적용할 수도 있습니다:

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 클래스를 통해 매우 유연하게 수행할 수 있습니다. 이 포스팅에서 다룬 내용을 바탕으로 여러분의 앱에서 다양한 날짜 표시 요구사항을 쉽게 구현할 수 있을 것입니다.

주요 핵심 포인트를 정리하면:

  1. DateFormatterdateFormat 속성으로 원하는 날짜 형식을 지정할 수 있습니다.
  2. 로케일(locale)과 시간대(timeZone)를 설정하여 지역에 맞는 형식을 표시할 수 있습니다.
  3. 날짜 계산은 Calendar 클래스를 사용하는 것이 더 정확합니다.
  4. 성능을 위해 DateFormatter 인스턴스를 재사용하는 것이 좋습니다.
  5. ISO 8601 형식을 다루기 위해 ISO8601DateFormatter를 사용할 수 있습니다.

이러한 개념과 기술을 마스터하면 앱에서 날짜와 시간을 효과적으로 처리할 수 있을 것입니다.

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다