Как сравнить две даты и сделать таймер обратного отсчета между ними в Swift 4 - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь сделать обратный отсчет NSTimer между будущей датой и текущей датой, и это обновление появляется в поле зрения.

например, если текущая дата 25/4/2019 и будущая дата будет 30/4/2019 это будет таймер обратного отсчета 5d: 2h: 50m: 20s

я использовал какой-то код

  @IBOutlet weak var btnTimeLabel : UIButton!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let when = DispatchTime.now() + 0.1 // change 2 to desired number of seconds
        DispatchQueue.main.asyncAfter(deadline: when) {
            Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(ViewController.countDownDate), userInfo: nil, repeats: true)
        }

    }


    @objc func countDownDate() {

        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "dd-mm-yyyy" //Your date format
        dateFormatter.timeZone = TimeZone(abbreviation: "GMT+0:00") //Current time zone
        let futuredate = dateFormatter.date(from: "29-4-2019") //according to date format your date string
        var calendar = Calendar.current
        let diffDateComponents = calendar.dateComponents([.day, .hour, .minute, .second], from: Date(), to: futuredate!)
        print (Date())
        print(diffDateComponents)
        let countdown = "Days \(String(describing:diffDateComponents.day!)),  Hours: \(String(describing: diffDateComponents.hour!)), Minutes: \(String(describing: diffDateComponents.minute!)), Seconds: \(String(describing: diffDateComponents.second!))"
        print("countdown",countdown)
        var dayText = String(describing: diffDateComponents.day!) + "d "
        var hourText = String(describing: diffDateComponents.hour!) + "h "
        btnTimeLabel.setTitle(dayText + hourText + String(describing: diffDateComponents.minute!) + "m " + String(describing: diffDateComponents.second!) + "s", for: .normal)
        //print(dayText + hourText + String(describing: diffDateComponents.minute!) + "m " + String(describing: diffDateComponents.second!) + "s")
    }        // Dispose of any resources that can be recreated.
    }

это дает мне неправильный таймер

1 Ответ

1 голос
/ 25 апреля 2019

Вот моя версия использования DateComponentsFormatter , чтобы получить разницу во времени

Настройка DateComponentsFormatter

let dcf = DateComponentsFormatter()
dcf.allowedUnits = [.day, .hour, .minute, .second]
dcf.unitsStyle = .full

Настройка обычного форматера даты

let df = ISO8601DateFormatter()
df.formatOptions = [.withFullDate, .withDashSeparatorInDate]

Выполнить форматирование

if let future = df.date(from: "2019-04-29"), let diff = dcf.string(from: Date(), to: future) {
    print(diff)
}

Вывод

3 дня, 6 часов, 9 минут, 9 секунд

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...