2017-01-08 10 views
0

날짜 구성 요소 (DateComponents)와 날짜 (Date)를 만드는 다음 Swift (Swift 3) 기능이 있습니다.주어진 숫자를 사용하여 날짜 만들기

func makeDate(year: Int, month: Int, day: Int, hr: Int, min: Int, sec: Int) -> NSDate { 
    let calendar = NSCalendar(calendarIdentifier: .gregorian)! 
    let components = NSDateComponents() 
    components.year = year 
    components.month = month 
    components.day = day 
    components.hour = hr 
    components.minute = min 
    components.second = sec 
    let date = calendar.date(from: components as DateComponents) 
    return date! as NSDate 
} 

GMT를 사용하면 GMT 날짜가 반환됩니다.

override func viewDidLoad() { 
    super.viewDidLoad() 
    let d = makeDate(year: 2017, month: 1, day: 8, hr: 22, min: 16, sec: 50) 
    print(d) // 2017-01-08 13:16:50 +0000 
} 

실제로 원하는 것은 그 숫자를 기반으로 한 날짜 (2017-01-08 22:16:50)입니다. DateComponents으로 어떻게 할 수 있습니까? 감사.

+0

자동으로 시간대를 차지하는 문제가 있습니까? –

+0

그렇다면 NSDateFormatter를 사용해야합니까? –

답변

1

이 함수는 적절한 날짜를 반환합니다. UTC로 날짜를 표시하는 것은 print 함수입니다. 그런데

, 함수의 기본 스위프트 3 버전은

func makeDate(year: Int, month: Int, day: Int, hr: Int, min: Int, sec: Int) -> Date { 
    var calendar = Calendar(identifier: .gregorian) 
    // calendar.timeZone = TimeZone(secondsFromGMT: 0)! 
    let components = DateComponents(year: year, month: month, day: day, hour: hr, minute: min, second: sec) 
    return calendar.date(from: components)! 
} 

입니다하지만 당신이 정말로 시간대를 설정하는 라인을, UTC 날짜가 주석을 해제하려는 경우.

0

NSDate 시간대에 대해 알지 못합니다. 그것은 어떤 달력이나 시간대와도 독립적 인 시점을 나타냅니다. 여기에서했던 것처럼 인쇄 할 때만 그리니치 표준시로 변환됩니다. 그래도 괜찮습니다. 이것은 디버깅에만 사용됩니다. 실제 출력의 경우 NSDateFormatter을 사용하여 날짜를 문자열로 변환하십시오.

해커 솔루션으로 구성 요소에서 날짜 개체를 만들 때 GMT를 사용하도록 일정을 구성 할 수 있습니다. 그렇게하면 원하는 문자열을 얻을 수 있습니다. 물론 그 날짜의 다른 계산은 잘못 될 수 있습니다.