【问题标题】:Date from Calendar.dateComponents returning nil in Swift来自 Calendar.dateComponents 的日期在 Swift 中返回 nil
【发布时间】:2018-09-14 19:01:16
【问题描述】:

我正在尝试创建一个带有日、月和年的 Date 对象,但 Calendar 的函数返回 nil

let calendar = Calendar.current
let date = calendar.dateComponents([.day,.month,.year], from: Date()).date! // <- nil

我如何创建一个只有日、月和年的Date 对象?

【问题讨论】:

  • 你没有。 Date 是一个时间点。您可以获得的最接近的时间是午夜(语言环境时间或 UTC 时间或您选择的其他特定时区)。
  • 如果你不关心时间,苹果建议你将时间设置为中午。夏令时可能会导致某些地点一天没有午夜或两个午夜。至于如何设置日期的时间部分,见this answer

标签: ios swift date calendar


【解决方案1】:

作为对 rmaddy 回答的补充,为什么您的代码返回 nil 的原因 是您尝试将DateComponents 转换为Date 而不指定 Calendar.

如果该转换是使用日历方法完成的

let calendar = Calendar.current
let components = calendar.dateComponents([.day, .month, .year], from: Date())
let date = calendar.date(from: components)

或者如果您将日历添加到日期组​​件中

let calendar = Calendar.current
let date = calendar.dateComponents([.day, .month, .year, .calendar], from: Date()).date

那么你会得到预期的结果。

【讨论】:

  • 在原始代码中添加.calendar 是一个非常好的见解。很好的信息。
  • 您的解释是有道理的,但是在我使用 Swift 5.2 的 REPL 中,您上面的示例仍然为零……有什么想法吗?
  • @barley 可能是这个错误:stackoverflow.com/a/60504976/1187415
  • @MartinR 确实,感谢您的回复和上面的答案!
  • @MartinR 正确,我在 xCode 调试器中工作,变量显示为 nil,但它实际上有一个值
【解决方案2】:

如果你想去掉日期的时间部分(设置为午夜),那么你可以使用Calendar startOfDay

let date = Calendar.current.startOfDay(for: Date())

这将为您提供当前日期的当地时间午夜。

如果您希望当前日期的午夜用于不同的时区,请创建一个新的 Calendar 实例并根据需要设置其 timeZone

【讨论】:

  • 对于时间不敏感的日历计算,最好使用中午
  • @LeoDabus 这应该是对问题的评论,而不是这个答案。 OP 只是询问如何创建没有时间的日期。我们不知道如何使用它。
  • @rmaddy “没有时间”的日期应该使用中午
  • 这就是我所需要的。
  • 不存在没有时间的Date(在Date 对象中)。 Date 对象描述了一个瞬间。您可以将其转换为仅包含日期的字符串,也可以从Date 中提取时间组件,但Date 始终具有关联的时间。
猜你喜欢
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
  • 2018-05-09
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-24
相关资源
最近更新 更多