我在使用 Swift 獲取一個月中的總天數時遇到了一個小問題。我擴展了 Date 類并創建了這個函式:
func daysInMonth() -> Int {
print(self.day) ##30
print(self.month) ##12
print(self) ## 2021-11-30 23:46:29 0000
print(Calendar.current.range(of: .day, in: .month, for: self)?.count) ##31
return Calendar.current.range(of: .day, in: .month, for: self)?.count ?? 0
}
我已在 Mac 設定的首選項中將日期和時間設定為 11 月 30 日晚上 11:45。我在晚上 11:46 呼叫了上面的函式并獲得了上面的結果(行內,在列印陳述句旁邊)。日期輸出和日期一樣正確。月份輸出錯誤,結果是11月份的31天。如果我在晚上 10:00 之前運行這個完全相同的代碼,我會得到正確的結果,即 30 天。
有誰知道為什么會這樣?
謝謝,
辣椒
uj5u.com熱心網友回復:
這是一個 GMT 偏移量與一個月中的當前日期相結合的問題。
當您創建一個沒有設定日期的日期時,它將被設定為該月的第一天。
因此,如果您的時區偏移例如-4意味著您落后 4 小時,GMT 0并且默認情況下定義的時區Calendar.current等于系統時區。那是什么意思呢?意味著如果您在23 (-4)下個月或下個月的邊界測驗它,您將獲得上個月的偏移量。
您可以在 Playground 中復制和粘貼以下代碼來測驗此行為。
func getDaysInMonth(month: Int, year: Int, offset: Int = 0) -> Int? {
let someDate = DateComponents(year: year, month: month, hour: 3)
var current = Calendar.current
let timezone = TimeZone(secondsFromGMT: 60 * 60 * offset)!
current.timeZone = timezone
guard let someDay = current.date(from: someDate) else { return nil }
print("date: \(someDay)") // this will always
return someDay.daysInCurrentMonth
}
for hour in -12...12 {
print("hour: \(hour)\ndays: \(getDaysInMonth(month: 10, year: 2021, offset: hour) ?? -1)")
print("---\n")
}
extension Date {
var daysInCurrentMonth: Int? {
Calendar.current.range(of: .day, in: .month, for: self)?.count
}
}
請注意,日期將從您當前的系統時區開始更改(請注意,只有月份會更改)。
如何解決這個問題?
在您的情況下,我猜您只想顯示一個月有多少天,所以您可以像這樣將 設定為零:
TimeZone(secondsFromGMT: 0)
在 的實體上進行此更改Calendar.current并檢查它是否適合您。
uj5u.com熱心網友回復:
.day 和 .month 的日期擴展方法似乎有問題。如果沒有看到代碼,很難確定問題是什么。下面是一些回傳當前月份 (Int) 和當前編號的月份日期 (Int) 的代碼
extension Date
{
var month: Int
{
let date = Date()
let calendar = Calendar.current
let components = calendar.dateComponents([.month], from: date)
return components.month
}
var day: Int
{
let date = Date()
let calendar = Calendar.current
let components = calendar.dateComponents([.day], from: self)
return components.day
}
}
還請確保您的 mac/模擬器/設備上的時間/日期設定正確。如果這些是錯誤的 - 如果您處于提前幾個小時的時區,它可能會跳到不同的月份。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/374923.html
上一篇:有沒有另一種方法來獲取日期而不是從用戶的設備中獲取它
下一篇:我如何每次將我的資料庫分成7行
