如何在 Swift 中查找给定日期的午夜

jac*_*b_g 2 date nsdate swift

我创建了一个行程生成应用程序,要求用户输入他/她的旅行日期。唯一的问题是,使用 UIDatePicker 时,日期始终作为给定日/月/年的当前时间给出。

在一个单独的文件中,我扩展了 Date 类来尝试编写一个简单的方法,该方法将返回给定日期的午夜。

首先我尝试过

    var midnight:Date{
    let cal = Calendar(identifier: .gregorian)
    return cal.startOfDay(for: self)
}
Run Code Online (Sandbox Code Playgroud)

然而,这总是给我 04:00 或 05:00,具体取决于夏令时,这给了我一个想法,我应该根据夏令时简单地删除 4 或 5 小时,因此我创建了以下方法:

    var timezone:TimeZone{
    return TimeZone.current
}
///Returns the first instance of the date, e.g. 2018-02-26 00:00:00
var trueMidnight:Date{
    let cal = Calendar(identifier: .gregorian)
    let midnight = cal.startOfDay(for: self)
    let secondsFromGMT = TimeZone.current.secondsFromGMT()
    print("Daylight savings? \(daylightSavings)")
    return midnight.addingTimeInterval(Double(secondsFromGMT))
}
///If this var returns true, then daylight savings time is active and an hour of daylight is gained (during the summer).
var isDaylightSavings:Bool{
    return timezone.daylightSavingTimeOffset(for: self) == 0 ? false : true
}
var daylightSavings:Double{
    return isDaylightSavings ? 3600.0 : 0.0
}
Run Code Online (Sandbox Code Playgroud)

然而,这些方法有时会返回前一天的午夜、23:00 甚至 22:00。

我是一个相对缺乏经验的程序员,所以我觉得我对日期类缺乏基本的理解或缺少一个大的概念。为什么我很难简单地找到给定日期的午夜?

我什至放弃了午夜返回的想法,并尝试使用代码找到某一天的中午:

    var noon:Date{
    let gregorian = Calendar(identifier: .gregorian)
    var components = gregorian.dateComponents([.year, .month, .day, .hour, .minute, .second], from: self)

    components.hour = 12
    components.minute = 0
    components.second = 0
    return gregorian.date(from: components)!
}
Run Code Online (Sandbox Code Playgroud)

但这会返回 16:00 或 17:00,而不是中午。任何帮助,将不胜感激。

pap*_*111 8

当您打印日期时,它会以 UTC时间打印。因此,当您打印Dates 时,它们与您的当地时间相差 4/5 小时。

如果您使用以下代码代替

print(yourDate.description(with: .current))
Run Code Online (Sandbox Code Playgroud)

您的日期在哪里yourDate,它将位于正确的时区。