我想從當前日期獲得上個月的第 15 天,所以我嘗試了這個:
extension Date {
var archiveDate: Date? {
let calendar = Calendar.current
guard let monthFixed = calendar.date(byAdding: .month, value: -1, to: self) else {
return nil
}
return calendar.date(bySetting: .day, value: 15, of: monthFixed)
}
}
但是當列印日期 ( print(Date().archiveDate!)) 時,我得到了這個:
2021-12-14 23:00:00 0000
為什么我得到的是 12 月 14 日而不是 11 月 14 日?謝謝您的幫助
uj5u.com熱心網友回復:
來自 Apple 的date(bySetting:value:of:)檔案:
該演算法將嘗試產生一個結果,該結果位于給定組件的下一個更大的組件中。因此,對于“設定為星期四”示例,查找給定日期所在周中的星期四(可以是向前或向后移動,不一定是最近的星期四)。
問題:
給定的函式嘗試匹配您通過的日期(在您的情況下為 15),它可以為我們后退或前進;在這種情況下,它繼續前進。
該演算法將搜索下一個 15 日并回傳該日期。因此,如果您當前的日期是 5 月 2 日,那么它將到 5 月 15 日。但如果是 5 月 16 日,它將到 6 月 15 日。
解決方案:
- 如果給定的日期小于該月的 15 號,您可以回傳 1 個月并將日期設定為 15。
- 如果日期在該月的 15 號之后,則必須回傳 2 個月并將日期設定為 15。
代碼:
[編輯] 正如Itai Ferber所建議的
- 更改了獲取當前日期的方式的實作
- 將日歷硬編碼為公歷
extension Date {
var archiveDate: Date? {
let calendar = Calendar(identifier: .gregorian)
let currentDate = calendar.component(.day, from: self)
var valueToReduce = -1
if currentDate > 15 {
valueToReduce = -2
}
guard let monthFixed = calendar.date(byAdding: .month, value: valueToReduce, to: self) else {
return nil
}
return calendar.date(bySetting: .day, value: 15, of: monthFixed)
}
}
相同代碼的較短版本是:
extension Date {
var archiveDate: Date? {
let calendar = Calendar(identifier: .gregorian)
guard let monthFixed = calendar.date(byAdding: .month, value: calendar.component(.day, from: self) > 15 ? -2 : -1, to: self) else {
return nil
}
return calendar.date(bySetting: .day, value: 15, of: monthFixed)
}
}
uj5u.com熱心網友回復:
您可以嘗試用以下擴展名替換您的擴展名:
extension Date {
var archiveDate: Date? {
let calendar = Calendar.current
guard let monthFixed = calendar.date(byAdding: .month, value: -1, to: self) else {
return nil
}
let startOfMonth = monthFixed.startOfMonth
let newDate = calendar.date(bySetting: .day, value: 15, of: startOfMonth) ?? Date()
return newDate
}
var startOfMonth: Date {
let calendar = Calendar.current
let components = calendar.dateComponents([.year, .month], from: self)
return calendar.date(from: components)!
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/399933.html
