ios Swift Дата без времени - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь получить только дату, которая означает, что часы, минуты, секунды равны нулю.Это то, что я пытаюсь

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

Возвращает предыдущую дату.Вы можете проверить скриншот, что он дает мне 14 апреля, в то время как это должно было быть 15

Ответы [ 2 ]

2 голосов
/ 15 апреля 2019

Дай угадаю, ты в часовом поясе GMT ​​+ 6, не так ли?

Когда напечатано Date s, они всегда отображаются в 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))
0 голосов
/ 15 апреля 2019

Дата - это момент времени. Обнуление некоторых его компонентов может работать только в сочетании с указанным часовым поясом, календарем.

То, что вы сделали, выглядит правильно. Но проблема в том, как ваш отладчик показывает дату. Он снова должен использовать определенный часовой пояс, календарь, который, вероятно, соответствует тому, что у вас есть на вашем компьютере (или устройстве).

Для большей ясности предположим, что я использую 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 были точно в один и тот же момент для 2 разных мест на земле.

...