【问题标题】:The begining of a day (not today)一天的开始(不是今天)
【发布时间】:2020-03-15 17:09:16
【问题描述】:

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

我尝试过的:

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 日期和时间)

(在很多地方都谈到获取 Day() 的开始。例如:Core Data Predicate Filter By Today's Date

但我要问的是任何一天。)

【问题讨论】:

  • 设置格式化程序使用的时区,formatter.timeZone = TimeZone(identifier: "UTC")
  • @JoakimDanielson。好的,它可以让 UTC 开始。你知道我怎样才能结束一天吗?
  • 也就是说,第二天的开始

标签: swift date


【解决方案1】:
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!)

【讨论】:

  • 强烈建议不要使用 86400 日期数学。考虑到有 23 和 25 小时的日子(夏令时更改)。
【解决方案2】:

使用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)

【讨论】:

  • 为什么要包装组件?
  • 没错,在这种情况下,这不是您想要的 - 我误读了文档。
【解决方案3】:

日期格式化程序会考虑您的时区。 print() 函数没有。所以“let date = ...”的结果是您当地时区的一天的开始。 print() 显示的是 UTC 日期和时间。你比 UTC 早一小时。

【讨论】:

  • 好的,谢谢。那么,如何获取 let 输入的开始和结束日期和时间 UTC?
【解决方案4】:

大多数人不知道的(至少我是这样认为的,因为直到几周前我不得不解决这个问题时才知道)是日历可以有一个时区。因此,如果您有一个日期时间并且您配置了具有特定时区的 .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 日 UTC 上午 7 点时,那是我运行此代码时一天(午夜)的开始。

【讨论】:

  • 那么,你将如何在这里应用它?
  • 我不会。 会在这里应用它。我已经在需要的地方应用了它。 :)
  • @Nrc 因为输入是一个带有日期的字符串,所以这将由格式化程序在你的情况下处理
  • @JoakimDanielson 这个问题要求的是一天的开始,而不是向用户展示一些文字。我认为所需要的是一天中真正诚实的开始。这就是我的回答所产生的结果。
  • 我的评论是针对 OP 的
猜你喜欢
  • 1970-01-01
  • 2019-06-12
  • 2022-12-03
  • 1970-01-01
  • 2019-04-05
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
相关资源
最近更新 更多