iOS開發之日期格式轉換及時間間隔判斷
阿新 • • 發佈:2018-12-16
0. 說明
-
支援時間戳與日期、日期和字串的相互轉換;
-
支援日期轉星期;
-
支援以下時間段判斷:一分鐘內、一小時內、昨天、今天、明天、今年;
1. 具體程式碼
// // NSDateExt.h // SwiftExercises // // Created by ADreamClusive on 20/11/2017. // Copyright © 2017 ADreamClusive. All rights reserved. // #import <Foundation/Foundation.h> @interface NSDate (ZL) /** 判斷是否是一分鐘內 */ - (BOOL)isInOneMinute; /** 判斷是否是一小時內 */ - (BOOL)isInOneHour; /** 判斷是否是昨天 */ - (BOOL)isYesterday; /** 判斷是否是今天 */ - (BOOL)isToday; /** 判斷是否是明天 */ - (BOOL)isTomorrow; /** 判斷是否是今年 */ - (BOOL)isThisYear; /** 日期字串轉時間戳 */ + (NSInteger)timestampFromDateString:(NSString *)dateStr format:(NSString *)format; /** 時間戳轉日期字串 */ + (NSString *)stringFromTimestamp:(NSInteger)timeStamp withDateFormat:(NSString *)format; /** 日期轉字串 */ + (NSString *)stringFromDate:(NSDate *)date format:(NSString *)format; /** 字串轉日期 */ + (NSDate *)dateFromString:(NSString *)dateString format:(NSString *)format; /** 日期轉week */ + (NSString*)weekdayStringFromDate:(NSDate*)inputDate; @end
// // NSDateExt.m // SwiftExercises // // Created by ADreamClusive on 20/11/2017. // Copyright © 2017 ADreamClusive. All rights reserved. // #import "NSDateExt.h" static NSDateFormatter *formatter_; @implementation NSDate (ZL) // 第一次使用這個類的時候呼叫 // 優化效能,減少頻繁的建立格式化物件 + (void)initialize { [super initialize]; formatter_ = [[NSDateFormatter alloc] init]; } #pragma mark - 日期時間間隔判斷 - (BOOL)isInOneMinute { formatter_.dateFormat = @"yyyyMMddHHmm"; NSString *selfSecond = [formatter_ stringFromDate:self]; NSString *nowSecond = [formatter_ stringFromDate:[NSDate date]]; return [selfSecond isEqualToString:nowSecond]; } - (BOOL)isInOneHour { formatter_.dateFormat = @"yyyyMMddHH"; NSString *selfHour = [formatter_ stringFromDate:self]; NSString *nowHour = [formatter_ stringFromDate:[NSDate date]]; return [selfHour isEqualToString:nowHour]; } - (BOOL)isYesterday { formatter_.dateFormat = @"yyyyMMdd"; NSString *selfDay = [formatter_ stringFromDate:self]; NSString *nowDay = [formatter_ stringFromDate:[NSDate date]]; NSDate *selfDate = [formatter_ dateFromString:selfDay]; NSDate *nowDate = [formatter_ dateFromString:nowDay]; NSCalendar *calendar_ = [NSCalendar currentCalendar]; NSCalendarUnit units = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay; NSDateComponents *cmp = [calendar_ components:units fromDate:nowDate toDate:selfDate options:0]; return cmp.year == 0 && cmp.month == 0 && cmp.day == -1; } - (BOOL)isToday { formatter_.dateFormat = @"yyyyMMdd"; NSString *selfDay = [formatter_ stringFromDate:self]; NSString *nowDay = [formatter_ stringFromDate:[NSDate date]]; return [selfDay isEqualToString:nowDay]; } - (BOOL)isTomorrow { formatter_.dateFormat = @"yyyyMMdd"; NSString *selfDay = [formatter_ stringFromDate:self]; NSString *nowDay = [formatter_ stringFromDate:[NSDate date]]; NSDate *selfDate = [formatter_ dateFromString:selfDay]; NSDate *nowDate = [formatter_ dateFromString:nowDay]; NSCalendar *calendar_ = [NSCalendar currentCalendar]; NSCalendarUnit units = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay; NSDateComponents *cmp = [calendar_ components:units fromDate:nowDate toDate:selfDate options:0]; return cmp.year == 0 && cmp.month == 0 && cmp.day == 1; } - (BOOL)isThisYear { formatter_.dateFormat = @"yyyy"; NSString *selfYear = [formatter_ stringFromDate:self]; NSString *currentYear = [formatter_ stringFromDate:[NSDate date]]; return [selfYear isEqualToString:currentYear]; } #pragma mark - 日期時間-字串 轉換 +(NSInteger)timestampFromDateString:(NSString *)timeStr format:(NSString *)format { NSDate *date = [NSDate dateFromString:timeStr format:format]; return [NSDate cTimestampFromDate:date]; } + (NSInteger)cTimestampFromDate:(NSDate *)date { return (long)[date timeIntervalSince1970]; } + (NSString *)stringFromTimestamp:(NSInteger)timeStamp withDateFormat:(NSString *)format { NSDate *date = [NSDate dateWithTimeIntervalSince1970:timeStamp]; return [NSDate stringFromDate:date format:format]; } + (NSString *)stringFromDate:(NSDate *)date format:(NSString *)format { formatter_.dateFormat = format; //指定轉date得日期格式化形式 return [formatter_ stringFromDate:date]; } + (NSDate *)dateFromString:(NSString *)dateString format:(NSString *)format { [formatter_ setTimeZone:[NSTimeZone localTimeZone]]; formatter_.dateFormat = format; return [formatter_ dateFromString:dateString]; } + (NSString*)weekdayStringFromDate:(NSDate*)inputDate { NSArray *weekdays = [NSArray arrayWithObjects: [NSNull null], @"星期天", @"星期一", @"星期二", @"星期三", @"星期四", @"星期五", @"星期六", nil]; NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; NSTimeZone *timeZone = [NSTimeZone localTimeZone]; [calendar setTimeZone: timeZone]; NSCalendarUnit calendarUnit = NSCalendarUnitWeekday; NSDateComponents *theComponents = [calendar components:calendarUnit fromDate:inputDate]; return [weekdays objectAtIndex:theComponents.weekday]; } @end
2 使用示例
NSInteger timestamp = [NSDate timestampFromDateString:@"2018-12-18 12:00:00" format:@"YYYY-MM-dd HH:mm:ss"]; NSString *datestr = [NSDate stringFromTimestamp:timestamp withDateFormat:@"YYYY-MM-dd HH:mm:ss"]; NSString *datestr2 = [NSDate stringFromDate:[NSDate date] format:@"YYYY-MM-dd HH:mm:ss"]; NSDate *date = [NSDate dateFromString:datestr2 format:@"YYYY-MM-dd HH:mm:ss"]; NSString *weekstr = [NSDate weekdayStringFromDate:date]; self.messageLabel.text = [NSString stringWithFormat:@"%ld %@\n%@ %@\n%@", timestamp, datestr, datestr2, date, weekstr];