快速检查日期是否是同一天

时间:2020-08-10 07:46:58

标签: ios swift

您好,在我的应用程序中,我需要按日期过滤一些文档。我需要查看第一个日期是否与第二个日期的同一天,因此我搜索了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)})

1 个答案:

答案 0 :(得分:3)

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