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 =
에 원하는 포맷을 작성하면 된다.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
}
}
fileprivate let formatter = DateFormatter()
extension TimeZone{
var timePeriod: String?{
formatter.timeZone = self
formatter.dateFormat = "a"
return formatter.string(from: .now)
}