【问题标题】:How to change the hours and minutes in an existing Date object in Swift?如何在 Swift 中更改现有 Date 对象中的小时和分钟?
【发布时间】:2020-10-08 08:23:04
【问题描述】:

我需要比较两个 Date 对象以获取它们之间的天差,例如:10/10 与今天 10/7 比较将是 3,但从服务器返回给我的 Date 对象是与当前时间不一致。由于延迟,会有几分钟的差异,导致 10/10 比 10/7 提前 2

我找到了一行代码可以给我一个当前时间的Date对象,但是我想从其他地方转换一个现有的Date对象,我该怎么做?

let today = Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: Date())!

例如2020-10-08 16:08:57.259580+0000 我希望它是 2020-10-08 00:00:00 +0000 这样的东西

【问题讨论】:

  • 您可以使用DateComponents
  • @AndreasOetjen 这不是真的
  • 不要使用午夜。只需先解析您的日期字符串。然后将其设置为下午 12 点。对于日历计算,您应该始终使用中午

标签: swift


【解决方案1】:

不要使用午夜。只需先解析您的日期字符串。对于日历计算,您应该始终使用中午。首先创建一个自定义日期格式来正确解析您的日期字符串。

extension Formatter {
    static let iso8601: DateFormatter = {
        let formatter = DateFormatter()
        formatter.locale = .init(identifier: "en_US_POSIX")
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss.SSSSSSxx"
        formatter.timeZone = TimeZone(secondsFromGMT: 0)
        return formatter
    }()
}

然后创建一个帮助器将您的日期转换为中午时间,另一个用于计算两个日期之间的天数并将它们设置为中午:

extension Date {
    var noon: Date {
        Calendar.current.date(bySettingHour: 12, minute: 0, second: 0, of: self)!
    }
    func days(from date: Date) -> Int {
        Calendar.current.dateComponents([.day], from: date.noon, to: noon).day!
    }
    var daysFromToday: Int { days(from: Date()) }
}

游乐场测试:

let dateString = "2020-10-08 16:08:57.259580+0000"
let now = Date()  // "Oct 8, 2020 at 5:56 AM"
print(Formatter.iso8601.string(from: now))  // "2020-10-08 08:56:46.179000+0000\n"
if let date = Formatter.iso8601.date(from: dateString) {  // "Oct 8, 2020 at 1:08 PM"
    let days = Date().days(from: date)  // 0
}

let dateString = "2020-10-10 16:08:57.259580+0000"
if let date = Formatter.iso8601.date(from: dateString) {
    let days = date.daysFromToday  // 2
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 2017-04-06
    • 2014-11-03
    • 1970-01-01
    相关资源
    最近更新 更多