swift - 一周的第一天日期延期

标签 swift date-formatting

我编写了一个 Date 扩展程序,它返回给定日期的一周的第一天(星期一算作第一天)。但是,它总是过早地返回一个星期一。这是我的代码:

extension Date {
    func startOfWeek() -> Date {
        var cal = Calendar.current
        var component = cal.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)
        cal.firstWeekday = 2
        return cal.date(from: component)!
    }
}

所以当我给它以下日期时:

let sampleDate = "2017-06-15 02:50:09 +0000"

let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z"
    if let date = formatter.date(from: sampleDate) {
        print(date.startOfWeek())
    }
}

2017-06-05 07:00:00 +0000 打印出来。

谁能帮我理解为什么我的代码会提前一周返回日期?

最佳答案

日历计算应该添加到Calendar 对象(就像startOfDay(for: ))。如果您坚持将其作为 Date 的扩展,您可以修改以下代码:

extension Calendar {
    func startOfWeek(for date: Date) -> Date {
        if self.component(.weekday, from: date) == 2 {
            return self.startOfDay(for: date)
        } else {
            let components = DateComponents(calendar: self, weekday: 2)
            return self.nextDate(after: date, matching: components, matchingPolicy: .nextTime, direction: .backward)!
        }
    }
}

// Test: 2017-06-15 02:50:09 in your **local time**
let date = DateComponents(calendar: .current, year: 2017, month: 6, day: 15, hour: 2, minute: 50, second: 9).date!

// My timezone is EDT
print(Calendar.current.startOfWeek(for: date)) // 2017-06-12 04:00:00 +0000

此外,您的要求并不十分明确。在欧洲,星期一是一周的第一天。在北美,今天是星期天。答案假设你总是想要星期一。

关于swift - 一周的第一天日期延期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43444621/

相关文章:

objective-c - 在 iOS 中解析 RFC3339 日期字符串的最简单方法是什么?

javascript - 如何使用 date-fns-tz 检测时区缩写?

swift - 如何在用户在 Swift 中键入时调整 UITextField 高度

快速的http请求。不通过

php - date_format() 期望参数 1 为 DateTime,字符串给定

java - Joda DateTimeFormatter 设置时区时抛出异常 : "is malformed at"

php - MySQL 日期时间格式

ios - UITableView 分页 - 底部刷新以在 Swift 中加载新数据

swift - @State var 仅在单击第二个按钮后更改 SwiftUI

swift - 在对象数组中搜索值的更好方法( map )