[카테고리:] 미분류

  • 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를 사용할 수 있습니다.

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