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

来源:互联网 发布:arm-linux-gcc是什么 编辑:程序博客网 时间:2024/05/21 06:11
#import <Foundation/Foundation.h>@interface NSDate (Helpers) 

@end

#import "Date.h"@implementation NSDate(Helpers)//获取年月日如:19871127.- (NSString *)getFormatYearMonthDay{NSString *string = [NSString stringWithFormat:@"%d%02d%02d",[self getYear],[self getMonth],[self getDay]];return string;}//该日期是该年的第几周- (int )getWeekOfYear{int i;int year = [self getYear];NSDate *date = [self endOfWeek];for (i = 1;[[date dateAfterDay:-7 * i] getYear] == year;i++) {}return i;}//返回day天后的日期(若day为负数,则为|day|天前的日期)- (NSDate *)dateAfterDay:(int)day{NSCalendar *calendar = [NSCalendar currentCalendar];// Get the weekday component of the current date// NSDateComponents *weekdayComponents = [calendar components:NSWeekdayCalendarUnit fromDate:self];NSDateComponents *componentsToAdd = [[NSDateComponents alloc] init];// to get the end of week for a particular date, add (7 - weekday) days[componentsToAdd setDay:day];NSDate *dateAfterDay = [calendar dateByAddingComponents:componentsToAdd toDate:self options:0];[componentsToAdd release];return dateAfterDay;}//month个月后的日期- (NSDate *)dateafterMonth:(int)month{NSCalendar *calendar = [NSCalendar currentCalendar];NSDateComponents *componentsToAdd = [[NSDateComponents alloc] init];[componentsToAdd setMonth:month];NSDate *dateAfterMonth = [calendar dateByAddingComponents:componentsToAdd toDate:self options:0];[componentsToAdd release];return dateAfterMonth;}//获取日- (NSUInteger)getDay{NSCalendar *calendar = [NSCalendar currentCalendar];NSDateComponents *dayComponents = [calendar components:(NSDayCalendarUnit) fromDate:self];return [dayComponents day];}//获取月- (NSUInteger)getMonth{NSCalendar *calendar = [NSCalendar currentCalendar];NSDateComponents *dayComponents = [calendar components:(NSMonthCalendarUnit) fromDate:self];return [dayComponents month];}//获取年- (NSUInteger)getYear{NSCalendar *calendar = [NSCalendar currentCalendar];NSDateComponents *dayComponents = [calendar components:(NSYearCalendarUnit) fromDate:self];return [dayComponents year];}//获取小时- (int )getHour {NSCalendar *calendar = [NSCalendar currentCalendar];NSUInteger unitFlags =NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit |NSHourCalendarUnit|NSMinuteCalendarUnit;NSDateComponents *components = [calendar components:unitFlags fromDate:self];NSInteger hour = [components hour];return (int)hour;}//获取分钟- (int)getMinute {NSCalendar *calendar = [NSCalendar currentCalendar];NSUInteger unitFlags =NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit |NSHourCalendarUnit|NSMinuteCalendarUnit;NSDateComponents *components = [calendar components:unitFlags fromDate:self];NSInteger minute = [components minute];return (int)minute;}- (int )getHour:(NSDate *)date {NSCalendar *calendar = [NSCalendar currentCalendar];NSUInteger unitFlags =NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit |NSHourCalendarUnit|NSMinuteCalendarUnit;NSDateComponents *components = [calendar components:unitFlags fromDate:date];NSInteger hour = [components hour];return (int)hour;}- (int)getMinute:(NSDate *)date {NSCalendar *calendar = [NSCalendar currentCalendar];NSUInteger unitFlags =NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit |NSHourCalendarUnit|NSMinuteCalendarUnit;NSDateComponents *components = [calendar components:unitFlags fromDate:date];NSInteger minute = [components minute];return (int)minute;}//在当前日期前几天- (NSUInteger)daysAgo {NSCalendar *calendar = [NSCalendar currentCalendar];NSDateComponents *components = [calendar components:(NSDayCalendarUnit)    fromDate:self toDate:[NSDate date]options:0];return [components day];}//午夜时间距今几天- (NSUInteger)daysAgoAgainstMidnight {// get a midnight version of ourself:NSDateFormatter *mdf = [[NSDateFormatter alloc] init];[mdf setDateFormat:@"yyyy-MM-dd"];NSDate *midnight = [mdf dateFromString:[mdf stringFromDate:self]];[mdf release];return (int)[midnight timeIntervalSinceNow] / (60*60*24) *-1;}- (NSString *)stringDaysAgo {return [self stringDaysAgoAgainstMidnight:YES];}- (NSString *)stringDaysAgoAgainstMidnight:(BOOL)flag {NSUInteger daysAgo = (flag) ? [self daysAgoAgainstMidnight] : [self daysAgo];NSString *text = nil;switch (daysAgo) {case 0:text = @"Today";break;case 1:text = @"Yesterday";break;default:text = [NSString stringWithFormat:@"%d days ago", daysAgo];}return text;}//返回一周的第几天(周末为第一天)- (NSUInteger)weekday {NSCalendar *calendar = [NSCalendar currentCalendar];NSDateComponents *weekdayComponents = [calendar components:(NSWeekdayCalendarUnit) fromDate:self];return [weekdayComponents weekday];}//转为NSString类型的+ (NSDate *)dateFromString:(NSString *)string {return [NSDate dateFromString:string withFormat:[NSDate dbFormatString]];}+ (NSDate *)dateFromString:(NSString *)string withFormat:(NSString *)format {NSDateFormatter *inputFormatter = [[NSDateFormatter alloc] init];[inputFormatter setDateFormat:format];NSDate *date = [inputFormatter dateFromString:string];[inputFormatter release];return date;}+ (NSString *)stringFromDate:(NSDate *)date withFormat:(NSString *)format {return [date stringWithFormat:format];}+ (NSString *)stringFromDate:(NSDate *)date {return [date string];}+ (NSString *)stringForDisplayFromDate:(NSDate *)date prefixed:(BOOL)prefixed {/*  * if the date is in today, display 12-hour time with meridian, * if it is within the last 7 days, display weekday name (Friday) * if within the calendar year, display as Jan 23 * else display as Nov 11, 2008 */NSDate *today = [NSDate date];NSCalendar *calendar = [NSCalendar currentCalendar];NSDateComponents *offsetComponents = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit |NSDayCalendarUnit)  fromDate:today];NSDate *midnight = [calendar dateFromComponents:offsetComponents];NSDateFormatter *displayFormatter = [[NSDateFormatter alloc] init];NSString *displayString = nil;// comparing against midnightif ([date compare:midnight] == NSOrderedDescending) {if (prefixed) {[displayFormatter setDateFormat:@"'at' h:mm a"]; // at 11:30 am} else {[displayFormatter setDateFormat:@"h:mm a"]; // 11:30 am}} else {// check if date is within last 7 daysNSDateComponents *componentsToSubtract = [[NSDateComponents alloc] init];[componentsToSubtract setDay:-7];NSDate *lastweek = [calendar dateByAddingComponents:componentsToSubtract toDate:today options:0];[componentsToSubtract release];if ([date compare:lastweek] == NSOrderedDescending) {[displayFormatter setDateFormat:@"EEEE"]; // Tuesday} else {// check if same calendar yearNSInteger thisYear = [offsetComponents year];NSDateComponents *dateComponents = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit |NSDayCalendarUnit)    fromDate:date];NSInteger thatYear = [dateComponents year];if (thatYear >= thisYear) {[displayFormatter setDateFormat:@"MMM d"];} else {[displayFormatter setDateFormat:@"MMM d, yyyy"];}}if (prefixed) {NSString *dateFormat = [displayFormatter dateFormat];NSString *prefix = @"'on' ";[displayFormatter setDateFormat:[prefix stringByAppendingString:dateFormat]];}}// use display formatter to return formatted date stringdisplayString = [displayFormatter stringFromDate:date];[displayFormatter release];return displayString;}+ (NSString *)stringForDisplayFromDate:(NSDate *)date {return [self stringForDisplayFromDate:date prefixed:NO];}- (NSString *)stringWithFormat:(NSString *)format {NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];[outputFormatter setDateFormat:format];NSString *timestamp_str = [outputFormatter stringFromDate:self];[outputFormatter release];return timestamp_str;}- (NSString *)string {return [self stringWithFormat:[NSDate dbFormatString]];}- (NSString *)stringWithDateStyle:(NSDateFormatterStyle)dateStyle timeStyle:(NSDateFormatterStyle)timeStyle {NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];[outputFormatter setDateStyle:dateStyle];[outputFormatter setTimeStyle:timeStyle];NSString *outputString = [outputFormatter stringFromDate:self];[outputFormatter release];return outputString;}//返回周日的的开始时间- (NSDate *)beginningOfWeek {// largely borrowed from "Date and Time Programming Guide for Cocoa"// we'll use the default calendar and hope for the bestNSCalendar *calendar = [NSCalendar currentCalendar];NSDate *beginningOfWeek = nil;BOOL ok = [calendar rangeOfUnit:NSWeekCalendarUnit startDate:&beginningOfWeek   interval:NULL forDate:self];if (ok) {return beginningOfWeek;} // couldn't calc via range, so try to grab Sunday, assuming gregorian style// Get the weekday component of the current dateNSDateComponents *weekdayComponents = [calendar components:NSWeekdayCalendarUnit fromDate:self];/* Create a date components to represent the number of days to subtract from the current date. 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.) */NSDateComponents *componentsToSubtract = [[NSDateComponents alloc] init];[componentsToSubtract setDay: 0 - ([weekdayComponents weekday] - 1)];beginningOfWeek = nil;beginningOfWeek = [calendar dateByAddingComponents:componentsToSubtract toDate:self options:0];[componentsToSubtract release];//normalize to midnight, extract the year, month, and day components and create a new date from those components.NSDateComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit |NSDayCalendarUnit)   fromDate:beginningOfWeek];return [calendar dateFromComponents:components];}//返回当前天的年月日.- (NSDate *)beginningOfDay {NSCalendar *calendar = [NSCalendar currentCalendar];// Get the weekday component of the current dateNSDateComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit |NSDayCalendarUnit)    fromDate:self];return [calendar dateFromComponents:components];}//返回该月的第一天- (NSDate *)beginningOfMonth{return [self dateAfterDay:-[self getDay] + 1];}//该月的最后一天- (NSDate *)endOfMonth{return [[[self beginningOfMonth] dateafterMonth:1] dateAfterDay:-1];}//返回当前周的周末- (NSDate *)endOfWeek {NSCalendar *calendar = [NSCalendar currentCalendar];// Get the weekday component of the current dateNSDateComponents *weekdayComponents = [calendar components:NSWeekdayCalendarUnit fromDate:self];NSDateComponents *componentsToAdd = [[NSDateComponents alloc] init];// to get the end of week for a particular date, add (7 - weekday) days[componentsToAdd setDay:(7 - [weekdayComponents weekday])];NSDate *endOfWeek = [calendar dateByAddingComponents:componentsToAdd toDate:self options:0];[componentsToAdd release];return endOfWeek;}+ (NSString *)dateFormatString {return @"yyyy-MM-dd";}+ (NSString *)timeFormatString {return @"HH:mm:ss";}+ (NSString *)timestampFormatString {return @"yyyy-MM-dd HH:mm:ss";}// preserving for compatibility+ (NSString *)dbFormatString {return [NSDate timestampFormatString];}@end

0 0