在写一个记账软件,其中有个统计功能。比如,统计某月的支出,需要知道某天所在的月的第一天和最后一天,以便从数据库中根据时间取数据。

话不多说,上代码:

//
// EBDate.h
// ChargeMoney
//
// Created by eagle on 15-3-24.
// Copyright (c) 2015年 EagleB. All rights reserved.
// #import <Foundation/Foundation.h> @interface EBDate : NSObject
/**
* 得到这个周的第一天和最后一天
*/
+(NSArray *)getFirstAndLastDayOfThisWeek;
/**
* 得到这个月的第一天和最后一天
*/
+(NSArray *)getFirstAndLastDayOfThisMonth;
/**
* 得到今年的第一天和最后一天
*/
+(NSArray *)getFirstAndLastDayOfThisYear;
@end
//
// EBDate.m
// ChargeMoney
//
// Created by eagle on 15-3-24.
// Copyright (c) 2015年 EagleB. All rights reserved.
// #import "EBDate.h" @implementation EBDate +(NSArray *)getFirstAndLastDayOfThisWeek
{
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *dateComponents = [calendar components:NSWeekdayCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]];
NSInteger weekday = [dateComponents weekday]; //第几天(从sunday开始)
NSInteger firstDiff,lastDiff;
if (weekday == ) {
firstDiff = -;
lastDiff = ;
}else {
firstDiff = - weekday + ;
lastDiff = - weekday;
}
NSInteger day = [dateComponents day];
NSDateComponents *firstComponents = [calendar components:NSWeekdayCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]];
[firstComponents setDay:day+firstDiff];
NSDate *firstDay = [calendar dateFromComponents:firstComponents]; NSDateComponents *lastComponents = [calendar components:NSWeekdayCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]];
[lastComponents setDay:day+lastDiff];
NSDate *lastDay = [calendar dateFromComponents:lastComponents];
return [NSArray arrayWithObjects:firstDay,lastDay, nil];
} +(NSArray *)getFirstAndLastDayOfThisMonth
{
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *firstDay;
[calendar rangeOfUnit:NSMonthCalendarUnit startDate:&firstDay interval:nil forDate:[NSDate date]];
NSDateComponents *lastDateComponents = [calendar components:NSMonthCalendarUnit | NSYearCalendarUnit |NSDayCalendarUnit fromDate:firstDay];
NSUInteger dayNumberOfMonth = [calendar rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]].length;
NSInteger day = [lastDateComponents day];
[lastDateComponents setDay:day+dayNumberOfMonth-];
NSDate *lastDay = [calendar dateFromComponents:lastDateComponents];
return [NSArray arrayWithObjects:firstDay,lastDay, nil];
} +(NSArray *)getFirstAndLastDayOfThisYear
{
//通过2月天数的改变,来确定全年天数
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setTimeZone:[NSTimeZone systemTimeZone]];
[formatter setDateFormat:@"yyyy"];
NSString *dateStr = [formatter stringFromDate:[NSDate date]];
dateStr = [dateStr stringByAppendingString:@"-02-14"];
[formatter setDateFormat:@"yyyy-MM-dd"];
NSDate *aDayOfFebruary = [formatter dateFromString:dateStr]; NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *firstDay;
[calendar rangeOfUnit:NSYearCalendarUnit startDate:&firstDay interval:nil forDate:[NSDate date]];
NSDateComponents *lastDateComponents = [calendar components:NSMonthCalendarUnit | NSYearCalendarUnit | NSDayCalendarUnit fromDate:firstDay];
NSUInteger dayNumberOfFebruary = [calendar rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:aDayOfFebruary].length;
NSInteger day = [lastDateComponents day];
[lastDateComponents setDay:day++dayNumberOfFebruary-];
NSDate *lastDay = [calendar dateFromComponents:lastDateComponents]; return [NSArray arrayWithObjects:firstDay,lastDay, nil];
} @end

注意频繁创建Canlendar,会严重消耗系统性能,该文章的方法仅提供一个参考。

感谢这篇文章:http://my.oschina.net/yongbin45/blog/156181#OSC_h4_7

--------------------------------------

更新:

上边的方法有点笨了,贴上最新的代码。可能过段时间看,这方法又笨了。不得不说,底层的API提供的功能越来强大,你要写的越来越简单。

 /**
* month: range from 1 to 12
**/
+ (NSArray<NSDate *> *)getFirstAndLastDayOfMonth:(NSInteger)month inYear:(NSInteger)year {
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [self getDateWithMonth:month year:year];
NSDate *firstDay;
NSTimeInterval interval;
[calendar rangeOfUnit:NSCalendarUnitMonth startDate:&firstDay interval:&interval forDate:date];
NSDateComponents *lastDateComponents = [calendar components:NSCalendarUnitMonth | NSCalendarUnitYear |NSCalendarUnitDay fromDate:firstDay];
NSUInteger dayNumberOfMonth = [calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:date].length;
NSInteger day = [lastDateComponents day];
[lastDateComponents setDay:day + dayNumberOfMonth];
lastDateComponents.nanosecond = lastDateComponents.nanosecond - ;
NSDate *lastDay = [calendar dateFromComponents:lastDateComponents];
return [NSArray arrayWithObjects:firstDay,lastDay, nil];
} + (NSArray<NSDate *> *)getFirstAndLastDayOfYear:(NSInteger)year {
NSDate *date = [self getDateWithYear:year];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *firstDay;
[calendar rangeOfUnit:NSCalendarUnitYear startDate:&firstDay interval:nil forDate:date];
NSDateComponents *lastDateComponents = [calendar components:NSCalendarUnitMonth | NSCalendarUnitYear | NSCalendarUnitDay fromDate:firstDay];
NSUInteger dayNumberOfYear = [calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitYear forDate:date].length;
NSInteger day = [lastDateComponents day];
[lastDateComponents setDay:day + dayNumberOfYear];
lastDateComponents.nanosecond = lastDateComponents.nanosecond - ;
NSDate *lastDay = [calendar dateFromComponents:lastDateComponents];
return [NSArray arrayWithObjects:firstDay,lastDay, nil];
} + (NSDate *)getDateWithMonth:(NSInteger)month year:(NSInteger)year {
NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
dateComponents.year = year;
dateComponents.month = month; NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [calendar dateFromComponents:dateComponents];
return date;
} + (NSDate *)getDateWithYear:(NSInteger)year {
NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
dateComponents.year = year; NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [calendar dateFromComponents:dateComponents];
return date;
}

最新文章

  1. 行为Behavior的使用
  2. php自动转换pfx到pem和cer(dem格式)到pem
  3. POJ 2689 Prime Distance (素数筛选法,大区间筛选)
  4. myeclipse断点调试
  5. 解决vsftpd 2.2.2读取目录列表失败的问题
  6. CentOS 6.3下部署LVS(NAT)+keepalived实现高性能高可用负载均衡【转】
  7. java中float/double浮点数的计算失精度问题(转)
  8. Simple python reverse shell
  9. 【Scala】Scala之Control Structures
  10. php Redis函数使用总结(string,hash,list, set , sort set )
  11. PA 项目任务创建资源
  12. java反射取private字段
  13. Django自带的用户认证auth模块
  14. Python mayavi库及mayavi管线
  15. python爬虫之Cookie
  16. Oracle课程档案。第十一天
  17. linux学习笔记---grep
  18. java基础阶段关于密码或账号字符数字的判断总结
  19. 教你轻松计算AOE网关键路径
  20. django rest_framework入门五-认证和权限

热门文章

  1. Day 07--最终修改(三)
  2. rabbitmq生产者的消息确认
  3. JS中 isNaN() 方法解析
  4. C笔记_动态库和静态库
  5. JMeter 登录,获取token的接口测试401
  6. XHTML 和 HTML 中的 iframe
  7. 模板列传值到子窗体中,子窗体中多选gridview中checkbox保存数据多项到数据库中
  8. 创建ASP.NET Webservice
  9. 爬虫工程师分享:三步就搞定 Android 逆向
  10. NLP(十六) DL在NLP中的应用