没有时间的ios Swift日期

时间:2019-04-15 11:47:22

标签: ios swift nsdate nsdatecomponents

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

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 

My Output

它返回上一个日期。您可以查看屏幕截图,它给出了4月14日,而应该是15日。

2 个答案:

答案 0 :(得分:2)

让我猜,您处于格林尼治标准时间+6时区,对吗?

打印Date时,它们始终以UTC出现。

2019-04-14 18:00 UTC 与您所在的时区相同

您的代码没有错。很好。

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

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

答案 1 :(得分:0)

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

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

为了更有意义,假设我正在使用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对于地球上两个不同的位置来说是完全相同的时刻。