iOS/Swift

날짜와 시간을 특정형식의 문자열로 반환하는 코드

밤새는 탐험가89 2024. 10. 9. 00:32

Date 타입에 두 가지 계산 속성(computed properties)을 추가하여 날짜와 시간을 특정 형식의 문자열로 변환하는 기능을 제공

 

extension Date {
    var dayAndTimeText: String {
        let timeText = formatted(date: .omitted, time: .shortened)
        if Locale.current.calendar.isDateInToday(self) {
            let timeFormat = NSLocalizedString("Today at %@", comment: "Today at time format string")
            return String(format: timeFormat, timeText)
        } else {
            let dateText = formatted(.dateTime.month(.abbreviated).day())
            let dateAndTimeFormat = NSLocalizedString("%@ at %@", comment: "Date and time format string")
            return String(format: dateAndTimeFormat, dateText, timeText)
        }
    }
    
    var dayText: String {
        if Locale.current.calendar.isDateInToday(self) {
            return NSLocalizedString("Today", comment: "Today due date description")
        } else {
            return formatted(.dateTime.month().day().weekday(.wide))
        }
    }
}

 

 

각 부분의 상세 설명

1. extension Date

Swift의 extension 키워드를 사용하여 기존의 Date 타입에 새로운 기능을 추가합니다. 이 경우, 두 가지 계산 속성(dayAndTimeText와 dayText)을 추가하여 날짜와 시간을 특정 형식의 문자열로 변환할 수 있게 합니다.

2. var dayAndTimeText: String

이 속성은 Date 객체를 "오늘"인지 여부에 따라 다른 형식의 문자열로 변환합니다.

  • 시간 텍스트 생성:
let timeText = formatted(date: .omitted, time: .shortened)

 

formatted 메서드를 사용하여 날짜 부분은 생략하고(time 부분만), 시간을 단축 형식으로 포맷팅합니다. 예를 들어, "3:00 PM"과 같은 형식입니다.

 

  • 오늘인지 확인:
if Locale.current.calendar.isDateInToday(self) {
 

 

현재 날짜(self)가 오늘인지 확인합니다. Locale.current.calendar는 현재 로케일의 달력을 사용하여 날짜를 확인합니다.

  • 오늘인 경우:
let timeFormat = NSLocalizedString("Today at %@", comment: "Today at time format string")
return String(format: timeFormat, timeText)

 

 

 

NSLocalizedString을 사용하여 "Today at %@" 형식의 문자열을 가져옵니다. 이는 현지화된 문자열로, %@는 시간 텍스트가 삽입될 자리입니다. 예를 들어, "오늘 오후 3:00"과 같은 형식으로 반환됩니다.

  • 오늘이 아닌 경우:
let dateText = formatted(.dateTime.month(.abbreviated).day())
let dateAndTimeFormat = NSLocalizedString("%@ at %@", comment: "Date and time format string")
return String(format: dateAndTimeFormat, dateText, timeText)

 

 

날짜를 "월 약어"와 "일" 형식으로 포맷팅합니다. 예를 들어, "Oct 8". 그런 다음, "Oct 8 at 3:00 PM"과 같이 날짜와 시간을 결합한 문자열을 반환합니다. 이 역시 NSLocalizedString을 사용하여 현지화된 형식을 적용합니다.

 

3. var dayText: String

이 속성은 Date 객체의 날짜 부분을 특정 형식의 문자열로 변환합니다.

  • 오늘인지 확인:
if Locale.current.calendar.isDateInToday(self) {
    return NSLocalizedString("Today", comment: "Today due date description")
}

 

 

날짜가 오늘이면 "Today"라는 현지화된 문자열을 반환합니다.

  • 오늘이 아닌 경우:
return formatted(.dateTime.month().day().weekday(.wide))

 

 

  • 날짜를 "월", "일", "요일" 형식으로 포맷팅합니다. 예를 들어, "October 8, Monday"와 같은 형식입니다. 현지화된 형식이 적용됩니다.

추가 설명

  • 현지화(Localization):
  • NSLocalizedString 함수는 앱이 여러 언어를 지원할 수 있도록 문자열을 현지화하는 데 사용됩니다. 이 코드는 "Today at %@" 및 "%@ at %@" 형식을 현지화하여 다양한 언어와 문화권에 맞는 날짜 및 시간 표현을 제공합니다.
  • formatted 메서드:
  • Swift의 formatted 메서드는 Date를 특정 형식으로 문자열로 변환하는 편리한 방법입니다. .dateTime 옵션을 사용하여 필요한 날짜 및 시간 구성 요소를 지정할 수 있습니다. 예를 들어, .omitted는 해당 부분을 생략하고, .shortened는 짧은 형식으로 표시합니다.
  • Locale.current.calendar.isDateInToday:
  • 현재 로케일의 달력을 사용하여 날짜가 오늘인지 확인하는 메서드입니다. 이는 로케일에 따라 달력이 다를 수 있는 경우에도 올바르게 동작하도록 보장합니다.

예시

다음은 이 확장 속성을 사용하는 예시입니다:

let now = Date()
print(now.dayAndTimeText) // 예: "Today at 3:00 PM" 또는 현지화된 형식
print(now.dayText)        // 예: "Today" 또는 현지화된 형식

let someDate = Calendar.current.date(byAdding: .day, value: 1, to: now)!
print(someDate.dayAndTimeText) // 예: "Oct 9 at 3:00 PM" 또는 현지화된 형식
print(someDate.dayText)        // 예: "Monday, Oct 9" 또는 현지화된 형식