2017-01-08 18 views
0

私は以下のSwift(Swift 3)関数を使って、日付コンポーネント(DateComponents)を持つ日付(Date)を作成します。与えられた数字で日付をつける

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タイムゾーンについては何も知りません。これは、任意のカレンダーまたはタイムゾーンから独立した時点を表します。あなたがここで行ったように印刷するときだけ、それはGMTに変換されます。これはOKですが、これはデバッグのためのものです。実際の出力の場合は、NSDateFormatterを使用して日付を文字列に変換します。

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

関連する問題