从NSDate开始显示的时间/日期与iOS中的消息和邮件应用程序一样
我正在构建一个应用程序,要求我显示时间和日期,例如,如果对象是在24小时之前创建的,则为星期天。就像iOS中的消息和邮件应用程序将显示24小时的时间,然后将其更改为显示“周一、周二”等日期。。“。我在寻找是否可以找到任何与此完全相同的框架,或者我是否需要为此编写代码从NSDate开始显示的时间/日期与iOS中的消息和邮件应用程序一样,ios,cocoa-touch,nsdate,Ios,Cocoa Touch,Nsdate,我正在构建一个应用程序,要求我显示时间和日期,例如,如果对象是在24小时之前创建的,则为星期天。就像iOS中的消息和邮件应用程序将显示24小时的时间,然后将其更改为显示“周一、周二”等日期。。“。我在寻找是否可以找到任何与此完全相同的框架,或者我是否需要为此编写代码 NSString *dateString = [NSDateFormatter localizedStringFromDate:[NSDate date]
NSString *dateString = [NSDateFormatter localizedStringFromDate:[NSDate date]
dateStyle:NSDateFormatterShortStyle
timeStyle:NSDateFormatterFullStyle];
NSLog(@"%@",dateString);
尝试此代码,根据您的要求进行修改。使用NSDateFormatter并将其
doesRelativeDateFormatting
属性设置为YES。我也需要此属性,因此我编写了以下NSDate扩展:
extension NSDate {
func formattedRelativeString() -> String {
let dateFormatter = NSDateFormatter()
dateFormatter.doesRelativeDateFormatting = true
if isToday() {
dateFormatter.timeStyle = .ShortStyle
dateFormatter.dateStyle = .NoStyle
} else if isYesterday() {
dateFormatter.timeStyle = .NoStyle
dateFormatter.dateStyle = .MediumStyle
} else if daysAgo() < 6 {
return dateFormatter.weekdaySymbols[weekday()-1]
} else {
dateFormatter.timeStyle = .NoStyle
dateFormatter.dateStyle = .ShortStyle
}
return dateFormatter.stringFromDate(self)
}
}
扩展日期{
func formattedRelativeString()->字符串{
让dateFormatter=NSDateFormatter()
dateFormatter.doesRelativeDateFormatting=true
如果是今天(){
dateFormatter.timeStyle=.ShortStyle
dateFormatter.dateStyle=.NoStyle
}否则如果是昨天{
dateFormatter.timeStyle=.NoStyle
dateFormatter.dateStyle=.MediumStyle
}否则,如果daysAgo()<6{
return dateFormatter.weekdaySymbols[weekday()-1]
}否则{
dateFormatter.timeStyle=.NoStyle
dateFormatter.dateStyle=.ShortStyle
}
return dateFormatter.stringFromDate(self)
}
}
这需要Matthew York出色的工作能力。Swift 3版响应:
extension NSDate {
func formattedRelativeString() -> String
{
let dateFormatter = DateFormatter()
dateFormatter.doesRelativeDateFormatting = true
if isToday() {
dateFormatter.timeStyle = .short
dateFormatter.dateStyle = .none
} else if isYesterday() {
dateFormatter.timeStyle = .none
dateFormatter.dateStyle = .medium
} else if daysAgo() < 6 {
return dateFormatter.weekdaySymbols[weekday()-1]
} else {
dateFormatter.timeStyle = .none
dateFormatter.dateStyle = .short
}
return dateFormatter.string(from: self as Date)
}
}
扩展日期{
func formattedRelativeString()->字符串
{
让dateFormatter=dateFormatter()
dateFormatter.doesRelativeDateFormatting=true
如果是今天(){
dateFormatter.timeStyle=.short
dateFormatter.dateStyle=.none
}否则如果是昨天{
dateFormatter.timeStyle=.none
dateFormatter.dateStyle=.medium
}否则,如果daysAgo()<6{
return dateFormatter.weekdaySymbols[weekday()-1]
}否则{
dateFormatter.timeStyle=.none
dateFormatter.dateStyle=.short
}
return dateFormatter.string(from:self-as-Date)
}
}
为swift 4更新:
extension NSDate {
func formattedRelativeString() -> String
{
let dateFormatter = DateFormatter()
if isInToday || isInYesterday {
/// today and yesterday
/// Today, 3:57 PM
dateFormatter.doesRelativeDateFormatting = true
dateFormatter.timeStyle = .short
dateFormatter.dateStyle = .short
} else if isLessThanAweekAgo {
/// less than a week ago
/// Friday, 4:03 PM
dateFormatter.dateFormat = "EEEE, h:mm a"
} else if isInThisYear {
// more than a week ago
// Fri, 4 Aug, 3:55
dateFormatter.dateFormat = "E, d MMM, h:mm a"
} else {
// more than a year ago
// Aug 10, 2016, 3:56
dateFormatter.dateFormat = "MMM d, yyyy, h:mm a"
}
return dateFormatter.string(from: self)
}
}
您可以在操场上使用以下示例日期进行测试:
let now = Date()
let yesterday = Date(timeInterval: -24*60*60, since: Date())
let weekAgo = Date(timeInterval: -7*24*60*60, since: Date())
let yearAgo = Date(timeInterval: -366*24*60*60, since: Date())
以下是如何使用Swift 4和Swift 5在本地完成这一切:
extension Date {
func formatRelativeString() -> String {
let dateFormatter = DateFormatter()
let calendar = Calendar(identifier: .gregorian)
dateFormatter.doesRelativeDateFormatting = true
if calendar.isDateInToday(self) {
dateFormatter.timeStyle = .short
dateFormatter.dateStyle = .none
} else if calendar.isDateInYesterday(self){
dateFormatter.timeStyle = .none
dateFormatter.dateStyle = .medium
} else if calendar.compare(Date(), to: self, toGranularity: .weekOfYear) == .orderedSame {
let weekday = calendar.dateComponents([.weekday], from: self).weekday ?? 0
return dateFormatter.weekdaySymbols[weekday-1]
} else {
dateFormatter.timeStyle = .none
dateFormatter.dateStyle = .short
}
return dateFormatter.string(from: self)
}
}
目标C形成日期和时间 使用Matthew York优秀的DateTools方法 NSDate扩展:
-(NSString *)formatDateTimeToString{
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setLocale: [[NSLocale alloc] initWithLocaleIdentifier: [[NSLocale currentLocale] localeIdentifier]]];
if ([[NSCalendar currentCalendar] isDateInToday:self])
{
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];
[dateFormatter setDateStyle:NSDateFormatterNoStyle];
}
else if ([[NSCalendar currentCalendar] isDateInYesterday:self])
{
[dateFormatter setDoesRelativeDateFormatting:YES];
[dateFormatter setTimeStyle:NSDateFormatterNoStyle];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
}
else if ([self daysAgo]<6)
{
[dateFormatter setDateFormat:@"EEEE"];
}
else
{
[dateFormatter setTimeStyle:NSDateFormatterNoStyle];
[dateFormatter setDateStyle:NSDateFormatterShortStyle];
}
return [dateFormatter stringFromDate:self];
}
-(NSInteger)daysAgo{
return [self daysEarlierThan:[NSDate date]];
}
-(NSInteger)daysEarlierThan:(NSDate *)date{
return ABS(MIN([self daysFrom:date], 0));
}
-(NSInteger)daysFrom:(NSDate *)date{
return [self daysFrom:date calendar:nil];
}
-(NSInteger)daysFrom:(NSDate *)date calendar:(NSCalendar *)calendar{
NSDate *earliest = [self earlierDate:date];
NSDate *latest = (earliest == self) ? date : self;
NSInteger multiplier = (earliest == self) ? -1 : 1;
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay fromDate:earliest toDate:latest options:0];
return multiplier*components.day;
}
-(NSString*)formatDateTimeToString{
NSDateFormatter*dateFormatter=[[NSDateFormatter alloc]init];
[dateFormatter setLocale:[[NSLocale alloc]initWithLocaleIdentifier:[[NSLocale currentLocale]localeIdentifier]];
如果([[NSCalendar currentCalendar]isDateInToday:self])
{
[日期格式化程序setTimeStyle:NSDateFormatterShortStyle];
[dateFormatter setDateStyle:NSDateFormatterNoStyle];
}
如果([[NSCalendar currentCalendar]isDateinDateinDate:self])
{
[dateFormatter setDoesRelativeDateFormatting:是];
[dateFormatter setTimeStyle:NSDateFormatterNoStyle];
[dateFormatter setDateStyle:nsDateFormatTermeNiumStyle];
}
否则如果([self daysAgo]我不能,我只需要在TableViewCell中显示它,就像iOS中的邮件和消息应用一样,只需使用两种可能的日期格式之一(NSDateFormatter
)取决于日期的最近程度。@rmaddy我认为你的评论更有意义。到目前为止,我只有这段代码给我时间。我如何利用这段时间来知道它是否在24小时之前,如果是的话,我如何获得周一、周二这样的日子?如果你能用一些例子来回答,那就太好了。NSDateFormatter*dateFoMatter=[[NSDateFormatter alloc]init];[dateFormatter setDateFormat:@“HH:mm:ss”];NSString*timeStampStr=[dateFormatter stringFromDate:someObj.timeStamp];你能给我举个例子吗?NSDateFormatter*formatter=[[NSDateFormatter alloc]init];formatter.doesRelativeDateFormatting=是;请参阅