NSDate:为明天或昨天获取价值

时间:2016-05-18 07:34:03

标签: swift nsdate uidatepicker nscalendar

我有一段基本上分为两部分的代码:

第1部分:用户使用UIDatePicker设置日期。例如,用户从当前日期开始提前1天选择。所以选定的新日期是5/19/16而不是5/18/16。

第1部分代码

let dateFormatter = NSDateFormatter()
dateFormatter.locale = NSLocale.currentLocale()
var  dateString = "May-19-2016"
dateFormatter.dateFormat = "MMMM-dd-yyyy"

var due_date = dateFormatter.dateFromString(dateString)!

第2部分:我创建了一个代码,用于计算从所选日期到当前日期剩余的天数。在这个例子中,我的代码以某种方式在明天前0天说。以下是第二部分的代码:

第二部分:

func computeDates(dueDate:NSDate)-> Int {

let currentDate = NSDate()

// Adding days to currentDate
let daysToAdd = 1

// Adding on Unit to the current instance
let calculateDate = NSCalendar.currentCalendar().dateByAddingUnit(NSCalendarUnit.Day, value: daysToAdd, toDate: currentDate, options: NSCalendarOptions.init(rawValue: 0))

// Figure out many days from may 3rd
let cal = NSCalendar.currentCalendar()

let unit = NSCalendarUnit.Day

let components = cal.components(unit, fromDate: currentDate, toDate: dueDate, options: [])

let countLeft = components.day

return countLeft
}

print("Days left: \(computeDates(due_date)) ")


// Tests
let calc_date = computeDates(due_date)

if calc_date <= -1 {
    print("Yesterday")
} else if calc_date == 0 {
    print("Today")
} else if calc_date > 1 {          
    print("Tomorrow")
}

在第1部分示例中,我使用了一个静态日期来测试此代码。在这一部分,我提前一天在2016年5月19日。在if语句的下面的第二部分中,它以某种方式说我还剩0天,而且从我想要做的事情来看,它假设在明天19日之前还有1天。

另一个例子,如果我将19变为20,我希望它从现在开始说明&#34;在2天内#34;

现在,如果我回复那一天,可以说,5月15日(过去),那么if语句就会说出过期或过去。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

您应该考虑NSDate是一个从2001年开始运行的结构。这意味着,如果您选择&#34;日期&#34; 它包含< em>&#34;日期和时间&#34; 。所有您需要做的,以便计算某些&#34;日期&#34; 之间的正确天数是截断时间组件。

但如果你只需要检查提供的日期是昨天,今天还是明天,NSCalendar有一个方法可以达到这个目的:

目标-C:

- (BOOL)isDateInToday:(NSDate *)date NS_AVAILABLE(10_9, 8_0);
- (BOOL)isDateInYesterday:(NSDate *)date NS_AVAILABLE(10_9, 8_0);
- (BOOL)isDateInTomorrow:(NSDate *)date NS_AVAILABLE(10_9, 8_0);

和斯威夫特:

@available(OSX 10.9, *)
public func isDateInYesterday(date: NSDate) -> Bool

@available(OSX 10.9, *)
public func isDateInTomorrow(date: NSDate) -> Bool

@available(OSX 10.9, *)
public func isDateInWeekend(date: NSDate) -> Bool

答案 1 :(得分:0)

您可以使用switch语句来处理不同的情况,例如

func computeDates(dueDate:NSDate) -> Int
{
  let difference = NSCalendar.currentCalendar().components(.Day, fromDate: NSDate(), toDate:dueDate , options:[])
  return difference.day
}

let dueDate = NSDate().dateByAddingTimeInterval(200000)
let day = computeDates(dueDate)

switch day {
case 2..<1000: print("In \(day) days")
case 1:  print("1 day left before tomorrow")
case 0 : print("today")
case -1 : print("1 day left after yesterday")
default: print("\(abs(day)) days left")
}