web-dev-qa-db-ja.com

与えられた数で日付を作る

次のSwift(Swift 3)関数を使用して、日付コンポーネント(Date)で日付(DateComponents)を作成します。

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の日付が返されます。

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でそれを行うにはどうすればよいですか?ありがとう。

8
El Tomato

関数は適切な日付を返します。日付をUTCで表示するのはprint関数です。

ちなみに、ネイティブ Swift 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日付が必要な場合は、行のコメントを解除してタイムゾーンを設定します。

13
vadian

NSDateはタイムゾーンについて何も知りません。これは、カレンダーやタイムゾーンに依存しない時点を表します。ここで行ったように印刷する場合にのみ、GMTに変換されます。ただし、これは問題ありません。これはデバッグのみを目的としています。実際の出力では、NSDateFormatterを使用して日付を文字列に変換します。

ハッキーな解決策として、もちろん、コンポーネントから日付オブジェクトを作成するときにGMTを使用するようにカレンダーを構成することもできます。そうすれば、期待する文字列を取得できます。もちろん、その日付の他の計算は間違ってしまう可能性があります。

0
Sven