首页 > 解决方案 > 快速转换日期格式失败,但不能使用 ISO8601DateFormatter

问题描述

我未能获得“开始”值,测试了许多变体和格式化程序。由于生产原因不能使用 ISO8601DateFormatter。

此代码是在日历上创建约会的一部分,因此我需要从约会的开始日期/小时开始。

最重要的是,我需要了解为什么在我尝试转换日期后最后一行代码会失败:

event.startDate 是我的“开始”,但无法设置它,因为转换日期失败

   guard let url = URL(string: "calshow:\(event.startDate.timeIntervalSinceReferenceDate)") else { return }
            DispatchQueue.main.async {
                UIApplication.shared.open(url, options: [:], completionHandler: nil)
            }
      

我的代码:

日期0

是我从 API 获得的日期,值为 2021-07-28 00:00:00 +0000

我在日历上创建事件的更新代码

let dateFormatter: DateFormatter = DateFormatter()

            dateFormatter.dateFormat = "dd-MM-yyyy HH:mm:ss"
            let date = dateFormatter.string(from: date0)
            
            
            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
            }

连接代码

  func concats(_ string: String, withSeparator separator: String? = "") -> String? {
        return [self, string].compactMap{ $0 }.joined(separator: separator! + " ")
    }

短日期时间格式化程序

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")
    }
    
}

标签: swiftdatensdateformatter

解决方案


如果我理解您得到的代码Date没有时间部分,并且您想以字符串格式添加时间"HH:mm:ss"

Calendar可以做到这一点。您无需将 to转换Date回.StringDate

首先创建一个将时间字符串转换为Int组件的函数

func timeComponents(from string: String) -> (Int, Int, Int)? {
    let comps = string.components(separatedBy: ":")
    guard comps.count == 3,
          let hr = Int(comps[0]),
          let mn = Int(comps[1]),
          let sc = Int(comps[2])
          else { return nil }
    return (hr, mn, sc)
}

然后将时间添加到date0withdate(bySettingHour:minute:second:of:)

if let (hr, mn, sc) = timeComponents(from: "08:30:00") {
    let startDate = Calendar.current.date(bySettingHour: hr, minute: mn, second: sc, of: date0)
}

或与DateComponents

func timeComponents(from string: String) -> DateComponents? {
    let comps = string.components(separatedBy: ":")
    guard comps.count == 3,
          let hr = Int(comps[0]),
          let mn = Int(comps[1]),
          let sc = Int(comps[2])
          else { return nil }
    return DateComponents(hour: hr, minute: mn, second: sc)
}

if let components = timeComponents(from: "08:30:00") {
    let startDate = Calendar.current.date(byAdding: components, to: date0, wrappingComponents: false)
}

推荐阅读