IT TIP

신속하게 이번 달의 첫 번째와 마지막 날

itqueen 2020. 12. 31. 23:16
반응형

신속하게 이번 달의 첫 번째와 마지막 날


나는 신속하게 그 달의 첫날과 마지막 날을 얻으려고 노력하고 있습니다.

지금까지 다음이 있습니다.

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")

하지만 마지막 날짜를 얻는 방법을 모르겠습니다. 내가 놓친 내장 방법이 있습니까? 분명히 윤년 등을 고려해야합니다.


당신은 단순히 달의 첫날을 얻습니다

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

해당 월의 마지막 날을 얻으려면 한 달을 더하고 하루를 뺍니다.

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

또는 rangeOfUnit월의 시작과 길이를 제공 하는 방법을 사용하십시오 .

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

월 말일의 날짜의 경우 월 길이에서 1 초를 뺀 값을 추가합니다.

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

Swift 3 및 4 드롭 인 확장

이것은 실제로 Swift 3+를 사용 하면 훨씬 쉬워집니다.

  1. 가드없이 할 수 있습니다 (원하면 할 수 있지만 DateComponents이제는 선택 사항이 아니므로 더 이상 필요하지 않습니다).
  2. iOS 8 startOfDayForDate(현재 startOfDay)을 사용하면 시간대에 걸쳐 정말 미친 캘린더 계산을 수행하지 않는 한 수동으로 시간을 오후 12 시로 설정할 필요가 없습니다.

다른 답변 중 일부는을 사용하여 이것을 단축 할 수 있다고 주장 Calendar.current.date(byAdding: .month, value: 0, to: Date())!하지만 이것이 실패하는 경우 실제로 하루를 0으로 만들지 않거나 시간대의 차이를 설명하지 않는다는 것입니다.

여기 있습니다 :

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"

스위프트 3 & 아이폰 OS (10) 나는이 작업을 수행 할 수있는 가장 쉬운 방법으로 인 CalendardateInterval(of:for:):

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

그런 다음 및를 사용 interval.start하여 interval.end필요한 날짜를 가져올 수 있습니다 .


스위프트 3

많은 날짜 예 :

지난 6 개월 , 지난 3 개월 , 어제, 지난 7 일, 지난 30 일, 이전 달, 이번 달 시작 및 종료, 지난 달 시작 및 종료 날짜

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

}

2017 ...

먼저 필요한 달을 찾으십시오.

    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

매월 1 일의 요일을 가져 오려면 :

    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.

월의 일수를 얻으려면 :

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

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

스위프트 4

서수 일만 필요한 경우 :

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

Swift 3를 사용하면 한 달의 첫날과 마지막 날을 검색하기 위해 다음 두 패턴 중 하나를 선택할 수 있습니다.


#1. 사용 Calendar dateComponents(_:from:), date(from:)date(byAdding:to:wrappingComponents:)방법을

이 패턴을 사용하면 먼저 한 달의 첫 번째 날의 날짜를 얻은 다음 달을 추가하고 그 달의 마지막 날의 날짜를 가져 오기 위해 한 달을 제거합니다. 아래의 플레이 그라운드 코드는 설정 방법을 보여줍니다.

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. 사용 Calendar range(of:in:for:), dateComponents(_:from:)date(from:)및 방법을

With this pattern, you get a range of absolute day values in a month and then retrieve the dates of the first day and last day of the month from it. The Playground code below shows how to set it:

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

In swift 3, if you put 0 to day component you can get the last day of the month. There's an example 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
}

ReferenceURL : https://stackoverflow.com/questions/33605816/first-and-last-day-of-the-current-month-in-swift

반응형