我正在尝试仅获取表示小时,分钟,秒为零的日期。这就是我正在尝试的
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
它返回上一个日期。您可以查看屏幕截图,它给出了4月14日,而应该是15日。
答案 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:00
和15.4.2019 at 0:00:00
对于地球上两个不同的位置来说是完全相同的时刻。