swift - 计算从两个 UIDatePickers Swift 4 中选择的日期值

标签 swift nsdateformatter uidatepicker

我有两个 UIDatePickers 和一个标签。我想计算两个日期选择器的开始日期和结束日期选择之间的差异,并将差异显示在标签上。这是我当前的代码:

@IBOutlet weak var YTDDateRange: UILabel!

@IBOutlet weak var startingDateMonthInput: UITextField!

@IBOutlet weak var endingDateMonthInput: UITextField!

private var datePickerStart: UIDatePicker?

private var datePickerEnd: UIDatePicker?

override func viewDidLoad() {
    super.viewDidLoad()

    datePickerStart = UIDatePicker()

    datePickerEnd = UIDatePicker()

    datePickerStart?.datePickerMode = .date

    datePickerEnd?.datePickerMode = .date

    datePickerStart?.addTarget(self, action: #selector(YTDChartViewControllerBase.dateChangedStart(datePicker:)), for: .valueChanged)

    datePickerEnd?.addTarget(self, action: #selector(YTDChartViewControllerBase.dateChangedEnd(datePicker:)), for: .valueChanged)

    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(YTDChartViewControllerBase.viewTapped(gestureRecognizer:)))

    view.addGestureRecognizer(tapGesture)

    startingDateMonthInput.inputView = datePickerStart

    endingDateMonthInput.inputView = datePickerEnd

    let dateformatter = DateFormatter()
    dateformatter.dateFormat = "MM/yyyy"

    dateformatter.dateStyle = DateFormatter.Style.long
    dateformatter.timeStyle = DateFormatter.Style.none

    var calendar = Calendar(identifier: .gregorian)
    calendar.timeZone = TimeZone(identifier: "PST")!
    var startDateComponents: DateComponents = DateComponents()
    startDateComponents.year = 1928
    startDateComponents.month = 1
    let defaultDate: Date = calendar.date(from: startDateComponents as DateComponents)!

    self.datePickerEnd!.date = Date()

    self.datePickerStart!.date = defaultDate as Date
    startingDateMonthInput.text = dateformatter.string(from: datePickerStart!.date)
    endingDateMonthInput.text = dateformatter.string(from: datePickerEnd!.date)
}

@objc func viewTapped(gestureRecognizer: UITapGestureRecognizer) {

    view.endEditing(true)

}

@objc func dateChangedStart(datePicker: UIDatePicker) {

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "MM/yyyy"
    dateFormatter.dateStyle = DateFormatter.Style.long
    startingDateMonthInput.text = dateFormatter.string(from: datePicker.date)
    view.endEditing(true)

}

@objc func dateChangedEnd(datePicker: UIDatePicker) {

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "MM/yyyy"
    dateFormatter.dateStyle = DateFormatter.Style.long
    endingDateMonthInput.text = dateFormatter.string(from: datePicker.date)
    view.endEditing(true)

}

这就是我试图找出两个日期选择器之间的区别的原因。

func YTDMarketClose(from datePickerStart: Date, to datePickerEnd: Date) -> Date {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "MM/yyyy"
    dateFormatter.dateStyle = DateFormatter.Style.long
    let YTDBegin = datePickerEnd.timeIntervalSince(datePickerStart)
    let today = Date()
    if YTDBegin < 0 {
        return today
    } else {
        return today.addingTimeInterval(YTDBegin)
        print(YTDBegin)
    }
}

但是,当我尝试将其设置为文本标签时,出现错误“无法将‘日期’的类型值分配给类型‘字符串?’。

 YTDDateRange.text = YTDMarketClose(from: datePickerStart!.date, to: datePickerEnd!.date)

我这样做是正确的还是我遗漏了什么。非常感谢任何帮助。

最佳答案

两个日期之间的差异不是另一个日期,而是一个时间间隔。您的 YTDBegin 变量是 TimerInterval 类型。这是秒数。不要试图将其转换回日期。将其转换为所需格式的字符串。

您的YTDMarketClose 方法需要返回String,而不是Date。然后您可以将结果分配给标签。

您应该使用 DateComponentsFormatter 从两个日期之间的差异中获取字符串。

func ytdMarketClose(from datePickerStart: Date, to datePickerEnd: Date) -> String {
    let formatter = DateComponentsFormatter()
    // configure the formatter to suit your needs
    let result = formatter.string(from: datePickerStart, to: datePickerEnd)

    return result ?? "Unknown"
}

作为旁注,类、结构和枚举名称以大写字母开头是标准的。变量、方法和案例名称以小写字母开头。

关于swift - 计算从两个 UIDatePickers Swift 4 中选择的日期值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57315623/

相关文章:

ios - 在 iOS8/Swift 中为 UIDatePicker 设置文本颜色和字体

ios - 文本字段/发送按钮在 JSQMessagesViewController 上的键盘弹出时消失

ios - 在不同 View 中使用操作时出现延迟

ios - 如何将日期选择器的值保存到变量中?

ios - 当 uidatepicker/pickerview 看起来与键盘 ios 相似时如何向上 ScrollView

objective-c - IOS 6 和 NSDateFormatter

swift - 在多维数组中编辑此元素的最有效方法是什么?

ios - 类型 'String' 的值没有成员 'substringToIndex'

ios - Swift - NSDateFormater 不工作

cocoa - 以时间戳格式获取当前 NSDate