Nano Hash - криптовалюты, майнинг, программирование

Сравнение отформатированной даты с текущей

Я сравниваю даты из файла с именем «file.txt», чтобы поместить их в tableView в виде списка. У меня есть дата в файле как текущая дата в качестве теста в конце. Он читает его, но не распознает его как текущую дату. У меня есть средство форматирования даты, устанавливающее формат «ММ/дд/гггг». Проверки корректно работают с датами до и после текущей даты, вытягиваемой из телефона.

import UIKit
import GoogleMaps


class SecondViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var banner: UIImageView!
@IBOutlet weak var tableView: UITableView!

var arrayMarkers = [GMSMarker]()
var dictMarkers = [String:String]()

override func viewDidLoad() {
    super.viewDidLoad()

    banner.image = #imageLiteral(resourceName: "Branding_Iron_Banner")



    tableView.estimatedRowHeight = 155.0
    tableView.rowHeight = UITableViewAutomaticDimension



    let formatter = DateFormatter()
    formatter.dateFormat = "MM/dd/yyyy"
    let currentDate = Date()

    print(formatter.string(from: currentDate))


    guard let path = Bundle.main.path(forResource: "file", ofType: "txt") else {
        print("File wasn't found")
        return
    }


    let filemgr = FileManager()
    if filemgr.fileExists(atPath: path) {
        print("Found the file to read from!")

    }

    guard let streamReader = StreamReader(path: path) else {
        print("Dang! StreamReader couldn't be created!")
        return
    }

    var lineCounter = 0
    var lat = 0.0
    var log = 0.0
    var address = ""
    var date = ""
    var time = ""
    var snip = ""
    var snip2 = ""
    var same = true
    while !streamReader.atEof {

        guard let nextLine = streamReader.nextLine() else {
            print("Oops! Reached the end before printing!")
            break
        }

        if(lineCounter % 5 == 0) {
            lat = (nextLine as NSString).doubleValue
        }
        else if(lineCounter % 5 == 1) {
            log = (nextLine as NSString).doubleValue
        }
        else if(lineCounter % 5 == 2) {
            address = nextLine
        }
        else if(lineCounter % 5 == 3) {
            date = nextLine

            let fileDate = formatter.date(from: date)


            if (currentDate.compare(fileDate!) == .orderedSame) {
                snip2 = date
                print("Same dates compare with current: \(String(describing: fileDate))")
                same = true
            }
            if(fileDate?.compare(currentDate) == .orderedDescending) {
                print("Date comes after current: \(String(describing: fileDate))")
                snip2 = date
                same = true
            }
            if(fileDate?.compare(currentDate) == .orderedAscending) {
                same = false
            }


        }
        else if(lineCounter % 5 == 4){

            if(same == true) {

                time = nextLine
                let position = CLLocationCoordinate2DMake(lat, log)
                let marker = GMSMarker(position: position)
                marker.title = address
                snip = snip2 + "\n"+time
                marker.snippet = snip
                arrayMarkers.append(marker)
                print("\n\(String(describing: marker.title))")
                same = false


            }
        }

        lineCounter += 1
        print("\(lineCounter): \(nextLine)")
    }


}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}


func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {


    return arrayMarkers.count
}

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 2
}

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return 2
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!


    //print("Inside the assigning of table cells")
    let marker = arrayMarkers[indexPath.row]
    //print(marker.snippet!)

    cell.textLabel?.text = marker.title
    cell.detailTextLabel?.text = marker.snippet
    return cell
}

}

Дата, которая меня интересует в моем файле, отформатирована как «07.06.2018», как и формат остальных дат в моем файле.

Обновлено с выходным сравнением:

74: 05/30/2018
75: 8:00 am to 5:00 pm
76: 41.313000
77: -105.576195
78: 1513 Fraternity Row

The current date is: 2018-06-08 15:32:22 +0000

The file date is: Optional(2018-06-08 06:00:00 +0000)

Предполагается, что он игнорирует время после форматирования.

07.06.2018

  • Выведите currentDate и fileDate и обновите свой вопрос выводом двух, которые должны сравниваться как одна и та же дата. 08.06.2018
  • @rmaddy Я добавляю отпечатки, но все равно показывает время. Меня не волнует время, поэтому я сказал, чтобы оно было отформатировано в формате MM/dd/yyyy. 08.06.2018

Ответы:


1

Проблема в том, что compare в двух экземплярах Date сравнивается с точностью до микросекунды.

Ваша строка let currentDate = Date() дает вам точный момент «сейчас» с точностью до микросекунды.

Когда вы читаете файл и создаете Date из строки «ММ/дд/гг», вы получаете Date до микросекунды полуночи по местному времени в указанную дату.

Таким образом, даже если две даты приходятся на один и тот же день, одна из них — текущее время, а другая — полночь по местному времени.

С этим объяснением того, почему это не работает, вот простое решение. Обновите код сравнения следующим образом:

if Calendar.current.isDate(currentDate, inSameDayAs: fileDate!) {
    snip2 = date
    print("Same dates compare with current: \(String(describing: fileDate))")
    same = true
} else if currentDate < fileDate! {
    print("Date comes after current: \(String(describing: fileDate))")
    snip2 = date
    same = true
} else {
    // Not the same or descending so it must be ascending
    same = false
}
08.06.2018
  • @Sulthan Забавно, как мы иногда упускаем из виду очевидное. Спасибо. 08.06.2018
  • Нет проблем, мы годами использовали этот паттерн в Obj-C, так что я думаю, что это происходит из-за этого :) 08.06.2018
  • @rmaddy Спасибо за вашу помощь, это работает для меня. Я также узнал, что на самом деле я не форматировал текущую дату. После форматирования код, который у меня был, работает. 08.06.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..