【问题标题】:Generating the start and end of the month. Swift 2生成月份的开始和结束。斯威夫特 2
【发布时间】:2016-03-23 14:07:59
【问题描述】:

我有以下代码:

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

除了月份之外,它们都按预期工作。

结果我得到“月测试 = (2016-03-01 00:00:00 +0000, 2016-03-31 22:59:59 +0000)”,它似乎缺少一个小时。对于所有其他人,我得到'2016-03-26 23:59:59 +0000'。

任何帮助将不胜感激

【问题讨论】:

标签: swift nsdate nscalendar nstimeinterval


【解决方案1】:

可能对rangeOfUnit 方法中的interval 参数存在混淆。

来自文档

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

.....

tip :返回时,包含日历单元unit 的持续时间(如NSTimeInterval) 包含日期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: [])!
}

【讨论】:

    猜你喜欢
    • 2017-03-24
    • 1970-01-01
    • 2017-02-15
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 2016-09-26
    相关资源
    最近更新 更多