-1
C API를 사용하는 Swift 프로그램이 있습니다. 내 API 메소드 중 하나가 struct tm
을 반환합니다. Swift Date로 변환하는 방법이 있습니까? 아니면 C 측에서 직접 구문 분석하고 Swift에 수동으로 부품을 전달해야합니까?Swift - C 함수 및 struct tm
C API를 사용하는 Swift 프로그램이 있습니다. 내 API 메소드 중 하나가 struct tm
을 반환합니다. Swift Date로 변환하는 방법이 있습니까? 아니면 C 측에서 직접 구문 분석하고 Swift에 수동으로 부품을 전달해야합니까?Swift - C 함수 및 struct tm
Swift 표준 라이브러리의 내장 함수를 알지 못합니다.
extension Date {
init?(tm: tm) {
let gmtOffset = tm.tm_gmtoff // Save the offset because timegm() modifies it
var tm = tm // A mutable copy
var time = timegm(&tm) // The time components interpreted as GMT
if time == -1 { return nil } // timegm() had an error
time -= gmtOffset // Adjustment for actual time zone
self.init(timeIntervalSince1970: TimeInterval(time))
}
}
다음 struct tm
으로부터 값으로 DateComponents
구조체를 채우기 위해
if let date = Date(tm: yourStructTmVariable) {
print(date)
} else {
print("invalid value")
}
또 다른 가능한 방법은 그대로 사용할 수 있습니다하지만 당신은 C: Converting struct tm times with timezone to time_t에 설명 된대로 C 라이브러리에서 timegm()
을 사용할 수 있습니다 Calendar
을 사용하여 으로 변경하십시오. Date
:
extension Date {
init?(tm: tm) {
let comps = DateComponents(year: 1900 + Int(tm.tm_year),
month: 1 + Int(tm.tm_mon),
day: Int(tm.tm_mday),
hour: Int(tm.tm_hour),
minute: Int(tm.tm_min),
second: Int(tm.tm_sec))
var cal = Calendar(identifier: .gregorian)
guard let tz = TimeZone(secondsFromGMT: tm.tm_gmtoff) else { return nil }
cal.timeZone = tz
guard let date = cal.date(from: comps) else { return nil }
self = date
}
}