我想从所选日期中增加或减少一天。例如,用户选择 09-10-2019 ,当用户按下按钮时,日期应为 2019-10-10 。
我不是要从当前日期开始增加或减少一天。
在上一个屏幕上,我有一个变量->由用户选择,并且不是静态的
selecteddate =“ 09.10.2019”
我将其声明为全局变量,因此可以在多个屏幕中使用它,因此在此屏幕中,我得到了这个“选定日期”。
我有3个 UIButton 。昨天按钮,选定日期按钮和明天按钮
我按照答案说的去做。但不幸的是,我的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)
答案 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")
需要前一天。