簡體   English   中英

生成月初和月底。 斯威夫特 2

[英]Generating the start and end of the month. Swift 2

我有以下代碼:

func rangeOfPeriod(period: NSCalendarUnit, date: NSDate) -> (NSDate, NSDate) {
        let calendar = NSCalendar.currentCalendar()
        var startDate: NSDate? = nil
        var duration: NSTimeInterval = 0

        calendar.rangeOfUnit(period, startDate: &startDate, interval: &duration, forDate: date)

        let endDate = startDate!.dateByAddingTimeInterval(duration - 1)

        return (startDate!, endDate)
}

當我打印以下幾行時:

print("Day test = \(rangeOfPeriod(.Day, date: NSDate()))")
print("Week test = \(rangeOfPeriod(.WeekOfYear, date: NSDate()))")
print("month test = \(rangeOfPeriod(.Month, date: NSDate()))")
print("Year test = \(rangeOfPeriod(.Year, date: NSDate()))")

除了一個月之外,所有這些都按預期工作。

結果我得到“month test = (2016-03-01 00:00:00 +0000, 2016-03-31 22:59:59 +0000)”,結果似乎少了一個小時。 對於所有其他人,我得到“2016-03-26 23:59:59 +0000”。

任何幫助,將不勝感激

可能對rangeOfUnit方法中的interval參數存在混淆。

從文檔

func rangeOfUnit(_ unit: NSCalendarUnit, startDate datep: AutoreleasingUnsafeMutablePointer<NSDate?>, interval tip: UnsafeMutablePointer<NSTimeInterval>, forDate date: NSDate) -> Bool

.....

提示:返回時,包含的持續時間(如NSTimeInterval日歷部的) unit包含日期date


本月(2016 年 3 月)由於夏令時更改,持續時間為

31 * 86400.0 - 3600.0 = 2674800.0 

這意味着缺少一個小時,但沒有指定時間。


為了得到月底,這是更准確的

func endOfThisMonth() -> NSDate
{
  let calendar = NSCalendar.currentCalendar()
  let components = NSDateComponents()
  components.day = 1
  let startOfNextMonth = calendar.nextDateAfterDate(NSDate(), matchingComponents: components, options: .MatchNextTime)!
  return calendar.dateByAddingUnit(.Second, value: -1, toDate: startOfNextMonth, options: [])!
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM