Swift 如何将Parse createdAt时间转换为以前时间?
Swift How to convert Parse createdAt time to time ago?
我已经从 Parse 中检索了 createdAt 列,并且我在 UITableview 上为每一行写了它,但是时间和日期在 tableview 上看起来像这样:
23-12-2015 01:04:56.380
28-08-2015 19:45:09.101
我想将其转换为以前的时间,例如:
今天 1:04 下午 -- 昨天 5:24 上午 -- 3 天前 -- 1 周前 -- 1 个月前
这是我的代码:
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "dd-MM-yyyy HH:mm:ss.SSS"
let date = dateFormatter.stringFromDate((msg.createdAt as NSDate?)!)
Cell.timelbl.text = date
我正在使用 xcode 7 测试版
有什么帮助吗?
您可以使用 NSCalendar isDateInToday 来检查 createdAt 日期是否与今天在同一天,并使用 isDateInYesterday 来检查是否是昨天。只需为这些条件添加条件和 return 自定义字符串,对于所有其他条件,只需让日期组件格式化程序为您处理即可。
extension Formatter {
static let time: DateFormatter = {
let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .gregorian)
formatter.dateFormat = "h:mm a"
return formatter
}()
static let dateComponents: DateComponentsFormatter = {
let formatter = DateComponentsFormatter()
formatter.calendar = Calendar(identifier: .iso8601)
formatter.unitsStyle = .full
formatter.maximumUnitCount = 1
formatter.zeroFormattingBehavior = .default
formatter.allowsFractionalUnits = false
formatter.allowedUnits = [.year, .month, .weekOfMonth, .day, .hour, .minute, .second]
return formatter
}()
}
extension Date {
var time: String { return Formatter.time.string(from: self) }
var year: Int { return Calendar.autoupdatingCurrent.component(.year, from: self) }
var month: Int { return Calendar.autoupdatingCurrent.component(.month, from: self) }
var day: Int { return Calendar.autoupdatingCurrent.component(.day, from: self) }
var elapsedTime: String {
if timeIntervalSinceNow > -60.0 { return "Just Now" }
if isInToday { return "Today at \(time)" }
if isInYesterday { return "Yesterday at \(time)" }
return (Formatter.dateComponents.string(from: Date().timeIntervalSince(self)) ?? "") + " ago"
}
var isInToday: Bool {
return Calendar.autoupdatingCurrent.isDateInToday(self)
}
var isInYesterday: Bool {
return Calendar.autoupdatingCurrent.isDateInYesterday(self)
}
}
测试:
Calendar.autoupdatingCurrent.date(byAdding: .second, value: -59, to: Date())!
.elapsedTime // "Just Now"
Calendar.autoupdatingCurrent.date(byAdding: .minute, value: -1, to: Date())!
.elapsedTime // "Today at 5:03 PM"
Calendar.autoupdatingCurrent.date(byAdding: .hour, value: -1, to: Date())!
.elapsedTime // "Today at 4:04 PM"
Calendar.autoupdatingCurrent.date(byAdding: .day, value: -1, to: Date())!
.elapsedTime // "Yesterday at 5:02 PM"
Calendar.autoupdatingCurrent.date(byAdding: .weekOfYear, value: -1, to: Date())!
.elapsedTime // "1 week ago"
Calendar.autoupdatingCurrent.date(byAdding: .month, value: -2, to: Date())!
.elapsedTime // "2 months ago"
Calendar.autoupdatingCurrent.date(byAdding: .year, value: -1, to: Date())!
.elapsedTime // "1 year ago"
哇,上面的回答对我来说太麻烦了!这就是我所做的!我想您会发现您不再那么头疼了!
首先去 Github 从 Kevin Lawler 下载并导入 NSDate-TimeAgo 到你的项目中。
如果您使用的是 tableView,看起来您就是这样。我就是这样做的。在 "Attributes Inspector" 下的 Interface Builder 中为您的 label 分配一个 tag (确保选择了标签)。
在您的 tableViewController.m 文件中,您需要找到 cellForRowAtIndexPath,因为您正在使用解析,我假设你正在使用 PFQueryTableViewController,所以你将把你的代码放在里面:
- (PFTableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object: (PFObject *)object
{
}
将 NSDate+TimeAgo.h 导入到您的 tableView.h 文件中,然后将您的大括号内的代码和 确保你 return 你的单元格 . (注意:确保你有对 PFObject 的引用,如上面的代码)
///////////////DATE LABEL (WHEN CREATED)//////////////
//Reference to label in interface builder//
UILabel *myDateLabel = (UILabel*) [cell viewWithTag:103];
//reference to PFObject date of creation from Parse//
NSDate *createdAt = object.createdAt;
//create a string from timeAgo and Parse date//
NSString *timeAgo = [createdAt timeAgo];
//assign string to your label//
myDateLabel.text = timeAgo;
我已经从 Parse 中检索了 createdAt 列,并且我在 UITableview 上为每一行写了它,但是时间和日期在 tableview 上看起来像这样:
23-12-2015 01:04:56.380
28-08-2015 19:45:09.101
我想将其转换为以前的时间,例如:
今天 1:04 下午 -- 昨天 5:24 上午 -- 3 天前 -- 1 周前 -- 1 个月前
这是我的代码:
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "dd-MM-yyyy HH:mm:ss.SSS"
let date = dateFormatter.stringFromDate((msg.createdAt as NSDate?)!)
Cell.timelbl.text = date
我正在使用 xcode 7 测试版
有什么帮助吗?
您可以使用 NSCalendar isDateInToday 来检查 createdAt 日期是否与今天在同一天,并使用 isDateInYesterday 来检查是否是昨天。只需为这些条件添加条件和 return 自定义字符串,对于所有其他条件,只需让日期组件格式化程序为您处理即可。
extension Formatter {
static let time: DateFormatter = {
let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .gregorian)
formatter.dateFormat = "h:mm a"
return formatter
}()
static let dateComponents: DateComponentsFormatter = {
let formatter = DateComponentsFormatter()
formatter.calendar = Calendar(identifier: .iso8601)
formatter.unitsStyle = .full
formatter.maximumUnitCount = 1
formatter.zeroFormattingBehavior = .default
formatter.allowsFractionalUnits = false
formatter.allowedUnits = [.year, .month, .weekOfMonth, .day, .hour, .minute, .second]
return formatter
}()
}
extension Date {
var time: String { return Formatter.time.string(from: self) }
var year: Int { return Calendar.autoupdatingCurrent.component(.year, from: self) }
var month: Int { return Calendar.autoupdatingCurrent.component(.month, from: self) }
var day: Int { return Calendar.autoupdatingCurrent.component(.day, from: self) }
var elapsedTime: String {
if timeIntervalSinceNow > -60.0 { return "Just Now" }
if isInToday { return "Today at \(time)" }
if isInYesterday { return "Yesterday at \(time)" }
return (Formatter.dateComponents.string(from: Date().timeIntervalSince(self)) ?? "") + " ago"
}
var isInToday: Bool {
return Calendar.autoupdatingCurrent.isDateInToday(self)
}
var isInYesterday: Bool {
return Calendar.autoupdatingCurrent.isDateInYesterday(self)
}
}
测试:
Calendar.autoupdatingCurrent.date(byAdding: .second, value: -59, to: Date())!
.elapsedTime // "Just Now"
Calendar.autoupdatingCurrent.date(byAdding: .minute, value: -1, to: Date())!
.elapsedTime // "Today at 5:03 PM"
Calendar.autoupdatingCurrent.date(byAdding: .hour, value: -1, to: Date())!
.elapsedTime // "Today at 4:04 PM"
Calendar.autoupdatingCurrent.date(byAdding: .day, value: -1, to: Date())!
.elapsedTime // "Yesterday at 5:02 PM"
Calendar.autoupdatingCurrent.date(byAdding: .weekOfYear, value: -1, to: Date())!
.elapsedTime // "1 week ago"
Calendar.autoupdatingCurrent.date(byAdding: .month, value: -2, to: Date())!
.elapsedTime // "2 months ago"
Calendar.autoupdatingCurrent.date(byAdding: .year, value: -1, to: Date())!
.elapsedTime // "1 year ago"
哇,上面的回答对我来说太麻烦了!这就是我所做的!我想您会发现您不再那么头疼了!
首先去 Github 从 Kevin Lawler 下载并导入 NSDate-TimeAgo 到你的项目中。
如果您使用的是 tableView,看起来您就是这样。我就是这样做的。在 "Attributes Inspector" 下的 Interface Builder 中为您的 label 分配一个 tag (确保选择了标签)。
在您的 tableViewController.m 文件中,您需要找到 cellForRowAtIndexPath,因为您正在使用解析,我假设你正在使用 PFQueryTableViewController,所以你将把你的代码放在里面:
- (PFTableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object: (PFObject *)object
{
}
将 NSDate+TimeAgo.h 导入到您的 tableView.h 文件中,然后将您的大括号内的代码和 确保你 return 你的单元格 . (注意:确保你有对 PFObject 的引用,如上面的代码)
///////////////DATE LABEL (WHEN CREATED)//////////////
//Reference to label in interface builder//
UILabel *myDateLabel = (UILabel*) [cell viewWithTag:103];
//reference to PFObject date of creation from Parse//
NSDate *createdAt = object.createdAt;
//create a string from timeAgo and Parse date//
NSString *timeAgo = [createdAt timeAgo];
//assign string to your label//
myDateLabel.text = timeAgo;