您好,在我的应用程序中,我需要按日期过滤一些文档。我需要查看第一个日期是否与第二个日期是同一天,因此我搜索了 Apple 文档,看看是否有解决方案可以在不创建方法的情况下执行此操作,我发现这条指令isDate(_:inSameDayAs:),但如果我尝试比较以下日期:
2020-07-29 16:15:50 +0000
2020-07-29 22:00:00 +0000
正如你所看到的,日子是一样的,但我无法理解为什么它会回来false,出了什么问题?
代码 这是我的代码来检查天数之间的差异:
myArray.filter({Calendar.current.isDate($0.log.createdDate, inSameDayAs:date)})
Run Code Online (Sandbox Code Playgroud)
Date代表时间的瞬间。两个时间瞬间在一个时区可以是同一天,但在另一个时区则不能是同一天。这两个时刻:
2020-07-29 16:15:50 +0000
2020-07-29 22:00:00 +0000
Run Code Online (Sandbox Code Playgroud)
位于 UTC 时区的同一天。但是,例如,在偏移量比 UTC (UTC+5) 早 5 小时的时区中,这两个时间将不会在同一天,因为它们将变为:
2020-07-29 21:15:50
2020-07-30 03:00:00
Run Code Online (Sandbox Code Playgroud)
在那个时区
现在您应该看到,时区对于确定两个日期是否在同一天至关重要。
Calendar.current几乎所有操作都使用设备的本地时区。isDate(_:inSameDayAs:)也不例外。在您设备的时区中,这两个日期不在同一天。但是,当您在没有格式化程序的情况下打印它们时,它们始终以 UTC 时区打印。在UTC时区,它们在同一天,让你认为Calendar.current是错误的。假设您确实想查看这两个日期是否在设备时区的同一天,那么这Calendar.current是正确的,并且您不需要修复任何内容。
要打印您所在时区的两个日期,请使用格式化程序:
let formatter = DateFormatter()
formatter.dateStyle = .long
formatter.timeStyle = .long
print(formatter.string(from: yourDate))
Run Code Online (Sandbox Code Playgroud)
如果您确实想查看两个日期是否在同一 UTC 日,那么您可以设置时区Calendar:
var calendar = Calendar.current
calendar.timeZone = TimeZone(identifier: "UTC")!
// call calendar.isDate(_:_sameDayAs:) rather than using Calendar.current
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2595 次 |
| 最近记录: |