【问题标题】:First day of week Date Extension一周的第一天 日期延长
【发布时间】:2017-04-17 03:13:31
【问题描述】:

我编写了一个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 被打印出来。

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

【问题讨论】:

    标签: swift date-formatting


    【解决方案1】:

    日历计算应添加到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
    

    另外,您的要求并不完全清楚。在欧洲,星期一是一周的第一天。在北美,这是星期天。答案假设你总是想要星期一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-25
      • 2015-10-07
      • 1970-01-01
      • 2013-11-22
      • 2017-02-24
      • 1970-01-01
      • 2013-06-05
      相关资源
      最近更新 更多