kee*_*n3d 13 cocoa nsdate nsstring
有没有人知道一个库或什么会将NSDate转换成字符串,如下面的例子?
1 hour ago
yesterday
last Thursday
2 days ago
last month
6 months ago
last year
Run Code Online (Sandbox Code Playgroud)
小智 17
NSDateFormatter将在一个实例上使用setDoesRelativeDateFormatting:执行上面提到的大量操作.从那里,您可以使用日期样式和时间样式控制格式,以根据您的需要进行微调.
如果这不能满足您的需求,那么请查看SORelativeDateTransformer,它是一个NSValueTransformer子类,它试图提供与SO相关日期相同的行为.
最后,如果你想自己动手或在这里做更多的研究是关于这个话题的(可能的)原始问题...... 是的,它是问题11.
Mik*_*ard 16
对于后代,这里是一个NSDate类别方法,我使用由David链接的Stack Overflow相关性计算以及其他类似SO问题拼凑的其他提示:
- (NSString *)relativeDateString
{
const int SECOND = 1;
const int MINUTE = 60 * SECOND;
const int HOUR = 60 * MINUTE;
const int DAY = 24 * HOUR;
const int MONTH = 30 * DAY;
NSDate *now = [NSDate date];
NSTimeInterval delta = [self timeIntervalSinceDate:now] * -1.0;
NSCalendar *calendar = [NSCalendar currentCalendar];
NSUInteger units = (NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit);
NSDateComponents *components = [calendar components:units fromDate:self toDate:now options:0];
NSString *relativeString;
if (delta < 0) {
relativeString = @"!n the future!";
} else if (delta < 1 * MINUTE) {
relativeString = (components.second == 1) ? @"One second ago" : [NSString stringWithFormat:@"%d seconds ago",components.second];
} else if (delta < 2 * MINUTE) {
relativeString = @"a minute ago";
} else if (delta < 45 * MINUTE) {
relativeString = [NSString stringWithFormat:@"%d minutes ago",components.minute];
} else if (delta < 90 * MINUTE) {
relativeString = @"an hour ago";
} else if (delta < 24 * HOUR) {
relativeString = [NSString stringWithFormat:@"%d hours ago",components.hour];
} else if (delta < 48 * HOUR) {
relativeString = @"yesterday";
} else if (delta < 30 * DAY) {
relativeString = [NSString stringWithFormat:@"%d days ago",components.day];
} else if (delta < 12 * MONTH) {
relativeString = (components.month <= 1) ? @"one month ago" : [NSString stringWithFormat:@"%d months ago",components.month];
} else {
relativeString = (components.year <= 1) ? @"one year ago" : [NSString stringWithFormat:@"%d years ago",components.year];
}
return relativeString;
}
Run Code Online (Sandbox Code Playgroud)
请勿使用您自己的自定义字符串翻译.编写自己的翻译就像"3秒前"一样,不仅存在需要不断更新的问题,而且还没有本地化为其他语言.
相反,使用Apple内置的NSDateFormatter:
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.doesRelativeDateFormatting = YES;
formatter.locale = [NSLocale currentLocale];
formatter.dateStyle = NSDateFormatterShortStyle;
formatter.timeStyle = NSDateFormatterShortStyle;
NSString *timeString = [formatter stringFromDate:self.date];
Run Code Online (Sandbox Code Playgroud)
这将输出类似"今天,晚上11点10分"或"7/17/14,5:44 AM"的内容.
| 归档时间: |
|
| 查看次数: |
6393 次 |
| 最近记录: |