一天的开始(不是今天)



我试着了解一天的开始和结束。(可能是任何一天,不一定是今天(

我尝试过的:

let input = "12/10/2018" // it could be any day
let formatter = DateFormatter()
formatter.dateFormat = "MM/dd/yyyy"
let date = formatter.date(from: input)
print(date!) // it prints: 2018-12-09 23:00:00 +0000
  • 为什么在本例中默认打印23
  • 我怎样才能开始新的一天?(UTC日期和时间(
  • 如何结束这一天?(UTC日期和时间(

(很多地方都在谈论如何开始一天((。例如:Core Data Predicate Filter By Today';s日期

但我问的是关于任何一天。(

let input = "12/10/2018"
let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .gregorian)
formatter.timeZone = TimeZone(identifier: "UTC")
formatter.dateFormat = "MM/dd/yyyy"
let startOfDate = formatter.date(from: input)
let dateIntervalDuration = formatter.calendar.dateInterval(of: .day,  for: startOfDate!)?.duration
let endOfDate = startOfDate?.addingTimeInterval(dateIntervalDuration! - 1)
print(startOfDate!)
print(endOfDate!)

使用Calendar执行日期计算:

let input = "12/10/2018" // it could be any day
let formatter = DateFormatter()
formatter.dateFormat = "MM/dd/yyyy"
formatter.timeZone = TimeZone(identifier: "UTC")
let date = formatter.date(from: input)!
print(date) // it prints: 2018-12-09 23:00:00 +0000
let calendar = Calendar.current
let nextDay = calendar.date(byAdding: .day, value: 1, to: date)!
print(nextDay)

日期格式化程序会考虑您的时区。print((函数没有。因此,"let date=…"的结果是一天在您当地时区的开始。print((显示的是UTC中的日期和时间。你比UTC提前了一个小时。

大多数人不知道的是(至少我认为是这样,因为我直到几周前才知道,当时我不得不解决这个问题(日历可以有时区。因此,如果你有一个日期-时间,并且你为.gregorian日历配置了一个特定的时区,例如UTC,现在你只需拨打startOfDay(for:),就会得到正确的答案。

例如:

let tz = TimeZone.current
var greg = Calendar(identifier: .gregorian)
greg.timeZone = tz // or whatever
let d = Date() // or whatever
let start = greg.startOfDay(for: d)
print(start) // 2020-03-15 07:00:00 +0000

这是正确的:当2020年3月15日上午7点UTC时,那是我运行此代码的一天(午夜(的开始。

最新更新