如何快速开始和结束一周?

Ram*_*Ram 9 time date swift

如何快速开始和结束一周?这是我的代码

extension Date {
    var startOfWeek: Date? {
        let gregorian = Calendar(identifier: .gregorian)
        guard let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) else { return nil }
        return gregorian.date(byAdding: .day, value: 1, to: sunday)
    }

    var endOfWeek: Date? {
        let gregorian = Calendar(identifier: .gregorian)
        guard let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) else { return nil }
        return gregorian.date(byAdding: .day, value: 7, to: sunday)
    }
}
Run Code Online (Sandbox Code Playgroud)

我这样打电话

let startWeek = Date().startOfWeek
let endWeek = Date().endOfWeek
print(startWeek!)
print(endWeek!)
var dateFormat1 = DateFormatter()
dateFormat1.dateFormat = "dd-MM-yy"
let startWeek2 = dateFormat1.string(from: startWeek!)
var dateFormat12 = DateFormatter()
dateFormat12.dateFormat = "dd-MM-yy"
let endWeek2 = dateFormat12.string(from: endWeek!)
print(startWeek2)
print(endWeek2)
Run Code Online (Sandbox Code Playgroud)

和输出

2017-09-24 18:30:00 +0000
2017-09-30 18:30:00 +0000
25-09-17
01-10-17
Run Code Online (Sandbox Code Playgroud)

Rus*_*abh 7

这是Swift 3版本:-

extension Date {
    var startOfWeek: Date? {
        let gregorian = Calendar(identifier: .gregorian)
        guard let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) else { return nil }
        return gregorian.date(byAdding: .day, value: 1, to: sunday)
    }

    var endOfWeek: Date? {
        let gregorian = Calendar(identifier: .gregorian)
        guard let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) else { return nil }
        return gregorian.date(byAdding: .day, value: 7, to: sunday)
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以像这样获取星期开始日期和结束日期:

let startWeek = Date().startOfWeek
let endWeek = Date().endOfWeek

print(startWeek ?? "not found start date")
print(endWeek ?? "not found end date") 
Run Code Online (Sandbox Code Playgroud)


Dáv*_*tor 3

你的代码工作得很好。如果您在 Playground 中运行代码,您可以看到实际的Date对象,而不是字符串表示形式。即使您没有指定 a DateFormatter,在执行 时print(Date()),Swift 也会使用 aDateFormatter来打印Date对象,因此该值将是相对时间,而不是对象提供的绝对时间点Date

在 Playground 中,您可以看到实际startOfWeekis"Sep 25, 2017 at 12:00 AM"endOfWeekis "Oct 1, 2017 at 12:00 AM",它们是本周的正确值。

不要用于print(Date())检查对象的正确性Date,因为正如您所看到的,由于DateFormatter使用的底层,它会产生意想不到的结果。