금월 초하루와 말일.
저는 이번 달의 첫 날과 마지막 날을 빨리 잡으려고 노력하고 있습니다.
지금까지 저는 다음을 알고 있습니다.
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")
하지만 마지막 날짜를 어떻게 잡아야 할지 모르겠어요.누락된 기본 제공 방법이 있습니까?분명히 윤년 등을 고려해야 합니다.
Swift 3 및 4 드롭인 확장 기능
Swift 3+를 사용하면 훨씬 쉬워집니다.
- 가드 없이도 할 수 있습니다(원하신다면 할 수 있지만, 왜냐하면.
DateComponents
이제는 선택사항이 아닌 유형입니다. 더 이상 필요하지 않습니다.) - 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"
당신은 간단하게 한 달의 첫 날을 얻습니다.
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)
Swift5용으로 업데이트됨:
extension Date {
var startOfDay: Date {
return Calendar.current.startOfDay(for: self)
}
var startOfMonth: Date {
let calendar = Calendar(identifier: .gregorian)
let components = calendar.dateComponents([.year, .month], from: self)
return calendar.date(from: components)!
}
var endOfDay: Date {
var components = DateComponents()
components.day = 1
components.second = -1
return Calendar.current.date(byAdding: components, to: startOfDay)!
}
var endOfMonth: Date {
var components = DateComponents()
components.month = 1
components.second = -1
return Calendar(identifier: .gregorian).date(byAdding: components, to: startOfMonth)!
}
func isMonday() -> Bool {
let calendar = Calendar(identifier: .gregorian)
let components = calendar.dateComponents([.weekday], from: self)
return components.weekday == 2
}
}
Swift 3 & iOS 10을 사용하여 이를 수행하는 가장 쉬운 방법은 다음과 같습니다.
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)!
}
}
스위프트 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
가장 쉬운 해결책은 다음과 같습니다.
extension Date {
func startOfMonth() -> Date {
let interval = Calendar.current.dateInterval(of: .month, for: self)
return (interval?.start.toLocalTime())! // Without toLocalTime it give last months last date
}
func endOfMonth() -> Date {
let interval = Calendar.current.dateInterval(of: .month, for: self)
return interval!.end
}
// Convert UTC (or GMT) to local time
func toLocalTime() -> Date {
let timezone = TimeZone.current
let seconds = TimeInterval(timezone.secondsFromGMT(for: self))
return Date(timeInterval: seconds, since: self)
}}
날짜 인스턴스와 함께 다음을 호출합니다.
print(Date().startOfMonth())
print(Date().endOfMonth())
이것이 제가 찾은 가장 간단한 방법입니다(Swift 5+).
extension Date {
func getStart(of component: Calendar.Component, calendar: Calendar = Calendar.current) -> Date? {
return calendar.dateInterval(of: component, for: self)?.start
}
func getEnd(of component: Calendar.Component, calendar: Calendar = Calendar.current) -> Date? {
return calendar.dateInterval(of: component, for: self)?.end
}
}
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
해당 월의 첫 번째 요일을 가져오는 방법
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)")
Swift 3을 사용하면 다음 두 가지 패턴 중 하나를 선택하여 한 달의 처음과 마지막 날을 검색할 수 있습니다.
#1. 사용하기Calendar
dateComponents(_:from:)
및date(from:)
방법
이 패턴을 사용하면 먼저 월의 첫 번째 날 날짜를 얻은 다음 월을 추가하고 해당 월에서 하루를 제거하여 월의 마지막 날 날짜를 얻습니다.아래의 Playground 코드는 설정 방법을 보여줍니다.
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:)
방법
이 패턴을 사용하면 한 달 안에 절대일 값 범위를 얻은 다음 해당 월의 첫 번째 날과 마지막 날의 날짜를 검색할 수 있습니다.아래의 Playground 코드는 설정 방법을 보여줍니다.
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
swift 3에서 오늘 구성 요소를 0개 넣으면 해당 달의 마지막 날을 얻을 수 있습니다.예제 코드가 있습니다.
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
}
여기에서 다음 확장을 사용할 수 있습니다.
let today = Date()
let startOfMonth = today.beginning(of: .month)
let endOfMonth = today.end(of: .month)
TimeZone 영향력이 없는 Swift 5
public extension Date {
var startDateOfMonth: Date {
let components = Calendar.gregorian.dateComponents([.year, .month], from: self)
guard let date = Calendar.gregorian.date(from: components) else {
fatalError("Unable to get start date from date")
}
return date
}
var endDateOfMonth: Date {
guard let date = Calendar.gregorian.date(
byAdding: DateComponents(month: 1, day: -1),
to: self.startDateOfMonth
) else {
fatalError("Unable to get end date from date")
}
return date
}
var isStartDateOfMonth: Bool {
Calendar.current.isDate(self, inSameDayAs: startDateOfMonth)
}
var isEndDateOfMonth: Bool {
Calendar.current.isDate(self, inSameDayAs: endDateOfMonth)
}
}
언급URL : https://stackoverflow.com/questions/33605816/first-and-last-day-of-the-current-month-in-swift
'programing' 카테고리의 다른 글
HTML에서 공백 무시 (0) | 2023.08.20 |
---|---|
jQuery $("#radioButton").변경(...)이(가) 선택 취소 중에 실행되지 않음 (0) | 2023.08.20 |
ASP에서 HTTPS를 사용하는 방법.넷 애플리케이션 (0) | 2023.08.15 |
안드로이드 스튜디오에서 앱의 런처 로고를 어떻게 변경합니까? (0) | 2023.08.15 |
다른 파일에서 사용할 외부 파이썬 코드를 포함하는 방법은 무엇입니까? (0) | 2023.08.15 |