创建两个UILable: Lable1,Lable2.创建好IBOutlate并连线, 然后用如下方法:
-(void)updateLabel {
NSDate* now = [NSDate date];
NSCalendar *cal = [NSCalendar currentCalendar];
unsigned int unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit |NSHourCalendarUnit | NSMinuteCalendarUnit |NSSecondCalendarUnit;
NSDateComponents *dd = [cal components:unitFlags fromDate:now];
int y = [dd year];
int m = [dd month];
int d = [dd day];
int hour = [dd hour];
int min = [dd minute];
int sec = [dd second];
Lable1.text = [NSString stringWithFormat:@"2d%:2d%:2d%",y,m,d];
Lable2.text =[NSStrinstringWithFormat:@"2d%:2d%:2d%",hour,min,sec];
}
- (void)onTimer {
[viewController updateLabel];
}
在AppDeletate.m文件中增加如下方法:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
timer = [NSTimer scheduledTimerWithTimeInterval:(1.0) target:selfselector:@selector(onTimer) userInfo:nil repeats:YES];
[window addSubview:viewController.view];
[window makeKeyAndVisible];
}
运行就大功告成了,看效果:


#define ChineseMonths @[@"正月", @"二月", @"三月", @"四月", @"五月", @"六月", @"七月", @"八月",@"九月", @"十月", @"冬月", @"腊月"]
#define ChineseFestival @[@"除夕",@"春节",@"中秋",@"五一",@"国庆",@"儿童",@"圣诞",@"七夕",@"端午"]
#define ChineseDays @[@"初一", @"初二", @"初三", @"初四", @"初五", @"初六", @"初七", @"初八", @"初九", @"初十",@"十一", @"十二", @"十三", @"十四", @"十五", @"十六", @"十七", @"十八", @"十九", @"二十", @"廿一", @"廿二", @"廿三", @"廿四", @"廿五", @"廿六", @"廿七", @"廿八", @"廿九", @"三十"]
#define ChineseWeatherFestival @[@"立春",@"雨水",@"惊蛰",@"春分",@"清明",@"谷雨",@"立夏",@"小满",@"忙种",@"夏至",@"小暑",@"大暑",@"立秋",@"处暑",@"寒露",@"霜降",@"白露",@"秋分",@"立冬",@"小雪",@"大雪",@"冬至",@"小寒",@"大寒"]
// 获取date当天的农历
- (NSString *)chineseCalendarOfDate:(NSDate *)date {
NSCalendar *chineseCalendar = [NSCalendarcalendarWithIdentifier:NSCalendarIdentifierChinese];
NSDateComponents *components = [chineseCalendarcomponents:NSCalendarUnitYear |NSCalendarUnitMonth | NSCalendarUnitDay fromDate:date];
//NSString *dayDate;
NSCalendar *normalDate = [NSCalendarcalendarWithIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *Datecomponents = [normalDatecomponents:NSCalendarUnitYear |NSCalendarUnitMonth | NSCalendarUnitDay fromDate:date];
if (components.day ==1 ) {
_day =ChineseMonths[components.month -1];
} else {
_day =ChineseDays[components.day -1];
}
//农历节日
if (components.day ==1 && components.month ==1) {
_day = [NSStringstringWithFormat:@"%@",ChineseFestival[1]]; //春节
} if(components.month ==8 && components.day ==15){
_day = [NSStringstringWithFormat:@"%@",ChineseFestival[2]];//中秋
}elseif(components.day ==1 && components.month ==1){
_day = [NSStringstringWithFormat:@"%@",ChineseFestival[0]];//除夕
}elseif(components.month ==7 && components.day ==7){
_day = [NSStringstringWithFormat:@"%@",ChineseFestival[7]];//七夕
}elseif(components.month ==5 && components.day ==5){
_day = [NSStringstringWithFormat:@"%@",ChineseFestival[8]];//端午
}
//阳历节日
if (Datecomponents.month ==6 && Datecomponents.day ==1) { //儿童节
_day = [NSStringstringWithFormat:@"%@",ChineseFestival[5]];
}elseif(Datecomponents.month ==10 && Datecomponents.day ==1){ //国庆节
_day = [NSStringstringWithFormat:@"%@",ChineseFestival[4]];
}elseif(Datecomponents.month ==5 && Datecomponents.day ==1){ //劳动节
_day = [NSStringstringWithFormat:@"%@",ChineseFestival[3]];
}elseif(Datecomponents.month ==12 && Datecomponents.day ==25){//圣诞节
_day = [NSStringstringWithFormat:@"%@",ChineseFestival[6]];
}
[selfgetLunarSpecialDate:Datecomponents.yearMonth:Datecomponents.monthDay:Datecomponents.day];
//除夕另外提出放在所有节日的末尾执行,除夕是在春节前一天,即把components当天时间前移一天,放在所有节日末尾,避免其他节日全部前移一天
NSTimeInterval timeInterval_day =60 *60 *24;
NSDate *nextDay_date = [NSDatedateWithTimeInterval:timeInterval_daysinceDate:date];
NSCalendar *localeCalendar = [[NSCalendaralloc]initWithCalendarIdentifier:NSChineseCalendar];
unsigned unitFlags =NSYearCalendarUnit |NSMonthCalendarUnit |NSDayCalendarUnit;
components = [localeCalendar components:unitFlagsfromDate:nextDay_date];
if ( 1 == components.month &&1 == components.day ) {
return@"除夕";
}
return_day;
}
代码
// UICalender.h
#import <UIKit/UIKit.h>
@interface UICalender : UIView
- (instancetype)initWithCurrentDate:(NSDate *)date;
@end
// UICalender.m
#import "UICalender.h"
#import "DataCalender.h"
#define Weekdays @[@"日",@"一",@"二",@"三",@"四",@"五",@"六"]
static NSDateFormatter *dateForMattor;
@interface UICalender ()<UIScrollViewDelegate,DataCalenderItemDelegate>
@property(strong,nonatomic)NSDate *date;
@property(strong,nonatomic)UIButton *titleButton;
@property(strong,nonatomic)UIScrollView *scrollView;
@property(strong,nonatomic)DataCalender *leftCalenderItem;
@property(strong,nonatomic)DataCalender *centerCalendarItem;
@property(strong,nonatomic)DataCalender *rightCalenderItem;
@property(strong,nonatomic)UIView *backgroundView;
@property(strong,nonatomic)UIView *dateCheckedView;
@property(strong,nonatomic)UIDatePicker *datePicker;
@end
@implementation UICalender
- (instancetype)initWithCurrentDate:(NSDate *)date{
if (self = [superinit]) {
self.backgroundColor = [UIColorcolorWithRed:236 /255.0 green:236 /255.0blue:236 /255.0alpha:1.0];
self.date = date;//显示当前时间
[selfsetupTitleBar];//设置上层显示的titleBar
[selfsetupWeekHeader];//设置星期的文字显示样式
[selfsetupCalendarItems];//设置日历显示的三个部分
[selfsetupScrollView];
[selfsetFrame:CGRectMake(0,0,DeviceWidth,CGRectGetMaxY(self.scrollView.frame))];
[selfsetCurrentDate:self.date];//设置当前日期的显示
}
returnself;
}
#pragma mark - UImethod
-(UIView *)backgroundView{
if (!_backgroundView) {
_backgroundView = [[UIViewalloc]initWithFrame:self.bounds];
_backgroundView.backgroundColor = [UIColorblackColor];
_backgroundView.alpha =0;
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizeralloc]initWithTarget:selfaction:@selector(hideDatePickerView)];
[_backgroundViewaddGestureRecognizer:tapGesture];
}
[selfaddSubview:_backgroundView];
return_backgroundView;
}
-(UIView *)dateCheckedView{
if (!_dateCheckedView) {
_dateCheckedView = [[UIViewalloc]initWithFrame:CGRectMake(0,44,self.frame.size.width,0)];
_dateCheckedView.backgroundColor = [UIColorwhiteColor];
_dateCheckedView.clipsToBounds =YES;
UIButton *cancelButton = [[UIButtonalloc]initWithFrame:CGRectMake(20,10,32,20)];
cancelButton.titleLabel.font = [UIFontboldSystemFontOfSize:16];
[cancelButton setTitle:@"取消"forState:UIWindowLevelNormal];
[cancelButton setTitleColor:[UIColorredColor]forState:UIControlStateNormal];
[cancelButton addTarget:selfaction:@selector(cancelSelectCurrentData)forControlEvents:UIControlEventTouchUpInside];
[_dateCheckedViewaddSubview:cancelButton];
UIButton *okButton = [[UIButtonalloc]initWithFrame:CGRectMake(self.frame.size.width - 52, 10,32,20)];
okButton.titleLabel.font = [UIFontboldSystemFontOfSize:16];
[okButton setTitle:@"确定"forState:UIControlStateNormal];
[okButton setTitleColor:[UIColorredColor]forState:UIControlStateNormal];
[okButton addTarget:selfaction:@selector(selectCurrentDate)forControlEvents:UIControlEventTouchUpInside];
[_dateCheckedViewaddSubview:okButton];
[_dateCheckedViewaddSubview:self.datePicker];
}
[selfaddSubview:_dateCheckedView];
return_dateCheckedView;
}
-(UIDatePicker *)datePicker{
if (!_datePicker) {
_datePicker = [[UIDatePickeralloc]init];
_datePicker.datePickerMode =UIDatePickerModeDate;
_datePicker.locale = [NSLocalelocaleWithLocaleIdentifier:@"Chinese"];
CGRect frame =_datePicker.frame;
frame.origin =CGPointMake(0,32);
_datePicker.frame = frame;
}
return_datePicker;
}
#pragma mark - 设置星期
-(void)setupWeekHeader{
NSInteger count = [Weekdayscount];
CGFloat weekHeaderSetX =5;
for (int i =0; i < count; i++) {
UILabel * weekdayLable = [[UILabelalloc]initWithFrame:CGRectMake(weekHeaderSetX,50, (DeviceWidth -10) / count,20)];
weekdayLable.textAlignment =NSTextAlignmentCenter;
weekdayLable.text =Weekdays[i];
if (i ==0 || i == count -1) {
weekdayLable.textColor = [UIColorredColor];
}else{
weekdayLable.textColor = [UIColorgrayColor];
}
[selfaddSubview:weekdayLable];
weekHeaderSetX += weekdayLable.frame.size.width;
}
UIView *lineView = [[UIViewalloc]initWithFrame:CGRectMake(15,74,DeviceWidth -30,1)];
lineView.backgroundColor = [UIColorlightGrayColor];
[selfaddSubview:lineView];
}
#pragma 设置包含日期的item的scrollView
-(void)setupScrollView{
self.scrollView.delegate =self;
self.scrollView.pagingEnabled = YES;
self.scrollView.showsHorizontalScrollIndicator = NO;
self.scrollView.showsVerticalScrollIndicator = NO;
[self.scrollViewsetFrame:CGRectMake(0,75,DeviceWidth,self.centerCalendarItem.frame.size.height)];
self.scrollView.contentSize = CGSizeMake(3 *self.scrollView.frame.size.width,self.scrollView.frame.size.height);
self.scrollView.contentOffset = CGPointMake(self.scrollView.frame.size.width,0);
[selfaddSubview:self.scrollView];
}
#pragma mark - 设置日历滑动显示日期
-(void)setupCalendarItems{
self.scrollView = [[UIScrollViewalloc]init];
//左边滑动日期
self.leftCalenderItem = [[DataCalenderalloc]init];
[self.scrollViewaddSubview:self.leftCalenderItem];
//居中显示的日期
CGRect itemFrame =self.leftCalenderItem.frame;
itemFrame.origin.x =DeviceWidth;
self.centerCalendarItem = [[DataCalenderalloc]init];
self.centerCalendarItem.frame = itemFrame;
self.centerCalendarItem.delegate =self;
[self.scrollViewaddSubview:self.centerCalendarItem];
//右边滑动的日期
itemFrame.origin.x =DeviceWidth *2;
self.rightCalenderItem = [[DataCalenderalloc]init];
self.rightCalenderItem.frame = itemFrame;
[self.scrollViewaddSubview:self.rightCalenderItem];
}
-(void)setCurrentDate:(NSDate *)date{
self.centerCalendarItem.date = date;
self.leftCalenderItem.date = [self.centerCalendarItempreviousMonthDate];
self.rightCalenderItem.date = [self.centerCalendarItemnextMonthDate];
[self.titleButtonsetTitle:[selfstringFromDate:self.centerCalendarItem.date]forState:UIControlStateNormal];
}
#pragma mark - Private
-(NSString *)stringFromDate:(NSDate *)date{
if (!dateForMattor) {
dateForMattor = [[NSDateFormatteralloc]init];
[dateForMattorsetDateFormat:@"MM-yyyy"];
}
return [dateForMattorstringFromDate:date];
}
#pragma mark - 月份
-(void)setupTitleBar{ //设置可以翻动月份滚动条
UIView *titleView = [[UIViewalloc]initWithFrame:CGRectMake(0,0,DeviceWidth,44)];
titleView.backgroundColor = [UIColorlightGrayColor];
[selfaddSubview:titleView];
//左键选择上个月
UIButton *leftButton = [[UIButtonalloc]initWithFrame:CGRectMake(5,10,32,24)];
[leftButton setImage:[UIImageimageNamed:@"left"]forState:UIControlStateNormal];
[leftButton addTarget:selfaction:@selector(setPreviousMonthDate)forControlEvents:UIControlEventTouchUpInside];
[titleView addSubview:leftButton];
//右键选择下个月
UIButton *rightButton = [[UIButtonalloc]initWithFrame:CGRectMake(titleView.frame.size.width - 37,10,32,24)];
[rightButton setImage:[UIImageimageNamed:@"right"]forState:UIControlStateNormal];
[rightButton addTarget:selfaction:@selector(setNextMonthDate)forControlEvents:UIControlEventTouchUpInside];
[titleView addSubview:rightButton];
UIButton *titlebButton = [[UIButtonalloc]initWithFrame:CGRectMake(0,0,100,44)];
titlebButton.titleLabel.textColor = [UIColorwhiteColor];
titlebButton.titleLabel.font = [UIFontboldSystemFontOfSize:20];
titlebButton.center = titleView.center;
[titlebButton addTarget:selfaction:@selector(showDatePicker)forControlEvents:UIControlEventTouchUpInside];
[titleView addSubview:titlebButton];
self.titleButton = titlebButton;
}
//重新加载日历的数据
-(void)reloadCalendarItems{
CGPoint weekSetX =self.scrollView.contentOffset;
if (weekSetX.x >self.scrollView.frame.size.width) {
[selfsetNextMonthDate];
}else{
[selfsetPreviousMonthDate];
}
}
#pragma mark - SEL
//选择当前日期
-(void)selectCurrentDate{
[selfsetCurrentDate:self.datePicker.date];
[selfhideDatePickerView];
}
//取消
-(void)cancelSelectCurrentData{
[selfhideDatePickerView];
}
-(void)hideDatePickerView{
[UIViewanimateWithDuration:0.25animations:^{
self.backgroundView.alpha =0;
self.dateCheckedView.frame =CGRectMake(0,44,self.frame.size.width,0);
} completion:^(BOOL finished) {
[self.backgroundViewremoveFromSuperview];
[self.dateCheckedViewremoveFromSuperview];
}];
}
-(void)showDatePicker{
[selfshowDatePickerView];
}
-(void)showDatePickerView{
[UIViewanimateWithDuration:0.25animations:^{
self.backgroundView.alpha =0.4;
self.dateCheckedView.frame =CGRectMake(0,44,self.frame.size.width,250);
}];
}
//跳到下个月
-(void)setNextMonthDate{
[selfsetCurrentDate:[self.centerCalendarItemnextMonthDate]];
}
//跳到上个月
-(void)setPreviousMonthDate{
[selfsetCurrentDate:[self.centerCalendarItempreviousMonthDate]];
}
#pragma mark - 实现代理方法
//UIScrollViewDelegate
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
[selfreloadCalendarItems];
self.scrollView.contentOffset = CGPointMake(self.scrollView.frame.size.width,0);
}
//DataCalenderItemDelegate
-(void)calendarItem:(DataCalender *)item didSelectedDate:(NSDate *)date{
self.date = date;
[selfsetCurrentDate:self.date];
}
@end
//DataCalender.h
#import <UIKit/UIKit.h>
#define DeviceWidth [UIScreen mainScreen].bounds.size.width
@protocol DataCalenderItemDelegate;
@interface DataCalender : UIView
@property (strong ,nonatomic)NSDate *date;
@property (weak ,nonatomic)id<DataCalenderItemDelegate> delegate;
@property (strong ,nonatomic)NSString *day;
@property (strong ,nonatomic)NSString *chineseWeatherDay;
- (NSDate *) nextMonthDate;
- (NSDate *) previousMonthDate;
@end
@protocol DataCalenderItemDelegate <NSObject>
- (void)calendarItem:(DataCalender *)item didSelectedDate:(NSDate *)date;
@end
// //DataCalender.m
#import "DataCalender.h"
@interface DataCalendarCell : UICollectionViewCell
- (UILabel *)dayLabel;
- (UILabel *)chineseDayLabel;
@end
@implementation DataCalendarCell {
UILabel *_dayLabel;
UILabel *_chineseDayLabel;
NSString *day;
}
- (UILabel *)dayLabel {
if (!_dayLabel) {
_dayLabel = [[UILabelalloc]initWithFrame:CGRectMake(0,0,20,20)];
_dayLabel.textAlignment =NSTextAlignmentCenter;
_dayLabel.font = [UIFontsystemFontOfSize:15];
_dayLabel.center =CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2 - 3);
[selfaddSubview:_dayLabel];
}
return_dayLabel;
}
- (UILabel *)chineseDayLabel {
if (!_chineseDayLabel) {
_chineseDayLabel = [[UILabelalloc]initWithFrame:CGRectMake(0,0,20,10)];
_chineseDayLabel.textAlignment =NSTextAlignmentCenter;
_chineseDayLabel.font = [UIFontboldSystemFontOfSize:9];
CGPoint point =_dayLabel.center;
point.y +=15;
_chineseDayLabel.center = point;
[selfaddSubview:_chineseDayLabel];
}
return_chineseDayLabel;
}
@end
#define CollectionViewHorizonMargin 5
#define CollectionViewVerticalMargin 5
#define ChineseMonths @[@"正月", @"二月", @"三月", @"四月", @"五月", @"六月", @"七月", @"八月",@"九月", @"十月", @"冬月", @"腊月"]
#define ChineseFestival @[@"除夕",@"春节",@"中秋",@"五一",@"国庆",@"儿童",@"圣诞",@"七夕",@"端午"]
#define ChineseDays @[@"初一", @"初二", @"初三", @"初四", @"初五", @"初六", @"初七", @"初八", @"初九", @"初十",@"十一", @"十二", @"十三", @"十四", @"十五", @"十六", @"十七", @"十八", @"十九", @"二十", @"廿一", @"廿二", @"廿三", @"廿四", @"廿五", @"廿六", @"廿七", @"廿八", @"廿九", @"三十"]
#define ChineseWeatherFestival @[@"立春",@"雨水",@"惊蛰",@"春分",@"清明",@"谷雨",@"立夏",@"小满",@"忙种",@"夏至",@"小暑",@"大暑",@"立秋",@"处暑",@"寒露",@"霜降",@"白露",@"秋分",@"立冬",@"小雪",@"大雪",@"冬至",@"小寒",@"大寒"]
typedef NS_ENUM(NSUInteger, DataCalendarMonth) {
DataCalendarMonthPrevious = 0,
DataCalendarMonthCurrent = 1,
DataCalendarMonthNext = 2,
};
@interface DataCalender () <UICollectionViewDataSource,UICollectionViewDelegate>
@property (strong,nonatomic)UICollectionView *collectionView;
@end
@implementation DataCalender
- (instancetype)init {
if (self = [superinit]) {
self.backgroundColor = [UIColorclearColor];
[selfsetupCollectionView];
[selfsetFrame:CGRectMake(0,0,DeviceWidth,self.collectionView.frame.size.height + CollectionViewVerticalMargin *2)];
}
returnself;
}
#pragma mark - Custom Accessors
- (void)setDate:(NSDate *)date {
_date = date;
[self.collectionViewreloadData];
}
#pragma mark - Public
// 获取date的下个月日期
- (NSDate *)nextMonthDate {
NSDateComponents *components = [[NSDateComponentsalloc]init];
components.month =1;
NSDate *nextMonthDate = [[NSCalendarcurrentCalendar]dateByAddingComponents:componentstoDate:self.dateoptions:NSCalendarMatchStrictly];
return nextMonthDate;
}
// 获取date的上个月日期
- (NSDate *)previousMonthDate {
NSDateComponents *components = [[NSDateComponentsalloc]init];
components.month = -1;
NSDate *previousMonthDate = [[NSCalendarcurrentCalendar]dateByAddingComponents:componentstoDate:self.dateoptions:NSCalendarMatchStrictly];
return previousMonthDate;
}
#pragma mark - Private
// collectionView显示日期单元,设置其属性
- (void)setupCollectionView {
CGFloat itemWidth = (DeviceWidth -CollectionViewHorizonMargin *2) / 7;
CGFloat itemHeight = itemWidth;
UICollectionViewFlowLayout *flowLayot = [[UICollectionViewFlowLayoutalloc]init];
flowLayot.sectionInset =UIEdgeInsetsZero;
flowLayot.itemSize =CGSizeMake(itemWidth, itemHeight);
flowLayot.minimumLineSpacing =0;
flowLayot.minimumInteritemSpacing =0;
CGRect collectionViewFrame =CGRectMake(CollectionViewHorizonMargin,CollectionViewVerticalMargin,DeviceWidth - CollectionViewHorizonMargin *2, itemHeight *6);
self.collectionView = [[UICollectionViewalloc]initWithFrame:collectionViewFramecollectionViewLayout:flowLayot];
[selfaddSubview:self.collectionView];
self.collectionView.dataSource = self;
self.collectionView.delegate = self;
self.collectionView.backgroundColor = [UIColor clearColor];
[self.collectionViewregisterClass:[DataCalendarCellclass]forCellWithReuseIdentifier:@"CalendarCell"];
}
// 自动获取date当前月的第一天是星期几
- (NSInteger)weekdayOfFirstDayInDate {
NSCalendar *calendar = [NSCalendarcurrentCalendar];
[calendar setFirstWeekday:1];
NSDateComponents *components = [calendarcomponents:NSCalendarUnitYear |NSCalendarUnitMonth | NSCalendarUnitDay fromDate:self.date];
[components setDay:1];
NSDate *firstDate = [calendardateFromComponents:components];
NSDateComponents *firstComponents = [calendarcomponents:NSCalendarUnitWeekdayfromDate:firstDate];
return firstComponents.weekday -1;
}
// 获取date当前月的总天数
- (NSInteger)totalDaysInMonthOfDate:(NSDate *)date {
NSRange range = [[NSCalendarcurrentCalendar]rangeOfUnit:NSCalendarUnitDayinUnit:NSCalendarUnitMonthforDate:date];
return range.length;
}
// 获取某月day的日期
- (NSDate *)dateOfMonth:(DataCalendarMonth)calendarMonth WithDay:(NSInteger)day {
NSCalendar *calendar = [NSCalendarcurrentCalendar];
NSDate *date;
switch (calendarMonth) {
caseDataCalendarMonthPrevious:
date = [selfpreviousMonthDate];
break;
caseDataCalendarMonthCurrent:
date = self.date;
break;
caseDataCalendarMonthNext:
date = [selfnextMonthDate];
break;
default:
break;
}
NSDateComponents *components = [calendarcomponents:NSCalendarUnitYear |NSCalendarUnitMonth | NSCalendarUnitDay fromDate:date];
[components setDay:day];
NSDate *dateOfDay = [calendardateFromComponents:components];
return dateOfDay;
}
#pragma mark - 显示节日节气信息
// 获取date当天的农历
- (NSString *)chineseCalendarOfDate:(NSDate *)date {
NSCalendar *chineseCalendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierChinese];
NSDateComponents *components = [chineseCalendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:date];
//NSString *dayDate;
NSCalendar *normalDate = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *Datecomponents = [normalDate components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:date];
if (components.day ==1 ) {
_day = ChineseMonths[components.month - 1];
} else {
_day = ChineseDays[components.day - 1];
}
//农历节日
if (components.day ==1 && components.month ==1) {
_day = [NSString stringWithFormat:@"%@",ChineseFestival[1]]; //春节
} if(components.month ==8 && components.day ==15){
_day = [NSString stringWithFormat:@"%@",ChineseFestival[2]];//中秋
}elseif(components.day ==1 && components.month ==1){
_day = [NSString stringWithFormat:@"%@",ChineseFestival[0]];//除夕
}elseif(components.month ==7 && components.day == 7){
_day = [NSString stringWithFormat:@"%@",ChineseFestival[7]];//七夕
}elseif(components.month ==5 && components.day == 5){
_day = [NSString stringWithFormat:@"%@",ChineseFestival[8]];//端午
}
//阳历节日
if (Datecomponents.month ==6 && Datecomponents.day ==1) { //儿童节
_day = [NSString stringWithFormat:@"%@",ChineseFestival[5]];
}elseif(Datecomponents.month ==10 && Datecomponents.day ==1){ //国庆节
_day = [NSString stringWithFormat:@"%@",ChineseFestival[4]];
}elseif(Datecomponents.month ==5 && Datecomponents.day ==1){ //劳动节
_day = [NSString stringWithFormat:@"%@",ChineseFestival[3]];
}elseif(Datecomponents.month ==12 && Datecomponents.day ==25){//圣诞节
_day = [NSString stringWithFormat:@"%@",ChineseFestival[6]];
}
[self getLunarSpecialDate:Datecomponents.year Month:Datecomponents.month Day:Datecomponents.day];
//除夕另外提出放在所有节日的末尾执行,除夕是在春节前一天,即把components当天时间前移一天,放在所有节日末尾,避免其他节日全部前移一天
NSTimeInterval timeInterval_day = 60 *60 *24;
NSDate *nextDay_date = [NSDate dateWithTimeInterval:timeInterval_day sinceDate:date];
NSCalendar *localeCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSChineseCalendar];
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |NSDayCalendarUnit;
components = [localeCalendar components:unitFlags fromDate:nextDay_date];
if ( 1 == components.month && 1 == components.day ) {
return@"除夕";
}
return_day;
}
//24节气只有(1901 - 2050)之间为准确的节气
const int START_YEAR =1901;
const int END_YEAR =2050;
static int32_t gLunarHolDay[]=
{
0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77, //1901
0X96,0XA4,0X96,0X96,0X97,0X87,0X79,0X79,0X79,0X69,0X78,0X78, //1902
0X96,0XA5,0X87,0X96,0X87,0X87,0X79,0X69,0X69,0X69,0X78,0X78, //1903
0X86,0XA5,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X79,0X78,0X87, //1904
0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77, //1905
0X96,0XA4,0X96,0X96,0X97,0X97,0X79,0X79,0X79,0X69,0X78,0X78, //1906
0X96,0XA5,0X87,0X96,0X87,0X87,0X79,0X69,0X69,0X69,0X78,0X78, //1907
0X86,0XA5,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X69,0X78,0X87, //1908
0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77, //1909
0X96,0XA4,0X96,0X96,0X97,0X97,0X79,0X79,0X79,0X69,0X78,0X78, //1910
0X96,0XA5,0X87,0X96,0X87,0X87,0X79,0X69,0X69,0X69,0X78,0X78, //1911
0X86,0XA5,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X69,0X78,0X87, //1912
0X95,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77, //1913
0X96,0XB4,0X96,0XA6,0X97,0X97,0X79,0X79,0X79,0X69,0X78,0X78, //1914
0X96,0XA5,0X97,0X96,0X97,0X87,0X79,0X79,0X69,0X69,0X78,0X78, //1915
0X96,0XA5,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X79,0X77,0X87, //1916
0X95,0XB4,0X96,0XA6,0X96,0X97,0X78,0X79,0X78,0X69,0X78,0X87, //1917
0X96,0XB4,0X96,0XA6,0X97,0X97,0X79,0X79,0X79,0X69,0X78,0X77, //1918
0X96,0XA5,0X97,0X96,0X97,0X87,0X79,0X79,0X69,0X69,0X78,0X78, //1919
0X96,0XA5,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X79,0X77,0X87, //1920
0X95,0XB4,0X96,0XA5,0X96,0X97,0X78,0X79,0X78,0X69,0X78,0X87, //1921
0X96,0XB4,0X96,0XA6,0X97,0X97,0X79,0X79,0X79,0X69,0X78,0X77, //1922
0X96,0XA4,0X96,0X96,0X97,0X87,0X79,0X79,0X69,0X69,0X78,0X78, //1923
0X96,0XA5,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X79,0X77,0X87, //1924
0X95,0XB4,0X96,0XA5,0X96,0X97,0X78,0X79,0X78,0X69,0X78,0X87, //1925
0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77, //1926
0X96,0XA4,0X96,0X96,0X97,0X87,0X79,0X79,0X79,0X69,0X78,0X78, //1927
0X96,0XA5,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X78,0X87,0X87, //1928
0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X79,0X77,0X87, //1929
0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77, //1930
0X96,0XA4,0X96,0X96,0X97,0X87,0X79,0X79,0X79,0X69,0X78,0X78, //1931
0X96,0XA5,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X78,0X87,0X87, //1932
0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X69,0X78,0X87, //1933
0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77, //1934
0X96,0XA4,0X96,0X96,0X97,0X97,0X79,0X79,0X79,0X69,0X78,0X78, //1935
0X96,0XA5,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X78,0X87,0X87, //1936
0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X69,0X78,0X87, //1937
0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77, //1938
0X96,0XA4,0X96,0X96,0X97,0X97,0X79,0X79,0X79,0X69,0X78,0X78, //1939
0X96,0XA5,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X78,0X87,0X87, //1940
0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X69,0X78,0X87, //1941
0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77, //1942
0X96,0XA4,0X96,0X96,0X97,0X97,0X79,0X79,0X79,0X69,0X78,0X78, //1943
0X96,0XA5,0X96,0XA5,0XA6,0X96,0X88,0X78,0X78,0X78,0X87,0X87, //1944
0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X79,0X77,0X87, //1945
0X95,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X78,0X69,0X78,0X77, //1946
0X96,0XB4,0X96,0XA6,0X97,0X97,0X79,0X79,0X79,0X69,0X78,0X78, //1947
0X96,0XA5,0XA6,0XA5,0XA6,0X96,0X88,0X88,0X78,0X78,0X87,0X87, //1948
0XA5,0XB4,0X96,0XA5,0X96,0X97,0X88,0X79,0X78,0X79,0X77,0X87, //1949
0X95,0XB4,0X96,0XA5,0X96,0X97,0X78,0X79,0X78,0X69,0X78,0X77, //1950
0X96,0XB4,0X96,0XA6,0X97,0X97,0X79,0X79,0X79,0X69,0X78,0X78, //1951
0X96,0XA5,0XA6,0XA5,0XA6,0X96,0X88,0X88,0X78,0X78,0X87,0X87, //1952
0XA5,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X79,0X77,0X87, //1953
0X95,0XB4,0X96,0XA5,0X96,0X97,0X78,0X79,0X78,0X68,0X78,0X87, //1954
0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77, //1955
0X96,0XA5,0XA5,0XA5,0XA6,0X96,0X88,0X88,0X78,0X78,0X87,0X87, //1956
0XA5,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X79,0X77,0X87, //1957
0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X69,0X78,0X87, //1958
0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77, //1959
0X96,0XA4,0XA5,0XA5,0XA6,0X96,0X88,0X88,0X88,0X78,0X87,0X87, //1960
0XA5,0XB4,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X78,0X87,0X87, //1961
0X96,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X69,0X78,0X87, //1962
0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77, //1963
0X96,0XA4,0XA5,0XA5,0XA6,0X96,0X88,0X88,0X88,0X78,0X87,0X87, //1964
0XA5,0XB4,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X78,0X87,0X87, //1965
0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X69,0X78,0X87, //1966
0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77, //1967
0X96,0XA4,0XA5,0XA5,0XA6,0XA6,0X88,0X88,0X88,0X78,0X87,0X87, //1968
0XA5,0XB4,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X78,0X87,0X87, //1969
0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X69,0X78,0X87, //1970
0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77, //1971
0X96,0XA4,0XA5,0XA5,0XA6,0XA6,0X88,0X88,0X88,0X78,0X87,0X87, //1972
0XA5,0XB5,0X96,0XA5,0XA6,0X96,0X88,0X78,0X78,0X78,0X87,0X87, //1973
0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X69,0X78,0X87, //1974
0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X78,0X69,0X78,0X77, //1975
0X96,0XA4,0XA5,0XB5,0XA6,0XA6,0X88,0X89,0X88,0X78,0X87,0X87, //1976
0XA5,0XB4,0X96,0XA5,0X96,0X96,0X88,0X88,0X78,0X78,0X87,0X87, //1977
0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X79,0X78,0X87, //1978
0X96,0XB4,0X96,0XA6,0X96,0X97,0X78,0X79,0X78,0X69,0X78,0X77, //1979
0X96,0XA4,0XA5,0XB5,0XA6,0XA6,0X88,0X88,0X88,0X78,0X87,0X87, //1980
0XA5,0XB4,0X96,0XA5,0XA6,0X96,0X88,0X88,0X78,0X78,0X77,0X87, //1981
0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X79,0X77,0X87, //1982
0X95,0XB4,0X96,0XA5,0X96,0X97,0X78,0X79,0X78,0X69,0X78,0X77, //1983
0X96,0XB4,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X88,0X78,0X87,0X87, //1984
0XA5,0XB4,0XA6,0XA5,0XA6,0X96,0X88,0X88,0X78,0X78,0X87,0X87, //1985
0XA5,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X79,0X77,0X87, //1986
0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X79,0X78,0X69,0X78,0X87, //1987
0X96,0XB4,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X88,0X78,0X87,0X86, //1988
0XA5,0XB4,0XA5,0XA5,0XA6,0X96,0X88,0X88,0X88,0X78,0X87,0X87, //1989
0XA5,0XB4,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X79,0X77,0X87, //1990
0X95,0XB4,0X96,0XA5,0X86,0X97,0X88,0X78,0X78,0X69,0X78,0X87, //1991
0X96,0XB4,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X88,0X78,0X87,0X86, //1992
0XA5,0XB3,0XA5,0XA5,0XA6,0X96,0X88,0X88,0X88,0X78,0X87,0X87, //1993
0XA5,0XB4,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X78,0X87,0X87, //1994
0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X76,0X78,0X69,0X78,0X87, //1995
0X96,0XB4,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X88,0X78,0X87,0X86, //1996
0XA5,0XB3,0XA5,0XA5,0XA6,0XA6,0X88,0X88,0X88,0X78,0X87,0X87, //1997
0XA5,0XB4,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X78,0X87,0X87, //1998
0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X69,0X78,0X87, //1999
0X96,0XB4,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X88,0X78,0X87,0X86, //2000
0XA5,0XB3,0XA5,0XA5,0XA6,0XA6,0X88,0X88,0X88,0X78,0X87,0X87, //2001
0XA5,0XB4,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X78,0X87,0X87, //2002
0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X69,0X78,0X87, //2003
0X96,0XB4,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X88,0X78,0X87,0X86, //2004
0XA5,0XB3,0XA5,0XA5,0XA6,0XA6,0X88,0X88,0X88,0X78,0X87,0X87, //2005
0XA5,0XB4,0X96,0XA5,0XA6,0X96,0X88,0X88,0X78,0X78,0X87,0X87, //2006
0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X69,0X78,0X87, //2007
0X96,0XB4,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X87,0X78,0X87,0X86, //2008
0XA5,0XB3,0XA5,0XB5,0XA6,0XA6,0X88,0X88,0X88,0X78,0X87,0X87, //2009
0XA5,0XB4,0X96,0XA5,0XA6,0X96,0X88,0X88,0X78,0X78,0X87,0X87, //2010
0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X79,0X78,0X87, //2011
0X96,0XB4,0XA5,0XB5,0XA5,0XA6,0X87,0X88,0X87,0X78,0X87,0X86, //2012
0XA5,0XB3,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X88,0X78,0X87,0X87, //2013
0XA5,0XB4,0X96,0XA5,0XA6,0X96,0X88,0X88,0X78,0X78,0X87,0X87, //2014
0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X79,0X77,0X87, //2015
0X95,0XB4,0XA5,0XB4,0XA5,0XA6,0X87,0X88,0X87,0X78,0X87,0X86, //2016
0XA5,0XC3,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X88,0X78,0X87,0X87, //2017
0XA5,0XB4,0XA6,0XA5,0XA6,0X96,0X88,0X88,0X78,0X78,0X87,0X87, //2018
0XA5,0XB4,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X79,0X77,0X87, //2019
0X95,0XB4,0XA5,0XB4,0XA5,0XA6,0X97,0X87,0X87,0X78,0X87,0X86, //2020
0XA5,0XC3,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X88,0X78,0X87,0X86, //2021
0XA5,0XB4,0XA5,0XA5,0XA6,0X96,0X88,0X88,0X88,0X78,0X87,0X87, //2022
0XA5,0XB4,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X79,0X77,0X87, //2023
0X95,0XB4,0XA5,0XB4,0XA5,0XA6,0X97,0X87,0X87,0X78,0X87,0X96, //2024
0XA5,0XC3,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X88,0X78,0X87,0X86, //2025
0XA5,0XB3,0XA5,0XA5,0XA6,0XA6,0X88,0X88,0X88,0X78,0X87,0X87, //2026
0XA5,0XB4,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X78,0X87,0X87, //2027
0X95,0XB4,0XA5,0XB4,0XA5,0XA6,0X97,0X87,0X87,0X78,0X87,0X96, //2028
0XA5,0XC3,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X88,0X78,0X87,0X86, //2029
0XA5,0XB3,0XA5,0XA5,0XA6,0XA6,0X88,0X88,0X88,0X78,0X87,0X87, //2030
0XA5,0XB4,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X78,0X87,0X87, //2031
0X95,0XB4,0XA5,0XB4,0XA5,0XA6,0X97,0X87,0X87,0X78,0X87,0X96, //2032
0XA5,0XC3,0XA5,0XB5,0XA6,0XA6,0X88,0X88,0X88,0X78,0X87,0X86, //2033
0XA5,0XB3,0XA5,0XA5,0XA6,0XA6,0X88,0X78,0X88,0X78,0X87,0X87, //2034
0XA5,0XB4,0X96,0XA5,0XA6,0X96,0X88,0X88,0X78,0X78,0X87,0X87, //2035
0X95,0XB4,0XA5,0XB4,0XA5,0XA6,0X97,0X87,0X87,0X78,0X87,0X96, //2036
0XA5,0XC3,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X88,0X78,0X87,0X86, //2037
0XA5,0XB3,0XA5,0XA5,0XA6,0XA6,0X88,0X88,0X88,0X78,0X87,0X87, //2038
0XA5,0XB4,0X96,0XA5,0XA6,0X96,0X88,0X88,0X78,0X78,0X87,0X87, //2039
0X95,0XB4,0XA5,0XB4,0XA5,0XA6,0X97,0X87,0X87,0X78,0X87,0X96, //2040
0XA5,0XC3,0XA5,0XB5,0XA5,0XA6,0X87,0X88,0X87,0X78,0X87,0X86, //2041
0XA5,0XB3,0XA5,0XB5,0XA6,0XA6,0X88,0X88,0X88,0X78,0X87,0X87, //2042
0XA5,0XB4,0X96,0XA5,0XA6,0X96,0X88,0X88,0X78,0X78,0X87,0X87, //2043
0X95,0XB4,0XA5,0XB4,0XA5,0XA6,0X97,0X87,0X87,0X88,0X87,0X96, //2044
0XA5,0XC3,0XA5,0XB4,0XA5,0XA6,0X87,0X88,0X87,0X78,0X87,0X86, //2045
0XA5,0XB3,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X88,0X78,0X87,0X87, //2046
0XA5,0XB4,0X96,0XA5,0XA6,0X96,0X88,0X88,0X78,0X78,0X87,0X87, //2047
0X95,0XB4,0XA5,0XB4,0XA5,0XA5,0X97,0X87,0X87,0X88,0X86,0X96, //2048
0XA4,0XC3,0XA5,0XA5,0XA5,0XA6,0X97,0X87,0X87,0X78,0X87,0X86, //2049
0XA5,0XC3,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X78,0X78,0X87,0X87 //2050
};
-(NSString *)getLunarSpecialDate:(NSInteger)iYear Month:(NSInteger)iMonth Day:(NSInteger)iDay {
NSArray *chineseDays=[NSArrayarrayWithObjects:
@"小寒",@"大寒",@"立春",@"雨水",@"惊蛰",@"春分",
@"清明",@"谷雨",@"立夏",@"小满",@"芒种",@"夏至",
@"小暑",@"大暑",@"立秋",@"处暑",@"白露",@"秋分",
@"寒露",@"霜降",@"立冬",@"小雪",@"大雪",@"冬至",nil];
long array_index = (iYear -START_YEAR)*12+iMonth -1 ;
int64_t flag =gLunarHolDay[array_index];
int64_t day;
if(iDay <15)
day= 15 - ((flag>>4)&0x0f);
else
day = ((flag)&0x0f)+15;
long index = -1;
if(iDay == day){
index = (iMonth-1) *2 + (iDay>15?1:0);
}
if ( index >=0 && index < [chineseDayscount] ) {
[chineseDays objectAtIndex:index];
//NSLog(@"%@",chineseDays[index]);
_day = chineseDays[index];
return_day;
} else {
returnnil;
}
}
#pragma mark - UICollectionDatasource数据源协议
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return42;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
staticNSString *identifier =@"CalendarCell";
DataCalendarCell *cell = [self.collectionViewdequeueReusableCellWithReuseIdentifier:identifierforIndexPath:indexPath];
cell.backgroundColor = [UIColorclearColor];
cell.dayLabel.textColor = [UIColorblackColor];
cell.chineseDayLabel.textColor = [UIColorgrayColor];
NSInteger firstWeekday = [selfweekdayOfFirstDayInDate];
NSInteger totalDaysOfMonth = [selftotalDaysInMonthOfDate:self.date];
NSInteger totalDaysOfLastMonth = [selftotalDaysInMonthOfDate:[selfpreviousMonthDate]];
//在当前月份中显示上个月天数用灰色字体填满整个月份表
//算法:
//月份的头如果当前cell的下标小于当前第一个cell的数值,则把字体设置灰色
//月份的尾同理如果当前的cell的下标大于等于当前cell +当月起始日期的星期几,则把字体设置灰色
if (indexPath.row < firstWeekday) { //小于这个月的第一天
NSInteger day = totalDaysOfLastMonth - firstWeekday + indexPath.row +1;
cell.dayLabel.text = [NSStringstringWithFormat:@"%ld ", day];
cell.dayLabel.textColor = [UIColorgrayColor];
cell.chineseDayLabel.text = [selfchineseCalendarOfDate:[selfdateOfMonth:DataCalendarMonthPreviousWithDay:day]];
} elseif (indexPath.row >= totalDaysOfMonth + firstWeekday) { //大于这个月的最后一天
NSInteger day = indexPath.row - totalDaysOfMonth - firstWeekday +1;
cell.dayLabel.text = [NSStringstringWithFormat:@"%ld", day];
cell.dayLabel.textColor = [UIColorgrayColor];
cell.chineseDayLabel.text = [selfchineseCalendarOfDate:[selfdateOfMonth:DataCalendarMonthNextWithDay:day]];
} else { //属于这个月
NSInteger day = indexPath.row - firstWeekday +1;
cell.dayLabel.text= [NSStringstringWithFormat:@"%ld", day];
if (day == [[NSCalendarcurrentCalendar]component:NSCalendarUnitDayfromDate:self.date]) {
cell.backgroundColor = [UIColorblueColor];
cell.layer.cornerRadius = cell.frame.size.height / 5;
cell.dayLabel.textColor = [UIColorwhiteColor];
cell.chineseDayLabel.textColor = [UIColorwhiteColor];
}
// 如果日期和当期日期同年同月不同天,注:第一个判断中的方法是iOS8的新API,会比较传入单元以及比传入单元大得单元上数据是否相等,同时传入Year和Month结果错误
if ([[NSCalendarcurrentCalendar]isDate:[NSDatedate]equalToDate:self.datetoUnitGranularity:NSCalendarUnitMonth] && ![[NSCalendarcurrentCalendar]isDateInToday:self.date]) {
// 将当前日期的那天高亮显示
if (day == [[NSCalendarcurrentCalendar]component:NSCalendarUnitDayfromDate:[NSDatedate]]) {
cell.dayLabel.textColor = [UIColorgreenColor];
}
}
cell.chineseDayLabel.text = [selfchineseCalendarOfDate:[selfdateOfMonth:DataCalendarMonthCurrentWithDay:day]];
}
//周日周六的日期显示红色
if (indexPath.item %7 ==6 || indexPath.item %7 ==0) {
cell.dayLabel.textColor = [UIColorredColor];
}
return cell;
}
#pragma mark - UICollectionViewDelegate
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
NSDateComponents *components = [[NSCalendarcurrentCalendar]components:NSCalendarUnitYear |NSCalendarUnitMonth |NSCalendarUnitDay fromDate:self.date];
NSInteger firstWeekday = [selfweekdayOfFirstDayInDate];
[components setDay:indexPath.row - firstWeekday +1];
NSDate *selectedDate = [[NSCalendarcurrentCalendar]dateFromComponents:components];
if (self.delegate && [self.delegaterespondsToSelector:@selector(calendarItem:didSelectedDate:)]) {
[self.delegatecalendarItem:selfdidSelectedDate:selectedDate];
}
}
@end

最后附上Demo地址:https://github.com/YuLeiJack/IOSCalender