在上一个屏幕中选择的日期如何执行+1或-1?

时间:2019-05-08 10:39:32

标签: ios swift date

我想从所选日期中增加或减少一天。例如,用户选择 09-10-2019 ,当用户按下按钮时,日期应为 2019-10-10

我不是要从当前日期开始增加或减少一天。

在上一个屏幕上,我有一个变量->由用户选择,并且不是静态的

  

selecteddate =“ 09.10.2019”

我将其声明为全局变量,因此可以在多个屏幕中使用它,因此在此屏幕中,我得到了这个“选定日期”。

我有3个 UIButton 。昨天按钮,选定日期按钮和明天按钮

  • 当用户按下“昨天”按钮时,则应减少1天 “ selecteddate”变量
  • 当用户按下明天按钮时,则应将1天添加到 “ selecteddate”变量。

我按照答案说的去做。但不幸的是,我的selecteddate是一个字符串,我需要以其格式将字符串发送给api。 所以,我做了以下事情。

let dateFormattera = DateFormatter()
dateFormattera.dateFormat = "dd.MM.yyyy"
let date = dateFormattera.date(from: datetoday)
let newdate = Calendar.current.date(byAdding: .day, value: +1, to: date!)
let dateFormatterb = DateFormatter()
dateFormatterb.dateFormat = "dd.MM.yyyy"
let tomorrowdate = dateFormatterb.string(from: newdate!)



let dateFormatterx = DateFormatter()
let day = dateFormatterx.date(from: datetoday)
let newday = Calendar.current.date(byAdding: .day, value: +1, to: date!)
let dateFormattery = DateFormatter()
dateFormattery.dateFormat = "EEE"
let tomorrowday = dateFormattery.string(from: newdate!)

其中可能有垃圾代码,但这使一切正常运行。这是DATE和DAY。我必须使用它,因为尽管执行-1或+1,但将字符串转换为日期还是要在日期上加上+1天(由于UTC时间为18:00)

3 个答案:

答案 0 :(得分:3)

我建议您使用:

Calendar.current.date(byAdding: .day, value: 1, to: selecteddate)

这将为selecteddate

添加一天

然后,如前所述,如果您有2个按钮,则可以为每个按钮设置tag

  • yesterdaybutton.tag = -1
  • tomorrowbutton.tag = 1

我们将使用每个按钮的标签来增加或减少自selecteddate起的天数

因此,两个按钮都将使用此按钮:

 @IBAction func buttonAction(_ sender: UIButton) {
        let newDate = Calendar.current.date(byAdding: .day, value: sender.tag, to: selecteddate)
    }

答案 1 :(得分:1)

您可以创建如下所示的计算日期的方法。

func calculateDate(fromDate date: Date, withUnit value: Int) -> Date? {

    return Calendar.current.date(byAdding: .day, value: value, to: date)

}

如何使用它?

选择昨天按钮后,您需要如下所示的调用方法...

if let date = calculateDate(fromDate: selecteddate, withUnit: -1) {
    print(date)
} else {
   print("date is nil. may be due to different formats of dates")
}

选择“明天”按钮后,您需要如下所示的呼叫方法...

if let date = calculateDate(fromDate: selecteddate, withUnit: 1) {
    print(date)
} else {
   print("date is nil. may be due to different formats of dates")
}

注意:请根据需要使用日期格式。所有日期的日期格式都应该相同。

答案 2 :(得分:1)

您仍然需要将字符串转换为具体的对象,在您的情况下为Date。您可以根据需要添加或减去组件。在您的情况下,那是几天。检查以下内容:

func addDays(_ days: Int, toDate dateString: String?) throws -> String {

    guard let dateString = dateString else { throw NSError(domain: "Add days", code: 400, userInfo: ["dev_message": "String is null"]) }

    let formatter = DateFormatter()
    formatter.dateFormat = "dd'.'MM'.'yyyy"
    // formatter.dateFormat = "MM'.'dd'.'yyyy" // Not sure which

    guard let date = formatter.date(from: dateString) else { throw NSError(domain: "Add days", code: 400, userInfo: ["dev_message": "Incorrect date format. Expecting \(formatter.dateFormat!)"]) }

    guard let newDate = formatter.calendar.date(byAdding: {
        var components: DateComponents = DateComponents()
        components.day = days
        return components
    }(), to: date) else { throw NSError(domain: "Add days", code: 400, userInfo: ["dev_message": "Could not add days for some reason"]) }

    return formatter.string(from: newDate)
}

我尝试过的用法是:

print(try! addDays(1, toDate: "09.10.2019")) // Prints 10.10.2019
print(try! addDays(30, toDate: "09.10.2019")) // Prints 08.11.2019
print(try! addDays(-1, toDate: "09.10.2019")) // Prints 08.10.2019

因此,在您的情况下,您需要addDays(1, toDate: "09.10.2019")才能到达第二天,addDays(-1, toDate: "09.10.2019")需要前一天。