[iOS] TimeZone Formatting

RudinP·2024년 4월 16일
0

Study

목록 보기
221/226

Swift에서 타임존별로 포맷팅을 해서 리턴을 해주는 익스텐션에 대해 작성한다.

타임존에따라 시간 포맷팅

fileprivate let formatter = DateFormatter()

extension TimeZone{
    var currentTime: String?{
        formatter.timeZone = self
        formatter.dateFormat = "h:mm"
        
        return formatter.string(from: .now)
    }
}
  • fileprivate : 동일한 소스 파일에서만 접근 가능
  • formatter.timeZone = self: TimeZone의 익스텐션임을 생각해야한다. formatter의 timeZone을 현재 포맷팅하려고 시도하는 TimeZone으로 설정한다.
  • formatter.dateFormat =에 원하는 포맷을 작성하면 된다.

타임존에따라 시차 리턴하기

  • 시차가 빠를 경우 앞에 + 붙이기
  • 시간 단위가 아닌, 30분 단위로 빠른 곳이 있으므로 그에 따른 포맷 분기 설정
fileprivate let offsetFormatter = DateComponentsFormatter()

extension TimeZone{
    var timeOffset: String?{
        let offset = secondsFromGMT() - TimeZone.current.secondsFromGMT()
        //offset이 양수인 경우 prefix를 +로 설정
        let prefix = offset >= 0 ? "+" : ""
        
        let comp = DateComponents(second: offset)
        
        //3600배수인 경우 시간 단위
        if offset.isMultiple(of: 3600) {
            offsetFormatter.allowedUnits = [.hour]
            offsetFormatter.unitsStyle = .full
        } else {
            offsetFormatter.allowedUnits = [.hour, .minute]
            offsetFormatter.unitsStyle = .positional
        }
        
        let offsetStr = offsetFormatter.string(from: comp) ?? "\(offset / 3600)시간"
        
        let time = Date(timeIntervalSinceNow: TimeInterval(offset))
        
        let cal = Calendar.current
        if cal.isDateInToday(time){
            return "오늘, \(prefix)\(offsetStr)"
        } else if cal.isDateInYesterday(time){
            return "어제, \(prefix)\(offsetStr)"
        } else if cal.isDateInTomorrow(time){
            return "내일, \(prefix)\(offsetStr)"
        } else {
            return nil
        }
    }
}

타임존 리턴하기

extension TimeZone{
    var city: String?{
        //TimeZone 프레임워크에는 city를 리턴하는 속성은 없다.
        let id = self.identifier
        //Asia/Seoul 같은 식으로 되어있기 때문
        let city = id.components(separatedBy: "/").last
        return city
    }
}

시간에 따른 am, pm 리턴하기

fileprivate let formatter = DateFormatter()

extension TimeZone{
    var timePeriod: String?{
        formatter.timeZone = self
        formatter.dateFormat = "a"
        
        return formatter.string(from: .now)
    }
profile
곰을 좋아합니다. <a href = "https://github.com/RudinP">github</a>

0개의 댓글