2016-03-23 17 views
-1

Ich habe den folgenden Code:Generierung von Anfang und Ende des Monats. Swift 2

func rangeOfPeriod(period: NSCalendarUnit, date: NSDate) -> (NSDate, NSDate) { 
     let calendar = NSCalendar.currentCalendar() 
     var startDate: NSDate? = nil 
     var duration: NSTimeInterval = 0 

     calendar.rangeOfUnit(period, startDate: &startDate, interval: &duration, forDate: date) 

     let endDate = startDate!.dateByAddingTimeInterval(duration - 1) 

     return (startDate!, endDate) 
} 

Wenn ich die folgenden Zeilen drucken:

print("Day test = \(rangeOfPeriod(.Day, date: NSDate()))") 
print("Week test = \(rangeOfPeriod(.WeekOfYear, date: NSDate()))") 
print("month test = \(rangeOfPeriod(.Month, date: NSDate()))") 
print("Year test = \(rangeOfPeriod(.Year, date: NSDate()))") 

Alle von ihnen, wie abgesehen von Monat erwartet.

Ich bekomme 'Monatstest = (2016-03-01 00:00:00 +0000, 2016-03-31 22:59:59 +0000)' als Ergebnis und es scheint eine Stunde zu fehlen. Für die Zeit für alle anderen bekomme ich '2016-03-26 23:59:59 +0000'.

Jede mögliche Hilfe

+0

Mögliche Duplikat [ersten und letzten Tag des laufenden Monats in swift] genauer ist (http://stackoverflow.com/questions/ 33605816/Erster-und-letzter-Tag-des-aktuellen-Monats-in-Swift) –

+1

Sommerzeit – Sulthan

Antwort

1

Vielleicht versteht sich, gibt es eine Verwirrung über die interval Parameter in der rangeOfUnit Methode.

Aus der Dokumentation

func rangeOfUnit(_ unit: NSCalendarUnit, 
     startDate datep: AutoreleasingUnsafeMutablePointer<NSDate?>, 
      interval tip: UnsafeMutablePointer<NSTimeInterval>, 
      forDate date: NSDate) -> Bool 

.....

Spitze: Nach der Rückkehr enthält die Dauer (wie NSTimeInterval) der Kalendereinheit unit dass das Datum enthält date


Für diesen Monat (März 2016) auf Grund der Sommerzeit die Dauer ändern ist

31 * 86400.0 - 3600.0 = 2674800.0 

Das bedeutet, dass es eine Stunde fehlt, aber es ist, wenn nicht angegeben.


Um das Ende des Monats zu erhalten diese

func endOfThisMonth() -> NSDate 
{ 
    let calendar = NSCalendar.currentCalendar() 
    let components = NSDateComponents() 
    components.day = 1 
    let startOfNextMonth = calendar.nextDateAfterDate(NSDate(), matchingComponents: components, options: .MatchNextTime)! 
    return calendar.dateByAddingUnit(.Second, value: -1, toDate: startOfNextMonth, options: [])! 
}