ios Swift 没有时间的日期

ios Swift Date without Time

我试图只获取表示小时、分钟、秒为零的日期。这就是我正在尝试的

extension Date {

    var onlyDate: Date? {
        get {
            let calender = Calendar.current
            var dateComponents = calender.dateComponents([.year, .month, .day], from: self)
            dateComponents.timeZone = NSTimeZone.system
            return calender.date(from: dateComponents)
        }
    }

}

当我尝试时

date = Date().onlyDate 

它 returns 前一个日期。你可以查看截图,它给我的是 4 月 14 日,而它应该是 15 日

让我猜猜,你是在 GMT+6 时区,是吗?

打印 Date 时,它们总是以 UTC 显示。

2019-04-14 18:00 UTC 2019-04-15 00:00相同在您当地的时区。

你的代码没有错。它工作正常。

要在您的时区查看它,请使用 DateFormatter 并设置 timeZone 属性:

let formatter = DateFormatter()
formatter.timeStyle = .none
formatter.dateStyle = .full
formatter.timeZone = TimeZone.current
print(formatter.string(from: Date().onlyDate))

日期是一个时间点。将其某些组件设为零只能与给定时区、日历结合使用。

你所做的看起来是正确的。但问题是您的调试器如何显示日期。它再次需要使用某个时区、日历,这可能与您计算机(或设备)上的内容相匹配。

为了更有意义,假设我使用的是 UTC,但在 -1 中调试它。然后,如果我创建一个日期 15.4.2019 at 0:00:00 但对其进行调试,我将看到 14.4.2019 at 23:00:00.

所以 Date 本身就不是人类可读的。下面是我相信从 EPOCH 1.1.1970 UTC 开始计算秒数的双精度浮点值。您需要将日历和时区应用于 Date 实例,并使用格式化程序将其转换为您可以阅读的内容(如 14.4.2019 at 23:00:00 中的可读)。如果日历或时区不一样,那么结果将不一样。因为在某些时候 14.4.2019 at 23:00:0015.4.2019 at 0:00:00 是地球上两个不同位置的完全相同的时刻。