合并 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)
}
在一个模拟 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)
}