作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我编写了一个 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/
这个问题在这里已经有了答案: What are the differences between Deferred, Promise and Future in JavaScript? (5 个答案)
我在洗澡的时候想到了一些事情。 延迟/ promise 模式是减少callback hell ,通过允许开发人员链式调用函数,如前所述 here : Parse.User.logIn("user",
我是一名优秀的程序员,十分优秀!