Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何获取日期IO数组中的所有星期日_Ios_Arrays_Swift_Nsdate_Nscalendar - Fatal编程技术网

Ios 如何获取日期IO数组中的所有星期日

Ios 如何获取日期IO数组中的所有星期日,ios,arrays,swift,nsdate,nscalendar,Ios,Arrays,Swift,Nsdate,Nscalendar,我只想要一个数组,它以NSDate的形式包含一年中所有的星期一,但要使用swift。 我在objective-c中使用以下代码,但不知道如何在swift中使用它 NSDate *pickerDate = [NSDate date]; NSLog(@"pickerDate: %@", pickerDate); NSDateComponents *dateComponents; NSCalendar *calendar = [NSCalendar currentCalen

我只想要一个数组,它以NSDate的形式包含一年中所有的星期一,但要使用swift。 我在objective-c中使用以下代码,但不知道如何在swift中使用它

 NSDate *pickerDate = [NSDate date];
    NSLog(@"pickerDate: %@", pickerDate);

    NSDateComponents *dateComponents;
    NSCalendar *calendar = [NSCalendar currentCalendar];

    dateComponents = [calendar components:NSWeekdayCalendarUnit fromDate:pickerDate];
    NSInteger firstMondayOrdinal = 9 - [dateComponents weekday];
    dateComponents = [[NSDateComponents alloc] init];
    [dateComponents setDay:firstMondayOrdinal];
    NSDate *firstMondayDate = [calendar dateByAddingComponents:dateComponents toDate:pickerDate options:0];

    dateComponents = [[NSDateComponents alloc] init];
    [dateComponents setWeek:1];

    for (int i=0; i<64; i++) {
        [dateComponents setWeek:i];
        NSDate *mondayDate = [calendar dateByAddingComponents:dateComponents toDate:firstMondayDate options:0];
        NSLog(@"week#: %i, mondayDate: %@", i, mondayDate);
    }
NSDate*pickerDate=[NSDate-date];
NSLog(@“pickerDate:%@”,pickerDate);
NSDateComponents*dateComponents;
NSCalendar*日历=[NSCalendar currentCalendar];
dateComponents=[calendar components:NSWeekdayCalendarUnit fromDate:pickerDate];
NSInteger firstMondayOrdinal=9-[dateComponents weekday];
dateComponents=[[NSDateComponents alloc]init];
[dateComponents setDay:firstMondayOrdinal];
NSDate*firstMondayDate=[calendar Date ByAddingComponents:dateComponents toDate:pickerDate选项:0];
dateComponents=[[NSDateComponents alloc]init];
[dateComponents setWeek:1];
对于(int i=0;i给你

var pickerDate = NSDate()
println(pickerDate)

var dateComponents: NSDateComponents? = nil
var calendar = NSCalendar.currentCalendar()

dateComponents = calendar.components(NSCalendarUnit.CalendarUnitWeekday, fromDate: pickerDate)
var firstMondayOrdinal = 9 - dateComponents!.weekday
dateComponents =  NSDateComponents()
dateComponents!.day = firstMondayOrdinal
var firstMondayDate = calendar.dateByAddingComponents(dateComponents!, toDate: pickerDate, options: NSCalendarOptions(0))

dateComponents = NSDateComponents()
dateComponents?.weekdayOrdinal = 1

for (var i=0; i<64; i++){
    dateComponents?.weekdayOrdinal = i
    var mondayDate = calendar.dateByAddingComponents(dateComponents!, toDate: firstMondayDate!, options: NSCalendarOptions.MatchFirst)
     println("\(i)" + "\(mondayDate!)");
}
var pickerDate=NSDate()
println(pickerDate)
变量dateComponents:NSDateComponents?=nil
var calendar=NSCalendar.currentCalendar()
dateComponents=calendar.components(NSCalendarUnit.CalendarUnitWeekday,fromDate:pickerDate)
var firstMondayOrdinal=9-dateComponents!.weekday
dateComponents=NSDateComponents()
dateComponents!.day=firstMondayOrdinal
var firstMondayDate=calendar.dateByAddingComponents(dateComponents!,toDate:pickerDate,options:NSCalendarOptions(0))
dateComponents=NSDateComponents()
dateComponents?.weekdayOrdinal=1

对于(var i=0;i给你。这很简单,但也有一些问题,特别是
NSCalendarOptions
的选项集,
dateByAddingComponents
返回一个可选项,
NSCalendarUnit
的枚举名称更改和
NSDateComponents.week
的弃用,但除此之外,它是很简单。我还没有检查逻辑

//NSDate *pickerDate = [NSDate date];
let pickerDate = NSDate() /* I just used today for playground */

//NSLog(@"pickerDate: %@", pickerDate);
print("pickerDate: \(pickerDate)")

//NSDateComponents *dateComponents;
var dateComponents: NSDateComponents /* var because you keep reallocating it */

//NSCalendar *calendar = [NSCalendar currentCalendar];
let calendar = NSCalendar.currentCalendar()

//dateComponents = [calendar components:NSWeekdayCalendarUnit fromDate:pickerDate];
dateComponents = calendar.components(NSCalendarUnit.Weekday, fromDate: pickerDate)

//NSInteger firstMondayOrdinal = 9 - [dateComponents weekday];
let firstMondayOrdinal = 9 - dateComponents.weekday

//dateComponents = [[NSDateComponents alloc] init];
dateComponents = NSDateComponents()

//[dateComponents setDay:firstMondayOrdinal];
dateComponents.day = firstMondayOrdinal

//NSDate *firstMondayDate = [calendar dateByAddingComponents:dateComponents toDate:pickerDate options:0];
if let firstMondayDate = calendar.dateByAddingComponents(dateComponents, toDate: pickerDate, options: NSCalendarOptions(rawValue: 0)) {
    /* this returns an optional so test for it */

    //dateComponents = [[NSDateComponents alloc] init];
    dateComponents = NSDateComponents()

    //[dateComponents setWeek:1]; /* week deprecated */
    dateComponents.weekOfYear = 1 /* this line is redundant, re-done inside for */

    //for (int i=0; i<64; i++) {
    for i in 0 ..< 64 {
        //[dateComponents setWeek:i];
        dateComponents.weekOfYear = i
        //    NSDate *mondayDate = [calendar dateByAddingComponents:dateComponents toDate:firstMondayDate options:0];
        let mondayDate = calendar.dateByAddingComponents(dateComponents, toDate: firstMondayDate, options: NSCalendarOptions(rawValue: 0))
        /* no need to test for nil if just printing it, but beware */

        //NSLog(@"week#: %i, mondayDate: %@", i, mondayDate);
        print("week#: \(i), mondayDate: \(mondayDate)")
    }
}
//NSDate*pickerDate=[NSDate-date];
让pickerDate=NSDate()/*我今天刚在操场上用过*/
//NSLog(@“pickerDate:%@”,pickerDate);
打印(“pickerDate:\(pickerDate)”)
//NSDateComponents*dateComponents;
var dateComponents:NSDateComponents/*var,因为您一直在重新分配它*/
//NSCalendar*日历=[NSCalendar currentCalendar];
让calendar=NSCalendar.currentCalendar()
//dateComponents=[calendar components:NSWeekdayCalendarUnit fromDate:pickerDate];
dateComponents=calendar.components(NSCalendarUnit.Weekday,fromDate:pickerDate)
//NSInteger firstMondayOrdinal=9-[dateComponents weekday];
让firstMondayOrdinal=9-dateComponents.weekday
//dateComponents=[[NSDateComponents alloc]init];
dateComponents=NSDateComponents()
//[dateComponents setDay:firstMondayOrdinal];
dateComponents.day=firstMondayOrdinal
//NSDate*firstMondayDate=[calendar Date ByAddingComponents:dateComponents toDate:pickerDate选项:0];
如果让firstMondayDate=calendar.dateByAddingComponents(dateComponents,toDate:pickerDate,options:NSCalendarOptions(rawValue:0)){
/*这将为其返回可选的so测试*/
//dateComponents=[[NSDateComponents alloc]init];
dateComponents=NSDateComponents()
//[dateComponents setWeek:1];/*周已弃用*/
dateComponents.weekOfYear=1/*此行是多余的,请在内部为重新执行*/

//对于(int i=0;iXcode 8或更高版本•Swift 3或更高版本

extension Calendar {
    static let gregorian = Calendar(identifier: .gregorian)
}


有一种被低估但非常方便的方法
枚举日期(开始于:匹配:匹配策略:)
日历

// Create the date component matching the weekday (Sunday = 1)
let mondayComponent = DateComponents(weekday: 2)

// Calculate Jan 1st of the current date
let calendar = Calendar.current
let currentDate = Date()
var startOfYear = currentDate
var interval : TimeInterval = 0.0
_ = calendar.dateInterval(of:.year, start: &startOfYear, interval: &interval, for: currentDate)

// Get the current year as integer
let thisYear = calendar.component(.year, from: startOfYear)

// Create an array for the result
var allMondays = [Date]()

// If Jan 1st is a Monday append it to the array
if calendar.component(.weekday, from: startOfYear) == 2 { allMondays.append(startOfYear) }

// Now enumerate all dates matching the weekday component within this year
// If the year reaches thisYear + 1 the block will be exited.    
calendar.enumerateDates(startingAfter: startOfYear, matching: mondayComponent, matchingPolicy: .nextTime) { (date, strict, stop) in
    guard let date = date else { return }
    if calendar.component(.year, from: date) > thisYear {
        stop = true
    } else {
        allMondays.append(date)
    }
}

在这里,我只是定制了上述代码,以获得不同的星期日数

这是您约会的下个星期日的延长时间


这段代码中有哪一部分您在翻译时遇到问题?是的,我只想转换这段代码,这样我就可以在一个数组中获得所有的星期天。然后,请接受我的答案:)(勾选显示在所提供答案左上角的复选标记)
let today = Date()
let nextFollowingSundays = today.nextFollowingSundays(52)
nextFollowingSundays.forEach { sunday in
    print(sunday.description(with: .current), terminator: "\n")
}
// ["Feb 17, 2019 at 12:00 AM", "Feb 24, 2019 at 12:00 AM", "Mar 3, 2019 at 12:00 AM", "Mar 10, 2019 at 12:00 AM", "Mar 17, 2019 at 12:00 AM", "Mar 24, 2019 at 12:00 AM", "Mar 31, 2019 at 12:00 AM", "Apr 7, 2019 at 12:00 AM", "Apr 14, 2019 at 12:00 AM", "Apr 21, 2019 at 12:00 AM", "Apr 28, 2019 at 12:00 AM", "May 5, 2019 at 12:00 AM", "May 12, 2019 at 12:00 AM", "May 19, 2019 at 12:00 AM", "May 26, 2019 at 12:00 AM", "Jun 2, 2019 at 12:00 AM", "Jun 9, 2019 at 12:00 AM", "Jun 16, 2019 at 12:00 AM", "Jun 23, 2019 at 12:00 AM", "Jun 30, 2019 at 12:00 AM", "Jul 7, 2019 at 12:00 AM", "Jul 14, 2019 at 12:00 AM", "Jul 21, 2019 at 12:00 AM", "Jul 28, 2019 at 12:00 AM", "Aug 4, 2019 at 12:00 AM", "Aug 11, 2019 at 12:00 AM", "Aug 18, 2019 at 12:00 AM", "Aug 25, 2019 at 12:00 AM", "Sep 1, 2019 at 12:00 AM", "Sep 8, 2019 at 12:00 AM", "Sep 15, 2019 at 12:00 AM", "Sep 22, 2019 at 12:00 AM", "Sep 29, 2019 at 12:00 AM", "Oct 6, 2019 at 12:00 AM", "Oct 13, 2019 at 12:00 AM", "Oct 20, 2019 at 12:00 AM", "Oct 27, 2019 at 12:00 AM", "Nov 3, 2019 at 1:00 AM", "Nov 10, 2019 at 1:00 AM", "Nov 17, 2019 at 12:00 AM", "Nov 24, 2019 at 12:00 AM", "Dec 1, 2019 at 12:00 AM", "Dec 8, 2019 at 12:00 AM", "Dec 15, 2019 at 12:00 AM", "Dec 22, 2019 at 12:00 AM", "Dec 29, 2019 at 12:00 AM", "Jan 5, 2020 at 12:00 AM", "Jan 12, 2020 at 12:00 AM", "Jan 19, 2020 at 12:00 AM", "Jan 26, 2020 at 12:00 AM", "Feb 2, 2020 at 12:00 AM", "Feb 9, 2020 at 12:00 AM", "Feb 16, 2020 at 12:00 AM"]
// Create the date component matching the weekday (Sunday = 1)
let mondayComponent = DateComponents(weekday: 2)

// Calculate Jan 1st of the current date
let calendar = Calendar.current
let currentDate = Date()
var startOfYear = currentDate
var interval : TimeInterval = 0.0
_ = calendar.dateInterval(of:.year, start: &startOfYear, interval: &interval, for: currentDate)

// Get the current year as integer
let thisYear = calendar.component(.year, from: startOfYear)

// Create an array for the result
var allMondays = [Date]()

// If Jan 1st is a Monday append it to the array
if calendar.component(.weekday, from: startOfYear) == 2 { allMondays.append(startOfYear) }

// Now enumerate all dates matching the weekday component within this year
// If the year reaches thisYear + 1 the block will be exited.    
calendar.enumerateDates(startingAfter: startOfYear, matching: mondayComponent, matchingPolicy: .nextTime) { (date, strict, stop) in
    guard let date = date else { return }
    if calendar.component(.year, from: date) > thisYear {
        stop = true
    } else {
        allMondays.append(date)
    }
}
 extension Calendar {
            static let gregorian = Calendar(identifier: .gregorian)
        }

        extension Date {
            var startOfWeek: Date {
                return Calendar.gregorian.date(from: Calendar.gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self))!
            }
            var nextSunday: Date {
                return Calendar.gregorian.date(byAdding: DateComponents(weekOfYear: 1), to: startOfWeek)!
            }
        }


//Write this logic in your custom function

 @objc func getNext100Sundsays(){
        let firstSunday = date?.nextSunday
        var result = [firstSunday]
        var displayResult = [String]()
        (1...1000).forEach  { _ in
            guard let nextSunday = result.last??.nextSunday else { return }
            let stringDispayDate = displayDateFormatter.string(from: nextSunday)
            result.append(nextSunday)
            displayResult.append(stringDispayDate)
        }
    }