時間字符串與date轉化, 利用NSDateFormatter
常用格式例如: @"2016-01-29 22:20:02" 轉date
- (void)str2Date
{
NSString *strDate = @"2016-01-29 22:20:02";
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSDate *date = [fmt dateFromString:strDate];
NSLog(@"%@", date);
}
- log結果:2016-01-29 14:20:02 +0000
date轉字符串:
- (void)date2Str
{
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.dateFormat = @"yyyy/MM/dd : HH:mm:ss";
NSString *strDate = [fmt stringFromDate:[NSDate date]];
NSLog(@"%@", strDate);
}
- log結果:2016/01/30 : 22:17:19
- 常用日期格式符:
- yyyy:year
- MM:month
- dd:day
- HH:24小時制, hh12小時制
- mm:minute
- ss:second
- 字符串轉date, 只要將對應的數(shù)值替代為對應的格式符就行了
- date轉字符串:系統(tǒng)只會將對應格式符的數(shù)值替代格式符的位置, 你自定義用來連接日期的的其他符號沒有任何影響,所以你也可以這樣寫: @"MM/dd yyyy : HH:mm:ss”, 或者只寫其中某一部分都行:@“HH:mm”
你可能還會遇到這樣的格式:@"Tue Sep 28 17:46:55 +0800 2011"
- (void)str2Date_locale
{
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.locale = [NSLocale localeWithLocaleIdentifier:@"en_US"];
fmt.dateFormat = @"EEE MMM dd HH:mm:ss Z yyyy";
NSDate *date = [fmt dateFromString:@"Tue Sep 28 17:46:55 +0800 2011"]; // 國際通用時間的格式
NSLog(@"%@", date);
}
- log:2011-09-28 09:46:55 +0000
- 這幾個格式你還需要知道:
- MMM:表示其中的Sep, 后面MM表示month, 跟前面一樣, 前面一個M表示這種格式的月份
- 拓展:M:9, MM:09, MMM:Sep, MMMM:September
- EEE:代表week, Tuesday
- 拓展:EEE:Tue, EEEE:Tuesday, EEEEE:T
- Z, 代表時區(qū), + 是東時區(qū), - 是西時區(qū)
- MMM:表示其中的Sep, 后面MM表示month, 跟前面一樣, 前面一個M表示這種格式的月份
- 這種國際比較通用的時間格式, 一般最好統(tǒng)一時間格式的locale
將本地化修改為en_US
時間戳, @"1231234343433”, 這種時間格式的含義是距離1970年, 經(jīng)過了多長時間
- (void)string2DataUseShijianchuo
{
NSString *strDate = @"1231234343433";// 時間戳, 單位毫秒, 表示從1970年開始經(jīng)過了多少時間
NSDate *date = [NSDate dateWithTimeIntervalSince1970:strDate.doubleValue / 1000];
NSLog(@"%@", date);
}
- log:2009-01-06 09:32:23 +0000
NSDate比較
- 對時間比較以及求時間差等, 一般將時間轉為NSDate, 在處理時更方便
粗略的比較用compare這個方法
- 巧記
- Descending, 從左到右降序, 消極的
- Ascending, 從左到右升序, 積極的
- (void)compare
{
NSString *createdAtString = @"2016-01-29 10:18:01";
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSDate *createDate = [fmt dateFromString:createdAtString];
NSDate *curDate = [NSDate date];
NSComparisonResult res = [createDate compare:curDate];
if (res == NSOrderedDescending) {
NSLog(@"降序");// 左邊大于右邊
}else if (res == NSOrderedAscending){
NSLog(@"升序");// 左邊小于右邊
}else if (res == NSOrderedSame){
NSLog(@"相等");// 相等
}
NSLog(@"%zd, %@, %@", res, createDate, curDate);
}
- log: 升序
date的比較和服務器返回字符串時間自定義格式化顯示
計算兩個date的時間差
- (void)delta
{
// 日期格式化對象
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
// 設置日期格式
fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
// 2個日期對象
NSDate *date1 = [fmt dateFromString:@"2016-01-29 10:18:01"];
NSDate *date2 = [fmt dateFromString:@"2016-02-02 11:22:45"];
NSInteger timeInterval = [date2 timeIntervalSinceDate:date1];
// 將時間差轉化為對應的時分秒...
// 1分鐘 = 60秒
NSInteger secondsPerMinute = 60;
// 1小時 = 60 * 60秒 = 3600秒
NSInteger secondsPerHour = 60 * secondsPerMinute;
// 1天 = 24 * 60 * 60秒
NSInteger secondsPerDay = 24 * secondsPerHour;
NSInteger day = timeInterval / secondsPerDay;
NSInteger hour = (timeInterval % secondsPerDay) / secondsPerHour;
NSInteger minute = ((timeInterval % secondsPerDay) % secondsPerHour) / secondsPerMinute;
NSInteger second = timeInterval % secondsPerMinute;
NSLog(@"%zd天%zd小時%zd分%zd秒", day, hour, minute, second);
}
- log: 4天1小時4分44秒
- 可以將上面的方法抽成NSdate的分類,因為返回值有很多, 所以我們考略用集合類型作為方法返回值, 不過這樣也比較麻煩
- 還可以考慮用結構體作為返回值, 比集合類型號, 但結構體只能是基本數(shù)據(jù)類型, 通用性不高, 最后我們考慮用模型來保存返回值, 給模型定義多個屬性, 這樣通用性更高, 也更靈活
將上面的功能抽分類:
- 開發(fā)中我們將常需要對日期進行比較, 所以我們再提供幾個方法:
.h文件
@interface JJTimeInterval : NSObject
/** 天 */
@property (nonatomic, assign) NSInteger day;
/** 小時 */
@property (nonatomic, assign) NSInteger hour;
/** 分鐘 */
@property (nonatomic, assign) NSInteger minute;
/** 秒 */
@property (nonatomic, assign) NSInteger second;
@end
@interface NSDate (JJTimeInterval)
- (JJTimeInterval *)jj_timeIntervalSince:(NSDate *)date;
/**
* 是否為今天
*/
- (BOOL)jj_isInToday;
/**
* 是否為昨天
*/
- (BOOL)jj_isInYesterday;
/**
* 是否為明天
*/
- (BOOL)jj_isInTomorrow;
/**
* 是否為今年
*/
- (BOOL)jj_isInThisYear;
@end
- 實現(xiàn)jj_timeIntervalSince:方法
- 注意:
-
NSCalendar currentCalendar
是以前的方法, 有時會有一些bug, 最好用下面這個方法, 但這個方法是iOS_8才有的, 所以要適配
-
+ (instancetype)jj_calendar
{
if ([self respondsToSelector:@selector(calendarWithIdentifier:)]) {
return [self calendarWithIdentifier:NSCalendarIdentifierGregorian];
}
return [self currentCalendar];
}
- 不能僅僅判斷cmp.year == 0 && cmp.month == 0 && cmp.day == 0, 該方法會結合時分秒,如果時間差在24小時內, 就算差一天, 而我們的需求是, 只要日期day的數(shù)字差一天就算差一天, 相同則為同一天, 所以要剔除時分秒的影響
.m文件
@implementation JJTimeInterval
@end
@implementation NSDate (JJTimeInterval)
- (JJTimeInterval *)jj_timeIntervalSince:(NSDate *)date
{
JJTimeInterval *timeInterval = [[JJTimeInterval alloc] init];
NSInteger interval = [self timeIntervalSinceDate:date];
// 將時間差轉化為對應的時分秒...
// 1分鐘 = 60秒
NSInteger secondsPerMinute = 60;
// 1小時 = 60 * 60秒 = 3600秒
NSInteger secondsPerHour = 60 * secondsPerMinute;
// 1天 = 24 * 60 * 60秒
NSInteger secondsPerDay = 24 * secondsPerHour;
timeInterval.day = interval / secondsPerDay;
timeInterval.hour = (interval % secondsPerDay) / secondsPerHour;
timeInterval.minute = ((interval % secondsPerDay) % secondsPerHour) / secondsPerMinute;
timeInterval.second = interval % secondsPerMinute;
return timeInterval;
}
- (BOOL)jj_isInToday
{
// 不呢僅僅判斷cmp.year == 0 && cmp.month == 0 && cmp.day == 0, 該方法會結合時分秒,如果時間差在24小時內, 就算差一天, 而我們的需求是, 只要日期day差一天就算差一天, 相同則為同一天, 所以要提出時分秒的影響
NSCalendar *calendar = [NSCalendar jj_calendar];
NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
NSDateComponents *selfCmp = [calendar components:unit fromDate:self];
NSDateComponents *nowCmp = [calendar components:unit fromDate:[NSDate date]];
if ([selfCmp isEqual:nowCmp]) {
return YES;
}
return NO;
}
- (BOOL)jj_isInTomorrow
{
NSCalendar *calendar = [NSCalendar jj_calendar];
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.dateFormat = @"yyyyMMdd";
NSString *selfStr = [fmt stringFromDate:self];
NSString *nowStr = [fmt stringFromDate:[NSDate date]];
// 獲得只有年月日的格式化date
NSDate *selfDate = [fmt dateFromString:selfStr];
NSDate *nowDate = [fmt dateFromString:nowStr];
NSDateComponents *cmp = [calendar components:NSCalendarUnitDay fromDate:selfDate toDate:nowDate options:0];
if (cmp.day == 1) {
return YES;
}
return NO;
}
- (BOOL)jj_isInYesterday
{
// 注意deltaDay == -1, deltaMonth == 0,deltaYear == 0, | 注意deltaDay == 1, deltaMonth == 0,deltaYear == 0, 并不能表示,一定是昨天或明天
NSCalendar *calendar = [NSCalendar jj_calendar];
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.dateFormat = @"yyyyMMdd";
NSString *selfStr = [fmt stringFromDate:self];
NSString *nowStr = [fmt stringFromDate:[NSDate date]];
// 獲得只有年月日的格式化date
NSDate *selfDate = [fmt dateFromString:selfStr];
NSDate *nowDate = [fmt dateFromString:nowStr];
NSDateComponents *cmp = [calendar components:NSCalendarUnitDay fromDate:selfDate toDate:nowDate options:0];
if (cmp.day == -1) {
return YES;
}
return NO;
}
- (BOOL)jj_isInThisYear
{
NSCalendar *calendar = [NSCalendar jj_calendar];
NSCalendarUnit unit = NSCalendarUnitYear;
NSDateComponents *selfCmp = [calendar components:unit fromDate:self];
NSDateComponents *nowCmp = [calendar components:unit fromDate:[NSDate date]];
if ([selfCmp isEqual:nowCmp]) {
return YES;
}
return NO;
}
@end
應用
- created____at是模型時間, 用我們的分類, 得到我們想要的時間
- 判斷邏輯:優(yōu)先判斷今天昨天,然后再是今年去年
- (NSString *)formatCreated_at:(JJTopic *)topic
{
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSDate *create_atDate = [fmt dateFromString:topic.created_at];
JJTimeInterval *timeInterval = [create_atDate jj_timeIntervalSince];
if ([create_atDate jj_isInToday]) {
if (timeInterval.hour !=0) {
return [NSString stringWithFormat:@"%ld小時前", timeInterval.hour];
}else if (timeInterval.minute != 0){
return [NSString stringWithFormat:@"%ld分鐘前", timeInterval.minute];
}else{
return [NSString stringWithFormat:@"剛剛"];
}
}else if([create_atDate jj_isInYesterday]){
fmt.dateFormat =@"HH:mm:ss";
return [NSString stringWithFormat:@"昨天:%@", [fmt stringFromDate:create_atDate]];
}else if ([create_atDate jj_isInThisYear]){
fmt.dateFormat = @"MM-dd HH:mm:ss";
return [NSString stringWithFormat:@"%@", [fmt stringFromDate:create_atDate]];
}else{
return topic.created_at;
}
return nil;
}
屏幕快照 2016-01-31 下午10.29.51.png