提到日期处理,主要有2个参数,一个是所在的时区,一个是所用的日历方法。
主要涉及2大类问题,一类是日期类型和字符串之间的转化,另一类是日期的计算问题。ios和android都提供了相应的类来处理问题。
iOS
1. NSDateFormatter类
它的作用是进行NSDate 和字符串之间的相互转化。除了自定义格式外,它还提供了集中默认格式常量,例如
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; [dateFormatter setTimeStyle:NSDateFormatterNoStyle]; NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:162000]; NSString *formattedDateString = [dateFormatter stringFromDate:date]; NSLog(@"formattedDateString: %@", formattedDateString); // Output for locale en_US: "formattedDateString: Jan 2, 2001".
可以注意到,date的格式和time的格式是分开处理的。
除了几种默认样式,ios还提供了+ (NSString *)dateFormatFromTemplate:(NSString *)template options:(NSUInteger)opts locale:(NSLocale *)locale
方法,使用这个方法可以产生一个format字符串,这个字符串是系统根据你要显示的内容和地方自动产生的,比自己写的更加准确(因为你可能不知道那个地方的准确日期格式),比如
NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; NSString *usFormatString = [NSDateFormatter dateFormatFromTemplate:@"EdMMM" options:0 locale:usLocale]; NSLog(@"usFormatterString: %@", usFormatString); // Output: usFormatterString: EEE, MMM d. NSLocale *gbLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"]; NSString *gbFormatString = [NSDateFormatter dateFormatFromTemplate:@"EdMMM" options:0 locale:gbLocale]; NSLog(@"gbFormatterString: %@", gbFormatString); // Output: gbFormatterString: EEE d MMM.
2. NSCalendar类
它的作用是日期计算。
---------------------------
下面的例子可以看到这两个类的基本应用
- (NSString *)getAgeFromBirthday:(NSString *)birthday { NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; NSLocale *formatLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"]; [formatter setLocale:formatLocale]; NSString *formatString = @"dd/MM/yyyy"; [formatter setDateFormat:formatString]; // [formatter setTimeZone:tzTimeZone]; NSLog(@"time zone is %@",formatter.timeZone); // formatter.timeZone NSDate *birthdayDate = [formatter dateFromString:birthday]; NSDate * newDate =[NSDate new]; NSCalendar* chineseClendar = [ [ NSCalendar alloc ] initWithCalendarIdentifier:NSGregorianCalendar]; NSUInteger unitFlags = NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit; NSDateComponents *cps = [chineseClendar components:unitFlags fromDate:birthdayDate toDate:newDate options:0]; /* NSInteger diffHour = [ cps hour ]; NSInteger diffMin = [ cps minute ]; NSInteger diffSec = [ cps second ]; NSInteger diffDay = [ cps day ]; NSInteger diffMon = [ cps month ]; */ NSInteger diffYear = [ cps year ]; NSString *returnStr = [NSString stringWithFormat:@"%d Years",diffYear]; return returnStr; }
2 Android
Android 中常使用SimpleDateFormat,注意这里的locale参数,它和ios里的意义一致,当locale是中国时,日期字符串中会出现 “年,月,日”等中国汉字!ios是否会这样还没有验证。
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH); Date selectDate = null; try { selectDate = format.parse(dateStr); } catch (ParseException e) { e.printStackTrace(); }
Calendar 的基本使用方法如下:
Calendar selectCalendar = Calendar.getInstance(); selectCalendar.setTime(selectDate); Calendar nowEndCalendar = Calendar.getInstance(); nowEndCalendar.setTime(new Date()); nowEndCalendar.set(Calendar.HOUR_OF_DAY, 23); nowEndCalendar.set(Calendar.MINUTE, 59); nowEndCalendar.set(Calendar.SECOND, 59); if (selectCalendar.compareTo(nowEndCalendar) > 0) return true;