【iOS】得到当前年、月、周的第一天和最后一天
在写一个记账软件,其中有个统计功能。比如,统计某月的支出,需要知道某天所在的月的第一天和最后一天,以便从数据库中根据时间取数据。
话不多说,上代码:
//
// 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】得到当前年、月、周的第一天和最后一天的更多相关文章
- js 计算月/周的第一天和最后一天
因为项目开发中遇到需要向后台传本周的开始和结束时间,以及上一周的起止时间,就琢磨了半天,总算写出来一套,写篇文章是为了方便自己记忆,也是分享给需要的人,水平有限,写的不好请见谅: getDateStr ...
- C#获取周的第一天、最后一天、月第一天和最后一天
[csharp] view plaincopyprint? public class DateTimeTool { /// <summary> /// 获取指定日期所在周的第一天,星期天为 ...
- c# 获取某日期所在周的第一天和最后一天
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace WyfC ...
- 【转载】对C#DateTime的一些扩展,计算周内第一天,最后一天
/// <summary> /// DateTime的一些扩展 /// </summary> public class DateTime2 { /// <summary& ...
- c# 获取某日期所在周的第一天和最后一天(转)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace WyfC ...
- 用js获取周、月第一天和最后一天(转载)
var getCurrentWeek = function (day) { var days = ["周日", "周一", "周二", &q ...
- C# DateTime 月第一天和最后一天 取法
取得某月和上个月第一天和最后一天的方法 /// <summary> /// 取得某月的第一天 /// </summary> /// <param name="d ...
- 在oracle里,如何取得本周、本月、本季度、本年度的第一天和最后一天的时间
在oracle里,如何取得本周.本月.本季度.本年度的第一天和最后一天的时间 --本周 select trunc(sysdate,'d')+1 from dual; select trunc(sysd ...
- java获取当月的第一天和最后一天,获取本周的第一天和最后一天
/** * 获取指定日期所在周的第一天和最后一天,用下划线连接 * @param dataStr * @return * @throws ParseException */ public static ...
随机推荐
- 一篇文章让你马上入门Hibernate
在前面我们学完了Struts2,接下来我们就要去学习第二个框架Hibernate. 那什么是Hibernate? Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对 ...
- Oracle 12c Adoption Discussion — Summary
Morning (@9:30) Oracle 12c Overview & Features for Developers Oracle Database In-Memory Deep Div ...
- 跟我学SpringCloud | 第十六篇:微服务利剑之APM平台(二)Pinpoint
目录 SpringCloud系列教程 | 第十六篇:微服务利剑之APM平台(二)Pinpoint 1. Pinpoint概述 2. Pinpoint主要特性 3. Pinpoint优势 4. Pinp ...
- ionic App 解决android端在真机上 tab处于顶部的Bug
在app.js 页面中添加以下代码 .config(function($stateProvider, $urlRouterProvider,$ionicConfigProvider) { $ionic ...
- Mac系统中idea配置git总结
系统配置git相关文章,网上有很多,这里只总结我所遇到的问题 配置git相关信息命令: vim ~/.gitconfig 然后就可以配置相关信息,git配置文件详解请参考以下网址: https://b ...
- 约瑟夫环问题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
首先,我最大的学习来源不是百度而是我群友~~在这里表白一波我热爱学习的群友们!然后今天群里突然有人提出了题目的这个问题:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出 ...
- spring-cloud-kubernetes的服务发现和轮询实战(含熔断)
本文是<spring-cloud-kubernetes实战系列>的第四篇,主要内容是在kubernetes上部署两个应用:Web-Service和Account-Service,通过spr ...
- MyBatis_Generator (MBG)逆向工程的四种方式
mybatis是目前很流行的持久层框架,其逆向工程更是大大缩减了我们的开发时间.有兴趣的可以看文档. 文档地址: http://www.mybatis.org/generator/index.html ...
- 生产环境中Redis的key的设计
问题:如果我们需要将MySql表的数据存储到Redis中该如何存储? 例如:有t_user表 id username email 11 leo leo@163.com 22 laymans ...
- Bluetooth(蓝牙)连接过程分析
一 基本概念 蓝牙的连接过程是十分重要的,特别是做蓝牙的技术人员来说,这个是十分重要的.理它的流程,是一件必修课.虽然进入蓝牙行业很久了,以前没怎么系统化的做一些事情,趁此机会,就梳理一下这里面的内容 ...