计算一天的开始和结束时间。 Swift

问题描述:

我有一个函数来计算一周的开始和结束,它按预期工作。我想实现另一个函数,它可以计算出一天的开始和结束时间。下面我有,但是我得到以下错误代码:计算一天的开始和结束时间。 Swift

Type of expression is ambiguous without more context.

public class Date { 
    let dateFormatter = NSDateFormatter() 
    let date = NSDate() 
    let calendar = NSCalendar.currentCalendar() 

    func calcStartAndEndDateForWeek(durationOccurance: Double) { 
     print("Calculating start and end for week") 
     let componentsWeek = calendar.components([.YearForWeekOfYear, .WeekOfYear], fromDate: date) 
     let startOfWeek = calendar.dateFromComponents(componentsWeek)! 

     print("start of Week = \(dateFormatter.stringFromDate(startOfWeek))") 

     let componentsWeekEnds = NSDateComponents() 
     componentsWeekEnds.weekOfYear = 1 
     let endOfWeek = calendar.dateByAddingComponents(componentsWeekEnds, toDate: startOfWeek, options: [])! 

     print("End of the week = \(dateFormatter.stringFromDate(endOfWeek))") 
    } 


    func calcStartAndEndDateForDay(durationOccurance: Double) { 
     print("Calculating start and end for day") 
     let componentsWeek = calendar.components([.Minutes, .Seconds], fromDate: date) 
     let startOfDay = calendar.dateFromComponents(componentsWeek)! 
     print("start day = \(dateFormatter.stringFromDate(startOfDay))") 
    } 

    init(){ 
     dateFormatter.dateFormat = "dd-MM-yyyy" 
     } 
    } 

我们可以在NSCalendar创建使用的方法比较通用的功能:

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

    // let's ask calendar for the start of the period 
    calendar.rangeOfUnit(period, startDate: &startDate, interval: nil, forDate: date) 

    // end of this period is the start of the next period 
    let endDate = calendar.dateByAddingUnit(period, value: 1, toDate: startDate!, options: []) 

    // you can subtract 1 second if you want to make "Feb 1 00:00:00" into "Jan 31 23:59:59" 
    // let endDate2 = calendar.dateByAddingUnit(.Second, value: -1, toDate: endDate!, options: []) 

    return (startDate!, endDate!) 
} 

古称

print("\(rangeOfPeriod(.WeekOfYear, date: NSDate()))") 
print("\(rangeOfPeriod(.Day, date: NSDate()))") 

把它写进你的代码:

public class Date { 
    let dateFormatter = NSDateFormatter() 
    let date = NSDate() 
    let calendar = NSCalendar.currentCalendar() 

    func rangeOfPeriod(period: NSCalendarUnit) -> (NSDate, NSDate) { 
     var startDate: NSDate? = nil 

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

     let endDate = calendar.dateByAddingUnit(period, value: 1, toDate: startDate!, options: []) 

     return (startDate!, endDate!) 
    } 

    func calcStartAndEndDateForWeek() { 
     let (startOfWeek, endOfWeek) = rangeOfPeriod(.WeekOfYear) 

     print("Start of week = \(dateFormatter.stringFromDate(startOfWeek))") 
     print("End of the week = \(dateFormatter.stringFromDate(endOfWeek))") 
    } 


    func calcStartAndEndDateForDay() { 
     let (startOfDay, endOfDay) = rangeOfPeriod(.Day) 

     print("Start of day = \(dateFormatter.stringFromDate(startOfDay))") 
     print("End of the day = \(dateFormatter.stringFromDate(endOfDay))") 
    } 

    init() { 
     dateFormatter.dateFormat = "dd-MM-yyyy" 
    } 
} 

let myDate = Date() 
myDate.calcStartAndEndDateForWeek() 
myDate.calcStartAndEndDateForDay() 
+0

哦哇感谢这工作的一种享受!接下来我想做的事情是从现在起2周后结束日期。这个功能可以实现吗? –

+0

@JessMurray这取决于。该功能仅为您提供日期和给定时间段的范围。您可以在当天添加2周,并在结果中使用该函数。 – Sulthan

+0

好的,谢谢我想我明白你的意思。如果我想让星期/日数增加2而不是1,那么我需要将持续时间从0改为1? –

我正在实施类似的东西,走到以下路线:

extension Date { 
    static var startOfToday: Date? { 
     let date = Date() 
     guard !date.isStartOfDay else { return date } 
     return date 
      .zero(out: .second)? 
      .zero(out: .minute)? 
      .zero(out: .hour)? 
      .addingTimeInterval(-24 * 60 * 60) 
    } 

    private func zero(out: Calendar.Component) -> Date? { 
     return Calendar.current 
      .date(bySetting: out, value: 0, of: self) 
    } 

    private var isStartOfDay: Bool { 
     let cal = Calendar.current 
     let hours = cal.component(.hour, from: self) 
     let minutes = cal.component(.minute, from: self) 
     let seconds = cal.component(.second, from: self) 
     return hours == 0 && minutes == 0 && seconds == 0 
    } 
} 

一个组成部分设置为零,将增加下一个更大的分量。因此,将小时设置为零会将日期推到第二天的00:00,除非该小时已经为零。因此,为了使它在任何日期都能正常工作,我们必须将秒,分和小时(按此顺序)归零。为了确保我们不会在昨天开始时结束,我们首先检查所有值是否都不为零。

我意识到这是有点hacky,可能不是最好的方式去做这件事,但它似乎至少对我的用例足够好。

只需再增加一天,即可结束一天的工作。