web-dev-qa-db-fra.com

premier et dernier jour du mois en cours dans swift

J'essaie d'avoir le premier et le dernier jour du mois à Swift.

Jusqu'à présent, j'ai les éléments suivants:

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? Évidemment, il faut tenir compte des années bissextiles, etc.

53
user2363025

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, ajoutez un mois et soustrayez 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

Vous pouvez également utiliser la méthode rangeOfUnit 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, ajoutez la longueur du mois moins une seconde:

let endOfMonth = startOfMonth!.dateByAddingTimeInterval(lengthOfMonth - 1)
63
Martin R

Swift 3 et 4 extensions instantanées

Cela devient en fait beaucoup plus facile avec Swift 3+:

  1. Vous pouvez le faire sans protection (vous pouvez le faire si vous le souhaitez, mais comme DateComponents est un type non optionnel, il n'est plus nécessaire).
  2. En utilisant startOfDayForDate d'iOS 8 (maintenant startOfDay), vous n'avez pas besoin de définir manuellement l'heure à minuit, à moins que vous ne fassiez des calculs de calendrier vraiment fous sur plusieurs fuseaux horaires.

Il vaut la peine de mentionner que certaines des autres réponses affirment que vous pouvez raccourcir cela en utilisant Calendar.current.date(byAdding: .month, value: 0, to: Date())!, mais en cas d'échec, cela signifie que le jour n'est pas mis à zéro ou que les fuseaux horaires ne sont pas pris en compte.

Voici:

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"
103
brandonscript

Avec Swift 3 & iOS 10, la façon la plus simple de procéder est de 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.

26
LuisCien

Swift

Nombreux exemples de date pour:

6 derniers mois, derniers mois, hier, les 7 derniers jours, les 30 derniers jours, le mois précédent,début du mois en cours & fin, dernier mois et date de fin

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

}
19
Bhadresh Kathiriya

2017 ...

D'abord, obtenez le mois dont vous avez besoin:

    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 le jour 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 du mois:

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

    print("the number of days is ... \(kDays)")
5
Fattie

Swift 4

Si vous avez seulement besoin du 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
4
Miguel Gallego

Dans Swift 3, si vous mettez le composant jour à 0, vous pouvez obtenir le dernier jour du mois. Voici 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
Alfredo Luco G

Avec Swift 3, vous pouvez choisir l’un des deux modèles suivants pour récupérer le premier et le dernier jour du mois.


#1. En utilisant CalendardateComponents(_:from:) , date(from:) et date(byAdding:to:wrappingComponents:) = méthodes

Avec ce modèle, vous obtenez d’abord la date du premier jour du mois, puis vous ajoutez un mois et en retirez un jour afin d’obtenir la date du dernier jour du mois. Le code de Playground 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 Calendarrange(of:in:for:) , dateComponents(_:from:) et date(from:) = et méthodes

Avec ce modèle, vous obtenez une plage de valeurs de jours absolus dans un mois, puis vous récupérez les dates du premier et du dernier jour du mois. Le code de Playground 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
Imanou Petit