Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.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
Swift 获取从日期开始的月份中的当前周数_Swift - Fatal编程技术网

Swift 获取从日期开始的月份中的当前周数

Swift 获取从日期开始的月份中的当前周数,swift,Swift,我现在面临一个奇怪的问题。我试图找出一个给定的日期实例位于一个月的哪个星期 我的代码如下: var calendar : Calendar { var calendar = Calendar(identifier: .iso8601) calendar.timeZone = .UTC return calendar } func generateDate(year: Int, month: Int, day: Int) -> Date { let da

我现在面临一个奇怪的问题。我试图找出一个给定的
日期
实例位于一个月的哪个星期

我的代码如下:

var calendar : Calendar {
    var calendar = Calendar(identifier: .iso8601)
    calendar.timeZone = .UTC

    return calendar
}


func generateDate(year: Int, month: Int, day: Int) -> Date {
    let dateComponents = DateComponents(year: year, month: month, day: day)
    return calendar.date(from: dateComponents)!
}

print(calendar.component(.weekOfMonth, from: Date.generateDate(year: 2019, month: 12, day: 1))) // prints "0"
print(calendar.component(.weekOfMonth, from: Date.generateDate(year: 2020, month: 1, day: 1))) // prints "1"

generateDate
只需借助
calendar
生成日期。当我打印这两条语句时,结果是
0
1
。我认为这是错误的。我假设两个日期的值相同,因为两个日期都应该在各自月份值的第一周

另一个例子是2。2019年12月,这将是第二周,也是第六周。2020年1月也应该给我第二周的时间


有人知道我的错误在哪里吗

这是因为本月的第一天是周日,如果您想确认,请尝试2020年3月1日


Swift根据自己的标准选择本月的第一周,因为ISO标准不建议任何具体实施,所以Swift团队同意了这一点。你可以在他们的论坛上问他们这背后的原因是什么

这是因为一个月的第一天是星期天,如果你想确认的话,试试2020年3月1日


Swift根据自己的标准选择本月的第一周,因为ISO标准不建议任何具体实施,所以Swift团队同意了这一点。你可以在他们的论坛上问他们这背后的原因是什么

.weekOfMonth
的逻辑似乎是,如果“第一”周少于半周,即3天,则认为是第0周,否则认为是第1周。但是请注意,这取决于所使用的语言环境,对于像加拿大这样的国家来说,星期天是一周的第一天,在运行下面的代码时,从来没有一周是0。因此,当一周的第一天是星期一
时,weekOfMonth
将返回一个介于0和5之间的值,但如果是星期日,则范围是1到6

这可以在操场上运行以下代码

let calendar = Calendar.current
let year = 2019

print("First day of week: \(calendar.weekdaySymbols[calendar.firstWeekday - 1])")

for month in 1...12 {
    print(calendar.monthSymbols[month - 1])
    let first = calendar.date(from: DateComponents(year: year, month: month, day: 1))!
    if let range = calendar.range(of: .day, in: .month, for: first) {
        var currentWeek = -1
        for day in range {
            let date = calendar.date(from: DateComponents(year: year, month: month, day: day))!
            let week = calendar.component(.weekOfMonth, from: date)
            if week > currentWeek {
                currentWeek = week
                let dayOfWeek = calendar.component(.weekday, from: date)
                print("Week# \(week), weekday \(calendar.weekdaySymbols[dayOfWeek - 1])")
            }
        }
    }
}

在我看来,如果你想让1号的任何一天成为weekOfMonth=1的第一天,那么你需要为此编写你自己的代码。
。weekOfMonth的逻辑似乎是,如果“第一”周少于半周,即3天,那么它被认为是第0周,否则是第1周。但是请注意,这取决于所使用的语言环境,对于像加拿大这样的国家来说,星期天是一周的第一天,在运行下面的代码时,从来没有一周是0。因此,当一周的第一天是星期一
时,weekOfMonth
将返回一个介于0和5之间的值,但如果是星期日,则范围是1到6

这可以在操场上运行以下代码

let calendar = Calendar.current
let year = 2019

print("First day of week: \(calendar.weekdaySymbols[calendar.firstWeekday - 1])")

for month in 1...12 {
    print(calendar.monthSymbols[month - 1])
    let first = calendar.date(from: DateComponents(year: year, month: month, day: 1))!
    if let range = calendar.range(of: .day, in: .month, for: first) {
        var currentWeek = -1
        for day in range {
            let date = calendar.date(from: DateComponents(year: year, month: month, day: day))!
            let week = calendar.component(.weekOfMonth, from: date)
            if week > currentWeek {
                currentWeek = week
                let dayOfWeek = calendar.component(.weekday, from: date)
                print("Week# \(week), weekday \(calendar.weekdaySymbols[dayOfWeek - 1])")
            }
        }
    }
}


在我看来,如果你想让1号的任何一天都成为weekOfMonth=1的第一天,那么你需要为此编写自己的代码

为什么2019年12月2日是12月的第二周?@koen我希望我现在没有完全迷失方向,但2019年12月1日是周日,我假设这一周从周一开始,因此,2019年12月2日是12月的第二周。您可以使用
日历将第一个工作日设置为周一。firstWeekday=2
。据我所知,根据ISO 8601,周一是一周的第一天。因此,
calendar.firstWeekDay
似乎已经设置为
2
为什么要使用UTC时区?为什么要使用ISO8601日历?使用当前日历和当前时区,两个日期我都得到1。为什么2019年12月2日是12月的第二周?@koen我希望我现在没有完全迷路,但2019年12月1日是周日,我假设这一周从周一开始,因此,2019年12月2日是12月的第二周。您可以使用
日历将第一个工作日设置为周一。firstWeekday=2
。据我所知,根据ISO 8601,周一是一周的第一天。因此,
calendar.firstWeekDay
似乎已经设置为
2
为什么要使用UTC时区?为什么要使用ISO8601日历?使用当前日历和当前时区,两个日期的值都是1。因此,基本上,只要一个月从星期日开始,一周的月份就会返回0,否则返回1?我同意Jokaim的说法。这取决于你和Abishek和Joakim所在的地方。你帮助我为这个问题制定了自己的解决方案。目前,我坚持使用iso8601日历,并创建了一个用于处理第0周问题的自定义解决方案。基本上,只要一个月从星期日开始,该周的月返回0,否则返回1?我同意Jokaim。这取决于你和Abishek和Joakim所在的地方。你帮助我为这个问题制定了自己的解决方案。现在,我坚持使用iso8601日历,并创建了一个处理第0周问题的自定义解决方案。当我使用
日历时,你是对的。当前的
从来没有第0周,但使用
。iso8601
日历可以有第0周。当我使用
日历时,你是对的。当前的
从来没有第0周,但是使用
.iso8601
日历,可以有一周0