Ios 如何在swift 2.3中设置30分钟的时间间隔

Ios 如何在swift 2.3中设置30分钟的时间间隔,ios,swift,time,nsdate,Ios,Swift,Time,Nsdate,开始时间=上午10:00 结束时间=下午1:00 现在我想把时间分成30分钟的间隔,就像 上午10:00上午10:30上午11:00上午11:30。。。。。。。。。。直到下午1点 我试着 我试过这些东西,得到了10:10,10:40…等等 如何进行30分钟的间歇,如10:00、10:30…等 提前感谢您可以使用课堂。此类允许获取一些日期单位。您可以从日期中获取分钟和小时值,并将分钟四舍五入到最接近的“良好”值(有时您还应该更改小时)。 之后,您可以使用小时和分钟的新值获取新日期。 别忘了时区

开始时间=上午10:00 结束时间=下午1:00

现在我想把时间分成30分钟的间隔,就像

上午10:00上午10:30上午11:00上午11:30。。。。。。。。。。直到下午1点

我试着

我试过这些东西,得到了10:10,10:40…等等 如何进行30分钟的间歇,如10:00、10:30…等

提前感谢

您可以使用课堂。此类允许获取一些日期单位。您可以从日期中获取分钟和小时值,并将分钟四舍五入到最接近的“良好”值(有时您还应该更改小时)。
之后,您可以使用小时和分钟的新值获取新日期。 别忘了时区

        NSDate* date = [NSDate date]; //start date
        NSCalendar* calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
        NSDateComponents* components = [calendar components:(NSCalendarUnitMinute | NSCalendarUnitHour) fromDate:date];
        NSInteger minutes = [components minute];
        NSInteger hours = [components hour];

        NSInteger nearestGoodMinutes = [self _nearestGoodMinutesForMinutes:minutes];
        BOOL shouldIncHours = [self _shouldINcHoursForMinutes:minutes];
        if (shouldIncHours)
        {
            hours++;
        }
        NSDate* dateWithGoodHours = [calendar dateBySettingUnit:NSCalendarUnitHour value:hours ofDate:date options:kNilOptions];
        NSDate* goodDate = [calendar dateBySettingUnit:NSCalendarUnitMinute value:nearestGoodMinutes ofDate:dateWithGoodHours options:kNilOptions];
一些解释。不包含任何日期组件。日期组件取决于当前日期。组件的值也取决于当前时区。若您使用标识符创建NSCalendar,您将获得当前日历。时区应与您用于向用户发送日期的时区相同

附加说明

您只能在开始日期执行此操作。

您可以使用日历组件设置分钟00,然后计算时间间隔:

func getIntervals(start: String, end: String)->[Date]{
    let formatter = DateFormatter()
    formatter.dateFormat = "hh:mm a"

    var fromDate = formatter.date(from: start)!
    let calendar = Calendar(identifier: .gregorian)
    let component = calendar.dateComponents([.hour, .minute], from: fromDate)
    fromDate = calendar.date(bySettingHour: component.hour!, minute: 0, second: 0, of: fromDate)!

    let thirtyMin: TimeInterval = 1800
    let endDate = formatter.date(from: end)!
    var intervals = Int(endDate.timeIntervalSince(fromDate)/thirtyMin)
    intervals = intervals < 0 ? 0 : intervals

    var dates = [Date]()

    for x in 0...intervals{
        let date = fromDate.addingTimeInterval(TimeInterval(x)*thirtyMin)
        dates.append(date)
    }
    return dates 
}

let timeIntervals = getIntervals(start: "10:10 am", end: "1:40 pm")
func getInterval(开始:字符串,结束:字符串)->[日期]{
let formatter=DateFormatter()
formatter.dateFormat=“hh:mm a”
var fromDate=formatter.date(from:start)!
let calendar=日历(标识符:。公历)
让component=calendar.dateComponents([.hour,.minute],from:fromDate)
fromDate=calendar.date(通过设置小时:component.hour!,分钟:0,秒:0,of:fromDate)!
设三分钟:时间间隔=1800
让endDate=formatter.date(from:end)!
var间隔=整数(结束日期.时间间隔自(起始日期)/第三分钟)
间隔=间隔<0?0:间隔
变量日期=[日期]()
对于0…间隔中的x{
设date=fromDate.addingTimeInterval(时间间隔(x)*thirtyMin)
日期。附加(日期)
}
返回日期
}
let timeinterval=GetInterval(开始:“上午10:10”,结束:“下午1:40”)

如果用户输入的时间少于30分钟,则使用以下功能,然后从下一个30分钟开始,例如10:20,从10:30开始。如果用户给出的时间大于30,则每个时间都是00,例如10:45,从11:00开始

func makeTimeInterval(startTime:String ,endTime:String) -> String
{
    var arr = startTime.components(separatedBy: " ")[0].components(separatedBy: ":")
    let str = arr[1] as String
    if (Int(str)! > 0 && Int(str)! < 30){
        arr[1] = "00"
    }
    else if(Int(str)! > 30){
        arr[1] = "30"
    }
    let startT:String = "\(arr.joined(separator: ":"))  \(startTime.components(separatedBy: " ")[1])"

    let timeFormat = DateFormatter()
    timeFormat.dateFormat = "hh:mm a"
    var fromTime:NSDate  = (timeFormat.date(from:startT) as NSDate?)!
    let toTime:NSDate  = (timeFormat.date(from:endTime) as NSDate?)!

    var dateByAddingThirtyMinute : NSDate!
    let timeinterval : TimeInterval = toTime.timeIntervalSince(fromTime as Date)
    let numberOfIntervals : Double = timeinterval / 3600;
    var formattedDateString : String!


    for _ in stride(from: 0, to: Int(numberOfIntervals * 2), by: 1)
    {
        dateByAddingThirtyMinute = fromTime.addingTimeInterval(1800)
        fromTime = dateByAddingThirtyMinute
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "hh:mm a"
        formattedDateString = dateFormatter.string(from: dateByAddingThirtyMinute! as Date) as String?
        print("Time after 30 min = \(formattedDateString)")

    }

    return formattedDateString

}
func makeTimeInterval(开始时间:String,结束时间:String)->String
{
var arr=startTime.components(分隔符:)[0]。components(分隔符::)
将str=arr[1]设为字符串
如果(Int(str)!>0&&Int(str)!<30){
arr[1]=“00”
}
如果(整数(str)!>30,则为else{
arr[1]=“30”
}
让startT:String=“\(arr.joined(separator::”)\(startTime.components(separatedBy:)[1])”
让timeFormat=DateFormatter()
timeFormat.dateFormat=“hh:mm a”
var fromTime:NSDate=(timeFormat.date(from:startT)作为NSDate?)!
让toTime:NSDate=(timeFormat.date(from:endTime)作为NSDate?)!
var DATE通过添加第分钟:NSDate!
let timeinterval:timeinterval=toTime.timeIntervalSince(fromTime作为日期)
让NumberOfInterval:Double=时间间隔/3600;
var formattedDateString:String!
对于步幅(从:0到:Int(NumberOfInterval*2),由:1)
{
DateByAddingThirtMinute=fromTime.addingTimeInterval(1800)
fromTime=datebyaddingthirtimute
让dateFormatter=dateFormatter()
dateFormatter.dateFormat=“hh:mm a”
formattedDateString=dateFormatter.string(from:dateByAddingThirtMinute!as Date)作为字符串?
打印(“30分钟后的时间=\(formattedDateString)”)
}
返回格式化的日期字符串
}

参考这篇文章

为什么减号?你能解释一下吗?我不用斯威夫特。我可以添加Objective-C代码,很简单的代码。
func getIntervals(start: String, end: String)->[Date]{
    let formatter = DateFormatter()
    formatter.dateFormat = "hh:mm a"

    var fromDate = formatter.date(from: start)!
    let calendar = Calendar(identifier: .gregorian)
    let component = calendar.dateComponents([.hour, .minute], from: fromDate)
    fromDate = calendar.date(bySettingHour: component.hour!, minute: 0, second: 0, of: fromDate)!

    let thirtyMin: TimeInterval = 1800
    let endDate = formatter.date(from: end)!
    var intervals = Int(endDate.timeIntervalSince(fromDate)/thirtyMin)
    intervals = intervals < 0 ? 0 : intervals

    var dates = [Date]()

    for x in 0...intervals{
        let date = fromDate.addingTimeInterval(TimeInterval(x)*thirtyMin)
        dates.append(date)
    }
    return dates 
}

let timeIntervals = getIntervals(start: "10:10 am", end: "1:40 pm")
func makeTimeInterval(startTime:String ,endTime:String) -> String
{
    var arr = startTime.components(separatedBy: " ")[0].components(separatedBy: ":")
    let str = arr[1] as String
    if (Int(str)! > 0 && Int(str)! < 30){
        arr[1] = "00"
    }
    else if(Int(str)! > 30){
        arr[1] = "30"
    }
    let startT:String = "\(arr.joined(separator: ":"))  \(startTime.components(separatedBy: " ")[1])"

    let timeFormat = DateFormatter()
    timeFormat.dateFormat = "hh:mm a"
    var fromTime:NSDate  = (timeFormat.date(from:startT) as NSDate?)!
    let toTime:NSDate  = (timeFormat.date(from:endTime) as NSDate?)!

    var dateByAddingThirtyMinute : NSDate!
    let timeinterval : TimeInterval = toTime.timeIntervalSince(fromTime as Date)
    let numberOfIntervals : Double = timeinterval / 3600;
    var formattedDateString : String!


    for _ in stride(from: 0, to: Int(numberOfIntervals * 2), by: 1)
    {
        dateByAddingThirtyMinute = fromTime.addingTimeInterval(1800)
        fromTime = dateByAddingThirtyMinute
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "hh:mm a"
        formattedDateString = dateFormatter.string(from: dateByAddingThirtyMinute! as Date) as String?
        print("Time after 30 min = \(formattedDateString)")

    }

    return formattedDateString

}
func format(minute: Int) {
    let h = minute / 60
    let m = minute % 60
    timeLabel.text = "\(h.padZero()):\(m.padZero())"
}      


private extension Int {
    func padZero() -> String {
        return String(format: "%02d", self)
    }
}