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

话不多说,上代码:

//
// 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;
}

【iOS】得到当前年、月、周的第一天和最后一天的更多相关文章

  1. js 计算月/周的第一天和最后一天

    因为项目开发中遇到需要向后台传本周的开始和结束时间,以及上一周的起止时间,就琢磨了半天,总算写出来一套,写篇文章是为了方便自己记忆,也是分享给需要的人,水平有限,写的不好请见谅: getDateStr ...

  2. C#获取周的第一天、最后一天、月第一天和最后一天

    [csharp] view plaincopyprint? public class DateTimeTool { /// <summary> /// 获取指定日期所在周的第一天,星期天为 ...

  3. c# 获取某日期所在周的第一天和最后一天

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace WyfC ...

  4. 【转载】对C#DateTime的一些扩展,计算周内第一天,最后一天

    /// <summary> /// DateTime的一些扩展 /// </summary> public class DateTime2 { /// <summary& ...

  5. c# 获取某日期所在周的第一天和最后一天(转)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace WyfC ...

  6. 用js获取周、月第一天和最后一天(转载)

    var getCurrentWeek = function (day) { var days = ["周日", "周一", "周二", &q ...

  7. C# DateTime 月第一天和最后一天 取法

    取得某月和上个月第一天和最后一天的方法 /// <summary> /// 取得某月的第一天 /// </summary> /// <param name="d ...

  8. 在oracle里,如何取得本周、本月、本季度、本年度的第一天和最后一天的时间

    在oracle里,如何取得本周.本月.本季度.本年度的第一天和最后一天的时间 --本周 select trunc(sysdate,'d')+1 from dual; select trunc(sysd ...

  9. java获取当月的第一天和最后一天,获取本周的第一天和最后一天

    /** * 获取指定日期所在周的第一天和最后一天,用下划线连接 * @param dataStr * @return * @throws ParseException */ public static ...

随机推荐

  1. 100天搞定机器学习|day45-53 推荐一本豆瓣评分9.3的书:《Python数据科学手册》

    <Python数据科学手册>共五章,每章介绍一到两个Python数据科学中的重点工具包.首先从IPython和Jupyter开始,它们提供了数据科学家需要的计算环境:第2章讲解能提供nda ...

  2. AR+工业,带来哪些革变呢?

            随着技术的普及相信大家对VR和AR也略有所知,尤其是AR增强现实技术,已经成为许多科技巨头企业争相扩疆的热土,目前来说,AR技术最广泛的应用是工业领域,已经显示出巨大的价值.     ...

  3. 亲,麻烦给个五星好评!—RatingBar

    引言 上一篇的CheckBox已经让大家越来越接近实战演练了,本章我们继续分享干货给大家,今天介绍一个实用的UI控件RatingBar(星级评分条),对于使用过电商APP(某东,某宝等)的小伙伴们来说 ...

  4. C笔记_C语言环境、编译、预处理

    1.环境 gcc -v //查看环境变量 gcc 同 g++ gcc main.c -o main.exe gcc main.c //默认生成a.exe 2.编译 预处理:   gcc -E main ...

  5. 关于前端jsonp跨域和一个简单的node服务搭建

    先讲下概念 同源策略:是一种约定,浏览器最核心最基本的安全功能,(同域名,同协议,同端口)为同源 跨域: 跨(跳):范围 域 (源):域名,协议,端口 域名:ip的一种昵称(为了更好记住ip地址)如: ...

  6. MySQL运行时自动生成的性能相关的数据参考

      某大师曾说过,一个DBA要像熟悉自己的老婆一样熟悉自己的数据库,个人认为包含了两个方面的熟悉: 1,在稳定性层面来说,更多的是关注高可用.读写分离.负载均衡,灾备管理等等high level层面的 ...

  7. iOS Autoresizing Autolayout Size classes

    Autoresizing:出现最早,仅仅能够针对父控件做约束(注意:要关闭Autolayout&Size classes才能够看到Autoresizing) 代码对应: UIView.h中的a ...

  8. TK图形界面

    import tkinter 1.使用tkinter模块前 一般先要建立一个tkinter的对象     例: window = tkinter.TK()   2.建立完对象设置好窗口属性以及所有功能 ...

  9. 牛客-小a的旅行计划 + 数学推导

    小a的旅行计划 题意: 小a终于放假了,它想在假期中去一些地方游玩,现在有N个景点,编号为,同时小b也想出去游玩.由于一些特殊♂原因,他们的旅行计划必须满足一些条件 首先,他们可以从这N个景点中任意选 ...

  10. 复习+dfs

    1.参考:https://www.cnblogs.com/ckxkexing/p/8466097.html 这道题自己写过,还写过blog,但是第二次写还是不会. (于是开坑,想做做dfs的整理.