2016-05-18 4 views
0

Ich habe ein Stück Code, das im Grunde in zwei Teile wirkt:NSDate: Werden Werte für morgen oder gestern

Teil 1: Der Benutzer stellt ein Date mit einem UIDatePicker. Zum Beispiel wählt der Benutzer einen Tag vor dem aktuellen Datum aus. Das ausgewählte neue Datum ist also 19.05.16 statt 18.05.16.

Teil 1 Code

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

var due_date = dateFormatter.dateFromString(dateString)! 

Teil 2: Ich habe Code erstellt, wie viele Tage zählt, sind von dem gewählten Datum links nach dem aktuellen Datum. In diesem Beispiel sagt mein Code irgendwie 0 Tage vor morgen. Hier ist der Code für den zweiten Teil:

Zweiter Teil:

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

Im Teil 1 Beispiel habe ich ein statisches Datum, das ich verwende diesen Code zu testen. In diesem Teil habe ich den 19. Mai 2016 einen Tag voraus gesetzt. Im zweiten Teil unten in der if-Anweisung sagt es irgendwie, dass ich noch 0 Tage übrig habe und von dem, was ich versuche, zu sagen, dass es einen Tag vor dem morgigen 19. Tag geben wird.

Ein anderes Beispiel, wenn ich den 19. zum 20. ändere, will ich es "In 2 Tagen" ab jetzt sagen.

Nun, wenn ich den Tag um sagen wir, den 15. Mai (in der Vergangenheit), dann würde die if-Anweisung etwas wie Überfällig oder die Vergangenheit sagen.

Wie kann ich das lösen?

+0

Seien Sie vorsichtig mit Ausdrücken wie "in 2 Tagen", weil sie sehr schwer zu lokalisieren sind. In einigen Sprachen ist nicht klar, auf welches Datum es sich bezieht. – Andriy

Antwort

0

Sie sollten bedenken, dass NSDate eine Struktur, die mit der Anzahl der Sekunden aus dem Jahr 2001 arbeitet Dies bedeutet, wenn Sie ein „Datum“ Pick es enthält „Datum und Uhrzeit“. Alles, was Sie tun müssen, um die richtige Anzahl von Tagen zwischen bestimmten "Daten" zu berechnen, ist eine Zeitkomponente zu kürzen.

Aber wenn Sie brauchen nur zu prüfen, ob zur Verfügung gestellt Datum gestern, heute oder morgen, NSCalendar ein Verfahren für diesen Zweck hat:

Objective-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); 

Und Swift:

@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 
+0

Sind diese Methoden in Swift 2 verfügbar? – DwellingNYC

+0

@harreola Natürlich sind sie. – Andriy

0

Sie könnten eine switch-Anweisung verwenden, um die verschiedenen Fälle zu behandeln, zum Beispiel

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