5 votes

Comment obtenir la date de début et la date de fin du mois en cours (Swift 3)

Je cherche à obtenir les dates de début et de fin du mois en cours au format dd/MM/yyyy. J'ai essayé d'utiliser une extension comme indiqué dans cette question SO. Mais cela ne semble pas correspondre à ce que je veux (le format est différent et cela me donne la date de fin du mois dernier et la date de l'avant-dernier jour du mois en cours). Est-ce que quelqu'un peut m'aider.

Classe Extension:

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

    func endOfMonth() -> Date? {
        var comp: DateComponents = Calendar.current.dateComponents([.month, .day, .hour], from: Calendar.current.startOfDay(for: self))
        comp.month = 1
        comp.day = -1
        return Calendar.current.date(byAdding: comp, to: self.startOfMonth()!)
    }
}

Ma Structure:

struct Constants{

    // clés requises pour effectuer un appel de connexion (méthode POST)
    struct LoginKeys {
       .....
    }

    struct RankingKeys {

        static let DateFrom = String(describing: Date().startOfMonth()) //me donnant 2016-11-30 16:00:00 +0000 
        static let DateTo  = String(describing: Date().endOfMonth())
//2016-12-30 16:00:00 +0000
    }
}

Résultat Attendu:

DateFrom  = "01/12/2016"
DateTo = "31/12/2016"

10voto

Pragnesh Vitthani Points 1692

Vous devriez écrire ce code simple :

let dateFormatter = DateFormatter()
let date = Date()
dateFormatter.dateFormat = "dd-MM-yyyy"

Pour commencer la date :

let comp: DateComponents = Calendar.current.dateComponents([.year, .month], from: date)
let startOfMonth = Calendar.current.date(from: comp)!
print(dateFormatter.string(from: startOfMonth))

Pour la date de fin :

var comps2 = DateComponents()
comps2.month = 1
comps2.day = -1
let endOfMonth = Calendar.current.date(byAdding: comps2, to: startOfMonth)
print(dateFormatter.string(from: endOfMonth!))

5voto

Hung Hoang Points 544

C'est ce que j'utilise. Assez simple mais ça marche.

extension Calendrier {

func jourDeLaSemaine(_ date: Date) -> Int {
    var jourDeLaSemaine = self.component(.weekday, from: date) + 1 - self.firstWeekday

    if jourDeLaSemaine <= 0 {
        jourDeLaSemaine += 7
    }

    return jourDeLaSemaine
}

func debutDeLaSemaine(_ date: Date) -> Date {
    return self.date(byAdding: DateComponents(day: -self.jourDeLaSemaine(date) + 1), to: date)!
}

func finDeLaSemaine(_ date: Date) -> Date {
    return self.date(byAdding: DateComponents(day: 6), to: self.debutDeLaSemaine(date))!
}

func debutDuMois(_ date: Date) -> Date {
    return self.date(from: self.dateComponents([.year, .month], from: date))!
}

func finDuMois(_ date: Date) -> Date {
    return self.date(byAdding: DateComponents(month: 1, day: -1), to: self.debutDuMois(date))!
}

func debutDuTrimestre(_ date: Date) -> Date {
    let trimestre = (self.component(.month, from: date) - 1) / 3 + 1
    return self.date(from: DateComponents(year: self.component(.year, from: date), month: (trimestre - 1) * 3 + 1))!
}

func finDuTrimestre(_ date: Date) -> Date {
    return self.date(byAdding: DateComponents(month: 3, day: -1), to: self.debutDuTrimestre(date))!
}

func debutDeLAnnee(_ date: Date) -> Date {
    return self.date(from: self.dateComponents([.year], from: date))!
}

func finDeLAnnee(_ date: Date) -> Date {
    return self.date(from: DateComponents(year: self.component(.year, from: date), month: 12, day: 31))!
}
}

2voto

LuisCien Points 3369

Avec Swift 3 & iOS 10, la manière la plus simple que j'ai trouvée pour le faire est Calendar dateInterval(of:for:) :

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

Ensuite, utilisez un formateur de date pour afficher les dates:

 let formatter = DateFormatter()
formatter.dateFormat = "dd-MM-yyyy"
let dateText = formatter.string(from: interval.start)

0voto

Jitendra Modi Points 1565

Cette extension vous donne la sortie attendue selon vos besoins

Ici je retourne la date

extension NSDate {
    func startOfMonth() -> NSDate? {
        guard
            let cal: NSCalendar = NSCalendar.currentCalendar(),
            let comp: NSDateComponents = cal.components([.Year, .Month], fromDate: self) else { return nil }
        comp.to12pm()
        let dateformattor = NSDateFormatter()
        dateformattor.dateFormat = "yyyy-MM-dd"
        dateformattor.timeZone = NSTimeZone.localTimeZone()
        let dt2 = dateformattor.stringFromDate(cal.dateFromComponents(comp)!)
        print(dt2)

        dateformattor.dateFormat = "yyyy-MM-dd"
        dateformattor.timeZone = NSTimeZone.init(abbreviation: "UTC")

        return dateformattor.dateFromString(dt2)
    }

    func endOfMonth() -> NSDate? {
        guard
            let cal: NSCalendar = NSCalendar.currentCalendar(),
            let comp: NSDateComponents = NSDateComponents() else { return nil }
        comp.month = 1
        comp.day = -1
        comp.to12pm()
        let dateformattor = NSDateFormatter()
        dateformattor.dateFormat = "yyyy-MM-dd"
        dateformattor.timeZone = NSTimeZone.localTimeZone()
        let dt2 = dateformattor.stringFromDate(cal.dateByAddingComponents(comp, toDate: self.startOfMonth()!, options: [])!)

        dateformattor.dateFormat = "yyyy-MM-dd"
        dateformattor.timeZone = NSTimeZone.init(abbreviation: "UTC")

        return dateformattor.dateFromString(dt2)
    }
}
internal extension NSDateComponents {
    func to12pm() {
        self.hour = 12
        self.minute = 0
        self.second = 0
    }
}

**SORTIE :- **

Date de début du mois :- 2016-12-01 00:00:00 +0000
Date de fin du mois :- 2016-12-31 00:00:00 +0000

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X