2016-12-19 6 views
3

Я пытаюсь получить начальную и конечную даты текущего месяца в формате dd/MM/yyyy. Я попробовал использовать расширение, как было сказано в этом SO Question. Но похоже, что это не то, что я хочу (формат отличается, и он дает мне последнюю дату последнего месяца и текущий месяц, но одну дату). Кто-нибудь может мне помочь.Как получить дату начала и дату окончания текущего месяца (Swift 3)

Расширение Класс:

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

Мой Struct:

struct Constants{ 

    // keys required for making a Login call (POST Method) 
    struct LoginKeys { 
     ..... 
    } 

    struct RankingKeys { 

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

Ожидаемый результат:

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

Возможна временная зона. –

+0

Даже даты неправильные. дата начала должна быть в первый день декабря, а конец дня должен быть 31, но выходы разные – ASN

+1

Ваш код в порядке. Вы получаете правильные значения по местному времени. Пожалуйста, узнайте, как читать выходные данные журнала 'Date'. Обратите внимание на часовой пояс на выходе. – rmaddy

ответ

7

Вы должны написать этот простой код:

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

Для запуска Дата:

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

Для завершения Дата:

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

Это расширение дает вам ожидается выход согласно вы хотите

Здесь я ре включить дату

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

** OUTPUT: - **

Start Date of Month :- 2016-12-01 00:00:00 +0000 
End Date of Month :- 2016-12-31 00:00:00 +0000 
+0

Вопрос в том, как это сделать в Swift 3. Это ответ Swift 2. – Rob

+0

@Rob Я задаю вопрос для отправки ответа в swift 2.2 и после его разрешения я отправляю его –

+0

С этим кодом так много чего не так. Почему вы устанавливаете компоненты до 12pm перед созданием даты? Формат даты по умолчанию по местному времени, поэтому нет необходимости явно устанавливать его в локальное время. Зачем конвертировать дату в строку, а затем вернуться к дате в UTC? Большая часть размещенного кода не нужна. – rmaddy

2

С Swift 3 & IOS 10 самый простой способ я нашел, чтобы сделать это Calendar «s dateInterval(of:for:):

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

Затем с помощью форматирования даты для печати даты:

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

Это то, что я использую. Довольно просто, но это работает.

extension Calendar { 

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

    if dayOfWeek <= 0 { 
     dayOfWeek += 7 
    } 

    return dayOfWeek 
} 

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

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

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

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

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

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

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

func endOfYear(_ date: Date) -> Date { 
    return self.date(from: DateComponents(year: self.component(.year, from: date), month: 12, day: 31))! 
} 
} 
Смежные вопросы