【IOS类扩展之日期操作】NSDate+Helpers

来源:互联网 发布:php编写第一个api接口 编辑:程序博客网 时间:2024/06/05 08:12
    1. #import <Foundation/Foundation.h>  
    2. @interface NSDate (Helpers)   
    3. @end

  1. #import "Date.h"  
  2.   
  3. @implementation NSDate(Helpers)  
  4.   
  5. //获取年月日如:19871127.  
  6. - (NSString *)getFormatYearMonthDay  
  7. {  
  8.     NSString *string = [NSString stringWithFormat:@"%d%02d%02d",[self getYear],[self getMonth],[self getDay]];  
  9.     return string;  
  10. }  
  11.   
  12. //该日期是该年的第几周  
  13. - (int )getWeekOfYear  
  14. {  
  15.     int i;  
  16.     int year = [self getYear];  
  17.     NSDate *date = [self endOfWeek];  
  18.     for (i = 1;[[date dateAfterDay:-7 * i] getYear] == year;i++)   
  19.     {  
  20.     }  
  21.     return i;  
  22. }  
  23. //返回day天后的日期(若day为负数,则为|day|天前的日期)  
  24. - (NSDate *)dateAfterDay:(int)day  
  25. {  
  26.     NSCalendar *calendar = [NSCalendar currentCalendar];  
  27.     // Get the weekday component of the current date  
  28.     // NSDateComponents *weekdayComponents = [calendar components:NSWeekdayCalendarUnit fromDate:self];  
  29.     NSDateComponents *componentsToAdd = [[NSDateComponents alloc] init];  
  30.     // to get the end of week for a particular date, add (7 - weekday) days  
  31.     [componentsToAdd setDay:day];  
  32.     NSDate *dateAfterDay = [calendar dateByAddingComponents:componentsToAdd toDate:self options:0];  
  33.     [componentsToAdd release];  
  34.       
  35.     return dateAfterDay;  
  36. }  
  37. //month个月后的日期  
  38. - (NSDate *)dateafterMonth:(int)month  
  39. {  
  40.     NSCalendar *calendar = [NSCalendar currentCalendar];  
  41.     NSDateComponents *componentsToAdd = [[NSDateComponents alloc] init];  
  42.     [componentsToAdd setMonth:month];  
  43.     NSDate *dateAfterMonth = [calendar dateByAddingComponents:componentsToAdd toDate:self options:0];  
  44.     [componentsToAdd release];  
  45.       
  46.     return dateAfterMonth;  
  47. }  
  48. //获取日  
  49. - (NSUInteger)getDay{  
  50.     NSCalendar *calendar = [NSCalendar currentCalendar];  
  51.     NSDateComponents *dayComponents = [calendar components:(NSDayCalendarUnit) fromDate:self];  
  52.     return [dayComponents day];  
  53. }  
  54. //获取月  
  55. - (NSUInteger)getMonth  
  56. {  
  57.     NSCalendar *calendar = [NSCalendar currentCalendar];  
  58.     NSDateComponents *dayComponents = [calendar components:(NSMonthCalendarUnit) fromDate:self];  
  59.     return [dayComponents month];  
  60. }  
  61. //获取年  
  62. - (NSUInteger)getYear  
  63. {  
  64.     NSCalendar *calendar = [NSCalendar currentCalendar];  
  65.     NSDateComponents *dayComponents = [calendar components:(NSYearCalendarUnit) fromDate:self];  
  66.     return [dayComponents year];  
  67. }  
  68. //获取小时  
  69. - (int )getHour {  
  70.     NSCalendar *calendar = [NSCalendar currentCalendar];  
  71.     NSUInteger unitFlags =NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit |NSHourCalendarUnit|NSMinuteCalendarUnit;  
  72.     NSDateComponents *components = [calendar components:unitFlags fromDate:self];  
  73.     NSInteger hour = [components hour];  
  74.     return (int)hour;  
  75. }  
  76. //获取分钟  
  77. - (int)getMinute {  
  78.     NSCalendar *calendar = [NSCalendar currentCalendar];  
  79.     NSUInteger unitFlags =NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit |NSHourCalendarUnit|NSMinuteCalendarUnit;  
  80.     NSDateComponents *components = [calendar components:unitFlags fromDate:self];  
  81.     NSInteger minute = [components minute];  
  82.     return (int)minute;  
  83. }  
  84. - (int )getHour:(NSDate *)date {  
  85.     NSCalendar *calendar = [NSCalendar currentCalendar];  
  86.     NSUInteger unitFlags =NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit |NSHourCalendarUnit|NSMinuteCalendarUnit;  
  87.     NSDateComponents *components = [calendar components:unitFlags fromDate:date];  
  88.     NSInteger hour = [components hour];  
  89.     return (int)hour;  
  90. }  
  91. - (int)getMinute:(NSDate *)date {  
  92.     NSCalendar *calendar = [NSCalendar currentCalendar];  
  93.     NSUInteger unitFlags =NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit |NSHourCalendarUnit|NSMinuteCalendarUnit;  
  94.     NSDateComponents *components = [calendar components:unitFlags fromDate:date];  
  95.     NSInteger minute = [components minute];  
  96.     return (int)minute;  
  97. }  
  98. //在当前日期前几天  
  99. - (NSUInteger)daysAgo {  
  100.     NSCalendar *calendar = [NSCalendar currentCalendar];  
  101.     NSDateComponents *components = [calendar components:(NSDayCalendarUnit)   
  102.                                                fromDate:self  
  103.                                                  toDate:[NSDate date]  
  104.                                                 options:0];  
  105.     return [components day];  
  106. }  
  107. //午夜时间距今几天  
  108. - (NSUInteger)daysAgoAgainstMidnight {  
  109.     // get a midnight version of ourself:  
  110.     NSDateFormatter *mdf = [[NSDateFormatter alloc] init];  
  111.     [mdf setDateFormat:@"yyyy-MM-dd"];  
  112.     NSDate *midnight = [mdf dateFromString:[mdf stringFromDate:self]];  
  113.     [mdf release];  
  114.       
  115.     return (int)[midnight timeIntervalSinceNow] / (60*60*24) *-1;  
  116. }  
  117.   
  118. - (NSString *)stringDaysAgo {  
  119.     return [self stringDaysAgoAgainstMidnight:YES];  
  120. }  
  121.   
  122. - (NSString *)stringDaysAgoAgainstMidnight:(BOOL)flag {  
  123.     NSUInteger daysAgo = (flag) ? [self daysAgoAgainstMidnight] : [self daysAgo];  
  124.     NSString *text = nil;  
  125.     switch (daysAgo) {  
  126.         case 0:  
  127.             text = @"Today";  
  128.             break;  
  129.         case 1:  
  130.             text = @"Yesterday";  
  131.             break;  
  132.         default:  
  133.             text = [NSString stringWithFormat:@"%d days ago", daysAgo];  
  134.     }  
  135.     return text;  
  136. }  
  137.   
  138. //返回一周的第几天(周末为第一天)  
  139. - (NSUInteger)weekday {  
  140.     NSCalendar *calendar = [NSCalendar currentCalendar];  
  141.     NSDateComponents *weekdayComponents = [calendar components:(NSWeekdayCalendarUnit) fromDate:self];  
  142.     return [weekdayComponents weekday];  
  143. }  
  144. //转为NSString类型的  
  145. + (NSDate *)dateFromString:(NSString *)string {  
  146.     return [NSDate dateFromString:string withFormat:[NSDate dbFormatString]];  
  147. }  
  148.   
  149. + (NSDate *)dateFromString:(NSString *)string withFormat:(NSString *)format {  
  150.     NSDateFormatter *inputFormatter = [[NSDateFormatter alloc] init];  
  151.     [inputFormatter setDateFormat:format];  
  152.     NSDate *date = [inputFormatter dateFromString:string];  
  153.     [inputFormatter release];  
  154.     return date;  
  155. }  
  156.   
  157. + (NSString *)stringFromDate:(NSDate *)date withFormat:(NSString *)format {  
  158.     return [date stringWithFormat:format];  
  159. }  
  160.   
  161. + (NSString *)stringFromDate:(NSDate *)date {  
  162.     return [date string];  
  163. }  
  164.   
  165. + (NSString *)stringForDisplayFromDate:(NSDate *)date prefixed:(BOOL)prefixed {  
  166.     /*   
  167.      * if the date is in today, display 12-hour time with meridian,  
  168.      * if it is within the last 7 days, display weekday name (Friday)  
  169.      * if within the calendar year, display as Jan 23  
  170.      * else display as Nov 11, 2008  
  171.      */  
  172.       
  173.     NSDate *today = [NSDate date];  
  174.     NSCalendar *calendar = [NSCalendar currentCalendar];  
  175.     NSDateComponents *offsetComponents = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit |NSDayCalendarUnit)   
  176.                                                      fromDate:today];  
  177.       
  178.     NSDate *midnight = [calendar dateFromComponents:offsetComponents];  
  179.       
  180.     NSDateFormatter *displayFormatter = [[NSDateFormatter alloc] init];  
  181.     NSString *displayString = nil;  
  182.       
  183.     // comparing against midnight  
  184.     if ([date compare:midnight] == NSOrderedDescending) {  
  185.         if (prefixed) {  
  186.             [displayFormatter setDateFormat:@"'at' h:mm a"]; // at 11:30 am  
  187.         } else {  
  188.             [displayFormatter setDateFormat:@"h:mm a"]; // 11:30 am  
  189.         }  
  190.     } else {  
  191.         // check if date is within last 7 days  
  192.         NSDateComponents *componentsToSubtract = [[NSDateComponents alloc] init];  
  193.         [componentsToSubtract setDay:-7];  
  194.         NSDate *lastweek = [calendar dateByAddingComponents:componentsToSubtract toDate:today options:0];  
  195.         [componentsToSubtract release];  
  196.         if ([date compare:lastweek] == NSOrderedDescending) {  
  197.             [displayFormatter setDateFormat:@"EEEE"]; // Tuesday  
  198.         } else {  
  199.             // check if same calendar year  
  200.             NSInteger thisYear = [offsetComponents year];  
  201.               
  202.             NSDateComponents *dateComponents = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit |NSDayCalendarUnit)   
  203.                                                            fromDate:date];  
  204.             NSInteger thatYear = [dateComponents year];  
  205.             if (thatYear >= thisYear) {  
  206.                 [displayFormatter setDateFormat:@"MMM d"];  
  207.             } else {  
  208.                 [displayFormatter setDateFormat:@"MMM d, yyyy"];  
  209.             }  
  210.         }  
  211.         if (prefixed) {  
  212.             NSString *dateFormat = [displayFormatter dateFormat];  
  213.             NSString *prefix = @"'on' ";  
  214.             [displayFormatter setDateFormat:[prefix stringByAppendingString:dateFormat]];  
  215.         }  
  216.     }  
  217.       
  218.     // use display formatter to return formatted date string  
  219.     displayString = [displayFormatter stringFromDate:date];  
  220.     [displayFormatter release];  
  221.     return displayString;  
  222. }  
  223.   
  224. + (NSString *)stringForDisplayFromDate:(NSDate *)date {  
  225.     return [self stringForDisplayFromDate:date prefixed:NO];  
  226. }  
  227.   
  228. - (NSString *)stringWithFormat:(NSString *)format {  
  229.     NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];  
  230.     [outputFormatter setDateFormat:format];  
  231.     NSString *timestamp_str = [outputFormatter stringFromDate:self];  
  232.     [outputFormatter release];  
  233.     return timestamp_str;  
  234. }  
  235.   
  236. - (NSString *)string {  
  237.     return [self stringWithFormat:[NSDate dbFormatString]];  
  238. }  
  239.   
  240. - (NSString *)stringWithDateStyle:(NSDateFormatterStyle)dateStyle timeStyle:(NSDateFormatterStyle)timeStyle {  
  241.     NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];  
  242.     [outputFormatter setDateStyle:dateStyle];  
  243.     [outputFormatter setTimeStyle:timeStyle];  
  244.     NSString *outputString = [outputFormatter stringFromDate:self];  
  245.     [outputFormatter release];  
  246.     return outputString;  
  247. }  
  248. //返回周日的的开始时间  
  249. - (NSDate *)beginningOfWeek {  
  250.     // largely borrowed from "Date and Time Programming Guide for Cocoa"  
  251.     // we'll use the default calendar and hope for the best  
  252.       
  253.     NSCalendar *calendar = [NSCalendar currentCalendar];  
  254.     NSDate *beginningOfWeek = nil;  
  255.     BOOL ok = [calendar rangeOfUnit:NSWeekCalendarUnit startDate:&beginningOfWeek  
  256.                            interval:NULL forDate:self];  
  257.     if (ok) {  
  258.         return beginningOfWeek;  
  259.     }   
  260.       
  261.     // couldn't calc via range, so try to grab Sunday, assuming gregorian style  
  262.     // Get the weekday component of the current date  
  263.     NSDateComponents *weekdayComponents = [calendar components:NSWeekdayCalendarUnit fromDate:self];  
  264.       
  265.     /*  
  266.      Create a date components to represent the number of days to subtract from the current date.  
  267.      The weekday value for Sunday in the Gregorian calendar is 1, so subtract 1 from the number of days to subtract from the date in question.  (If today's Sunday, subtract 0 days.)  
  268.      */  
  269.     NSDateComponents *componentsToSubtract = [[NSDateComponents alloc] init];  
  270.     [componentsToSubtract setDay: 0 - ([weekdayComponents weekday] - 1)];  
  271.     beginningOfWeek = nil;  
  272.     beginningOfWeek = [calendar dateByAddingComponents:componentsToSubtract toDate:self options:0];  
  273.     [componentsToSubtract release];  
  274.       
  275.     //normalize to midnight, extract the year, month, and day components and create a new date from those components.  
  276.     NSDateComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit |NSDayCalendarUnit)  
  277.                                                fromDate:beginningOfWeek];  
  278.     return [calendar dateFromComponents:components];  
  279. }  
  280. //返回当前天的年月日.  
  281. - (NSDate *)beginningOfDay {  
  282.     NSCalendar *calendar = [NSCalendar currentCalendar];  
  283.     // Get the weekday component of the current date  
  284.     NSDateComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit |NSDayCalendarUnit)   
  285.                                                fromDate:self];  
  286.     return [calendar dateFromComponents:components];  
  287. }  
  288. //返回该月的第一天  
  289. - (NSDate *)beginningOfMonth  
  290. {  
  291.     return [self dateAfterDay:-[self getDay] + 1];  
  292. }  
  293. //该月的最后一天  
  294. - (NSDate *)endOfMonth  
  295. {  
  296.     return [[[self beginningOfMonth] dateafterMonth:1] dateAfterDay:-1];  
  297. }  
  298. //返回当前周的周末  
  299. - (NSDate *)endOfWeek {  
  300.     NSCalendar *calendar = [NSCalendar currentCalendar];  
  301.     // Get the weekday component of the current date  
  302.     NSDateComponents *weekdayComponents = [calendar components:NSWeekdayCalendarUnit fromDate:self];  
  303.     NSDateComponents *componentsToAdd = [[NSDateComponents alloc] init];  
  304.     // to get the end of week for a particular date, add (7 - weekday) days  
  305.     [componentsToAdd setDay:(7 - [weekdayComponents weekday])];  
  306.     NSDate *endOfWeek = [calendar dateByAddingComponents:componentsToAdd toDate:self options:0];  
  307.     [componentsToAdd release];  
  308.       
  309.     return endOfWeek;  
  310. }  
  311.   
  312. + (NSString *)dateFormatString {  
  313.     return @"yyyy-MM-dd";  
  314. }  
  315.   
  316. + (NSString *)timeFormatString {  
  317.     return @"HH:mm:ss";  
  318. }  
  319.   
  320. + (NSString *)timestampFormatString {  
  321.     return @"yyyy-MM-dd HH:mm:ss";  
  322. }  
  323.   
  324. // preserving for compatibility  
  325. + (NSString *)dbFormatString {  
  326.     return [NSDate timestampFormatString];  
  327. }  
  328. @end  
0 0