premier et dernier jour du mois en cours à swift

j'essaie d'avoir le premier et le dernier jour du mois à swift.

Jusqu'à présent j'ai ce qui suit:

let dateFormatter = NSDateFormatter()
let date = NSDate()
dateFormatter.dateFormat = "yyyy-MM-dd"
let calendar = NSCalendar.currentCalendar()
let components = calendar.components([.Year, .Month, .Day, .Hour, .Minute, .Second], fromDate: date)

let month = components.month
let year = components.year

let startOfMonth = ("(year)-(month)-01")

mais je ne sais pas comment obtenir le dernier rendez-vous. Y a-t-il une méthode intégrée qui me manque? Il faut évidemment tenir compte des années bissextiles, etc.

31
demandé sur Bartłomiej Semańczyk 2015-11-09 12:17:01

8 réponses

Vous obtenez le premier jour du mois simplement avec

let components = calendar.components([.Year, .Month], fromDate: date)
let startOfMonth = calendar.dateFromComponents(components)!
print(dateFormatter.stringFromDate(startOfMonth)) // 2015-11-01

Pour obtenir le dernier jour du mois, ajouter un mois et soustraire un jour:

let comps2 = NSDateComponents()
comps2.month = 1
comps2.day = -1
let endOfMonth = calendar.dateByAddingComponents(comps2, toDate: startOfMonth, options: [])!
print(dateFormatter.stringFromDate(endOfMonth)) // 2015-11-30

alternativement, utilisez le rangeOfUnit méthode qui vous donne le début et la durée du mois:

var startOfMonth : NSDate?
var lengthOfMonth : NSTimeInterval = 0
calendar.rangeOfUnit(.Month, startDate: &startOfMonth, interval: &lengthOfMonth, forDate: date)

pour une date le dernier jour du mois, additionnez la durée du mois moins une seconde:

let endOfMonth = startOfMonth!.dateByAddingTimeInterval(lengthOfMonth - 1)
50
répondu Martin R 2015-11-09 10:01:51

Swift 3 et 4 de drop-in extensions

C'est beaucoup plus facile avec Swift 3+:

  1. vous pouvez le faire sans garde (vous pourriez Si vous le vouliez, mais parce que DateComponents est un type non-optionnel maintenant, il n'est plus nécessaire).
  2. l'Utilisation d'iOS 8 startOfDayForDate (startOfDay), vous n'avez pas besoin de régler manuellement l'heure à 12h sauf si vous faites des calculs de calendrier vraiment fous à travers les fuseaux horaires.

C'est il convient de mentionner que certaines des autres réponses prétendent que vous pouvez raccourcir cela en utilisant Calendar.current.date(byAdding: .month, value: 0, to: Date())!, mais si cela échoue, c'est qu'il n'y a pas de mise à zéro de la journée, ni de prise en compte des différences de fuseaux horaires.

Ici, vous allez:

extension Date {
    func startOfMonth() -> Date {
        return Calendar.current.date(from: Calendar.current.dateComponents([.year, .month], from: Calendar.current.startOfDay(for: self)))!
    }

    func endOfMonth() -> Date {
        return Calendar.current.date(byAdding: DateComponents(month: 1, day: -1), to: self.startOfMonth())!
    }
}

print(Date().startOfMonth())     // "2018-02-01 08:00:00 +0000\n"
print(Date().endOfMonth())       // "2018-02-28 08:00:00 +0000\n"
69
répondu brandonscript 2018-02-05 17:33:20

avec Swift 3 & iOS 10 la façon la plus facile que j'ai trouvée de faire ceci est CalendardateInterval(of:for:):

guard let interval = calendar.dateInterval(of: .month, for: Date()) else { return }

vous pouvez alors utiliser interval.start et interval.end pour obtenir les dates dont vous avez besoin.

19
répondu LuisCien 2017-05-09 01:32:31

Swift 3

de Nombreux date exemple :

6 derniers mois, les 3 derniers mois, hier, dernier 7 jours, Dernier 30 jours, mois précédent, mois en cours début et fin, dernier mois début et fin date

let startDate = dateFormatter.string(from: Date().getThisMonthStart()!)
let endDate = dateFormatter.string(from: Date().getThisMonthEnd()!)

extension Date {

func getLast6Month() -> Date? {
    return Calendar.current.date(byAdding: .month, value: -6, to: self)
}

func getLast3Month() -> Date? {
    return Calendar.current.date(byAdding: .month, value: -3, to: self)
}

func getYesterday() -> Date? {
    return Calendar.current.date(byAdding: .day, value: -1, to: self)
}

func getLast7Day() -> Date? {
    return Calendar.current.date(byAdding: .day, value: -7, to: self)
}
func getLast30Day() -> Date? {
    return Calendar.current.date(byAdding: .day, value: -30, to: self)
}

func getPreviousMonth() -> Date? {
    return Calendar.current.date(byAdding: .month, value: -1, to: self)
}

// This Month Start
func getThisMonthStart() -> Date? {
    let components = Calendar.current.dateComponents([.year, .month], from: self)
    return Calendar.current.date(from: components)!
}

func getThisMonthEnd() -> Date? {
    let components:NSDateComponents = Calendar.current.dateComponents([.year, .month], from: self) as NSDateComponents
    components.month += 1
    components.day = 1
    components.day -= 1
    return Calendar.current.date(from: components as DateComponents)!
}

//Last Month Start
func getLastMonthStart() -> Date? {
    let components:NSDateComponents = Calendar.current.dateComponents([.year, .month], from: self) as NSDateComponents
    components.month -= 1
    return Calendar.current.date(from: components as DateComponents)!
}

//Last Month End
func getLastMonthEnd() -> Date? {
    let components:NSDateComponents = Calendar.current.dateComponents([.year, .month], from: self) as NSDateComponents
    components.day = 1
    components.day -= 1
    return Calendar.current.date(from: components as DateComponents)!
}

}
8
répondu Bhadresh Kathiriya 2017-07-19 10:49:04

2017...

tout d'Abord, obtenir le mois que vous avez besoin de:

    let cal = Calendar.current
    let d = Calendar.current.date(byAdding: .month, value: 0, to: Date())!

    // for "last month" just use -1, for "next month" just use 1, etc

Pour obtenir la journée de la semaine pour le premier jour du mois:

    let c = cal.dateComponents([.year, .month], from: d)
    let FDOM = cal.date(from: c)!
    let dowFDOM = cal.component(.weekday, from: FDOM)

    print("the day-of-week on the 1st is ... \(dowFDOM)")
    // so, that's 1=Sunday, 2=Monday, etc.

Pour obtenir le nombre de jours dans le mois:

    let r = cal.range(of: .day, in: .month, for: d)!
    let kDays = r.count

    print("the number of days is ... \(kDays)")
5
répondu Fattie 2017-07-17 17:32:07

Avec Swift 3, vous pouvez choisir l'un des deux modèles afin de récupérer le premier et le dernier jours du mois.


#1. En utilisant Calendar dateComponents(_:from:),date(from:) et date(byAdding:to:wrappingComponents:) méthode

Avec ce modèle, vous devez d'abord obtenir la date du premier jour d'un mois, puis ajouter un mois et de retirer un jour afin d'obtenir la date du dernier jour du mois. Le code du terrain de jeu ci-dessous montre comment le configurer:

import Foundation

// Set calendar and date 
let calendar = Calendar.current
let date = calendar.date(byAdding: DateComponents(day: -10), to: Date())!

// Get first day of month
let firstDayComponents = calendar.dateComponents([.year, .month], from: date)
let firstDay = calendar.date(from: firstDayComponents)!

// Get last day of month
let lastDayComponents = DateComponents(month: 1, day: -1)
let lastDay = calendar.date(byAdding: lastDayComponents, to: firstDay)!

// Set date formatter
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_UK")
dateFormatter.dateStyle = .long
dateFormatter.timeStyle = .long

// Print results
print(dateFormatter.string(from: date)) // Prints: 22 March 2017 at 18:07:15 CET
print(dateFormatter.string(from: firstDay)) // Prints: 1 March 2017 at 00:00:00 CET
print(dateFormatter.string(from: lastDay)) // Prints: 31 March 2017 at 00:00:00 CEST

#2. En utilisant Calendar range(of:in:for:),dateComponents(_:from:) et date(from:) et les méthodes

Avec ce modèle, vous obtenez une gamme de jour absolu des valeurs dans un mois et ensuite de récupérer les dates du premier jour et le dernier jour du mois. L'aire de Jeux de code ci-dessous montre comment le configurer:

import Foundation

// Set calendar and date
let calendar = Calendar.current
let date = calendar.date(byAdding: DateComponents(day: -10), to: Date())!

// Get range of days in month
let range = calendar.range(of: .day, in: .month, for: date)! // Range(1..<32)

// Get first day of month
var firstDayComponents = calendar.dateComponents([.year, .month], from: date)
firstDayComponents.day = range.lowerBound
let firstDay = calendar.date(from: firstDayComponents)!

// Get last day of month
var lastDayComponents = calendar.dateComponents([.year, .month], from: date)
lastDayComponents.day = range.upperBound - 1
//lastDayComponents.day = range.count // also works
let lastDay = calendar.date(from: lastDayComponents)!

// Set date formatter
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_UK")
dateFormatter.dateStyle = .long
dateFormatter.timeStyle = .long

// Print results
print(dateFormatter.string(from: date)) // prints: 22 March 2017 at 18:07:15 CET
print(dateFormatter.string(from: firstDay)) // prints: 1 March 2017 at 00:00:00 CET
print(dateFormatter.string(from: lastDay)) // prints: 31 March 2017 at 00:00:00 CEST
2
répondu Imanou Petit 2017-04-19 14:53:33

dans swift 3, Si vous mettez 0 à la composante de jour vous pouvez obtenir le dernier jour du mois. Il y a un exemple de code:

 public func isMoreDays(date: Date, asc: Bool)->Bool{
    //components
    var dayComponents = self.getDateComponents(date: date)
    //asc is true if ascendant or false if descendant
    dayComponents.day = asc ?  0 : 1
    //plus 1 to month 'cos if you set up day to 0 you are going to the previous month
    dayComponents.month = asc ? dayComponents.month! + 1 : dayComponents.month

    //instantiate calendar and get the date
    let calendar : Calendar = NSCalendar.current
    let day = calendar.date(from: dayComponents)

    //date comparison
    if(day?.compare(date) == .orderedSame){
        return false
    }
    return true
}
2
répondu Alfredo Luco G 2017-06-21 15:58:30

Swift 4

Si vous avez besoin seulement le jour ordinal:

func lastDay(ofMonth m: Int, year y: Int) -> Int {
    let cal = Calendar.current
    var comps = DateComponents(calendar: cal, year: y, month: m)
    comps.setValue(m + 1, for: .month)
    comps.setValue(0, for: .day)
    let date = cal.date(from: comps)!
    return cal.component(.day, from: date)
}

lastDay(ofMonth: 2, year: 2018)  // 28
lastDay(ofMonth: 2, year: 2020)  // 29
0
répondu Miguel Gallego 2018-05-26 19:22:54