合并 swift 中的日期和时间

merging date and hours in swift

在一个模拟 json 文件中,我收到分开的日期、开始时间、结束时间,因此我需要合并日期和开始日期,然后对结束日期执行相同操作。以前,我有过这样的约会:

23/03/2022

并且代码有效,现在我有了这个,它导致旧代码崩溃:

"2021-06-25T07:50:56.970Z”

我得到日期和我需要的时间的对象部分

"date": "2021-06-25T07:50:56.970Z",
                      "time": {
                        "from": "17:00",
                        "to": "18:00"
                      }

操纵此类日期的代码:

public class ShortDateTimeFormatter: DateFormatter {
    
    override public init() {
        super.init()
        self.dateFormat = "dd/MM/yyyy HH:mm"
    }
    
    required public init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
}

这里用作 let

private let shortTimeFormatter = ShortDateTimeFormatter()
          

在这里打电话

 if let startTime = hours.from,
                   let startDate = date.concats(startTime),
                    let start = self.shortTimeFormatter.date(from: startDate) {
                    event.startDate = start
                    event.addAlarm(EKAlarm(absoluteDate: start.dayBefore))
                    event.addAlarm(EKAlarm(absoluteDate: start.halfHourBefore))
                    event.endDate = start.hourAfter
                }
        
            if let endTime = hours.to,
                let endDate = date.concats(endTime),
                let end = self.shortTimeFormatter.date(from: endDate) {
                event.endDate = end
            }

最终,用在这里

 guard let url = URL(string: "calshow:\(event.startDate.timeIntervalSinceReferenceDate)") else { return }

我怎样才能安排一个我现在可以使用的日期?换句话说,我认为我需要从“2021-06-25T07:50:56.970Z”中获取 day/month/year,并采用更严格的格式,例如“旧日期”,然后继续。或者可能需要一种不同的方式来处理它。

以下是您可以执行的操作。

import Foundation

let input = "2021-06-25T07:50:56.970Z"
let iso8601 = ISO8601DateFormatter()
iso8601.formatOptions = [.withFullDate, .withFullTime, .withFractionalSeconds]
if let date = iso8601.date(from: input) {
    var calendar = Calendar.current
    calendar.timeZone = TimeZone(secondsFromGMT: 0)! // same as your input time zone (and force cast tested only for UTC)
    let dateComps = calendar.dateComponents([.day, .month, .year], from: date)
    
    let start = "17:00"
    let startDate = dateByAppending(time: start, to: dateComps, using: calendar)
    
    let end = "18:00"
    let endDate = dateByAppending(time: end, to: dateComps, using: calendar)
}

func dateByAppending(time: String, to dateComponents: DateComponents, using calendar: Calendar) -> Date? {
    var dateComps = dateComponents
    let timeComps = time.components(separatedBy: ":")
    if timeComps.count == 2 {
        dateComps.hour = Int(timeComps[0])
        dateComps.minute = Int(timeComps[1])
    }
    return calendar.date(from: dateComps)
}