将格式化日期与当前日期进行比较
Comparing a formatted date with current
我正在比较名为 "file.txt" 的文件中的日期,以将其作为列表放入 tableView。我在文件中有一个日期作为当前日期作为最后的测试。它会读取它,但不会将其识别为当前日期。我有一个日期格式化程序,将格式设置为 "MM/dd/yyyy"。从 phone.
中提取当前日期之前和之后的日期,检查工作正常
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
}
}
我文件中我关心的日期格式为“06/07/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)
格式化后应该忽略时间
问题是两个 Date
实例上的 compare
比较到微秒。
您的行 let currentDate = Date()
为您提供 "now" 到微秒的精确时刻。
当您读取文件并从 "MM/dd/yy" 字符串创建 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
}
我正在比较名为 "file.txt" 的文件中的日期,以将其作为列表放入 tableView。我在文件中有一个日期作为当前日期作为最后的测试。它会读取它,但不会将其识别为当前日期。我有一个日期格式化程序,将格式设置为 "MM/dd/yyyy"。从 phone.
中提取当前日期之前和之后的日期,检查工作正常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
}
}
我文件中我关心的日期格式为“06/07/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)
格式化后应该忽略时间
问题是两个 Date
实例上的 compare
比较到微秒。
您的行 let currentDate = Date()
为您提供 "now" 到微秒的精确时刻。
当您读取文件并从 "MM/dd/yy" 字符串创建 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
}