Swift3 用给定的数字制作日期

Swift3 用给定的数字制作日期,swift3,nsdate,nscalendar,nsdatecomponents,Swift3,Nsdate,Nscalendar,Nsdatecomponents,我有下面的Swift(Swift 3)功能,可以使用日期组件(DateComponents)生成日期(DateComponents) 如果我使用它,它将返回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

我有下面的Swift(Swift 3)功能,可以使用日期组件(
DateComponents
)生成日期(
DateComponents

如果我使用它,它将返回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
?谢谢。

该函数确实返回了正确的日期。它是以UTC显示日期的
打印
功能

顺便说一下,您的函数的本机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日期,请取消对该行的注释以设置时区。

NSDate
对时区一无所知。它表示独立于任何日历或时区的时间点。只有在像这里一样打印出来时,才会转换为GMT。不过这没关系——这只是为了调试。对于实际输出,使用
NSDateFormatter
将日期转换为字符串


作为一个黑客解决方案,您当然可以将日历配置为在从组件创建日期对象时使用GMT。这样你就可以得到你想要的字符串。当然,使用该日期进行的任何其他计算都可能以错误告终。

是否会自动计算时区?如果是,也许您应该尝试使用NSDateFormatter?因此,无法调试,因为po、vo和print将始终打印UTC时间?我真不敢相信那些废话。典型的Apple No API无法按预期工作。@Duck您可以
打印当前区域设置中的日期:
打印(date.description(with:.current))
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)!
}