首页 > 解决方案 > 快速检查日期是否为同一天

问题描述

嗨,在我的应用程序中,我需要通过日期过滤一些文档。我需要查看第一个日期是否与第二个日期在同一天,所以我在 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)})

标签: iosswift

解决方案


Date代表时间的瞬间。两个时刻可以在一个时区的同一天,但不能在另一个时区的同一天。这两个瞬间:

2020-07-29 16:15:50 +0000
2020-07-29 22:00:00 +0000

在 UTC 时区的同一天。但是,例如,在偏移量比 UTC (UTC+5) 提前 5 小时的时区中,这两个时间不会在同一天,因为它们将变为:

2020-07-29 21:15:50
2020-07-30 03:00:00

在那个时区

现在您应该看到时区对于确定两个日期是否在同一天至关重要。

Calendar.current几乎所有操作都使用设备的本地时区。isDate(_:inSameDayAs:)也不例外。在您设备的时区中,这两个日期不在同一天。但是,当您在没有格式化程序的情况下打印它们时,它们总是以 UTC 时区打印。在 UTC 时区,他们同一天,让你认为Calendar.current是错误的。假设您实际上想查看这两个日期是否在您设备的时区的同一天,那么Calendar.current是正确的,您不需要修复任何东西。

要在您的时区打印两个日期,请使用格式化程序:

let formatter = DateFormatter()
formatter.dateStyle = .long
formatter.timeStyle = .long
print(formatter.string(from: yourDate))

如果您真的想查看这两个日期是否在同一个 UTC 日期,那么您可以设置时区Calendar

var calendar = Calendar.current
calendar.timeZone = TimeZone(identifier: "UTC")!
// call calendar.isDate(_:_sameDayAs:) rather than using Calendar.current

推荐阅读