//

//  NVDate.h

//

//  Created by Noval Agung Prayogo on 2/5/14.

//  Copyright (c) 2014 Noval Agung Prayogo. All rights reserved.

//

#import <Foundation/Foundation.h>

typedef NS_OPTIONS(NSUInteger, NVDayUnit) {

NVDayUnitSunday    = 1,

NVDayUnitMonday    = 2,

NVDayUnitTuesday   = 3,

NVDayUnitWednesday = 4,

NVDayUnitThursday  = 5,

NVDayUnitFriday    = 6,

NVDayUnitSaturday  = 7

};

typedef NS_OPTIONS(NSUInteger, NVMonthUnit) {

NVMonthUnitJanuary   = 1,

NVMonthUnitFebruary  = 2,

NVMonthUnitMarch     = 3,

NVMonthUnitApril     = 4,

NVMonthUnitMay       = 5,

NVMonthUnitJune      = 6,

NVMonthUnitJuly      = 7,

NVMonthUnitAugust    = 8,

NVMonthUnitSeptember = 9,

NVMonthUnitOctober   = 10,

NVMonthUnitNovember  = 11,

NVMonthUnitDecember  = 12,

};

@interface NVDate : NSObject

- (id)initUsingToday;

- (id)initUsingDate:(NSDate *)date;

- (id)initUsingYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day;

- (id)initUsingYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute second:(NSInteger)second;

- (id)initUsingString:(NSString *)stringDate;

- (id)initUsingString:(NSString *)stringDate withFormat:(NSString *)dateFormat;

- (id)initUsingSeconds:(NSInteger)seconds;

- (NSDate *)date;

- (NSString *)stringValue;

- (NSString *)stringValueWithFormat:(NSString *)dateFormat;

- (void)zeroTime;

- (instancetype)previousDay;

- (instancetype)previousDays:(NSInteger)days;

- (instancetype)nextDay;

- (instancetype)nextDays:(NSInteger)days;

- (instancetype)previousWeek;

- (instancetype)previousWeeks:(NSInteger)weeks;

- (instancetype)nextWeek;

- (instancetype)nextWeeks:(NSInteger)weeks;

- (instancetype)previousMonth;

- (instancetype)previousMonths:(NSInteger)months;

- (instancetype)nextMonth;

- (instancetype)nextMonths:(NSInteger)months;

- (instancetype)previousYear;

- (instancetype)previousYears:(NSInteger)years;

- (instancetype)nextYear;

- (instancetype)nextYears:(NSInteger)years;

- (instancetype)firstDayOfMonth;

- (instancetype)lastDayOfMonth;

- (instancetype)firstMonthOfYear;

- (instancetype)lastMonthOfYear;

- (instancetype)previousDayOfDayName:(NVDayUnit)dayUnit;

- (instancetype)nextDayOfDayName:(NVDayUnit)dayUnit;

- (BOOL)isCurrentDayName:(NVDayUnit)dayUnit;

- (BOOL)isCurrentMonthName:(NVMonthUnit)monthUnit;

@property NSString *dateFormatUsingString;

@property NSDateFormatterStyle dateFormatUsingStyle;

@property NSDateFormatterStyle timeFormatUsingStyle;

@property NSInteger year;

@property NSInteger month;

@property (readonly) NSInteger week;

@property NSInteger day;

@property NSInteger hour;

@property NSInteger minute;

@property NSInteger second;

@end

//

//  NVDate.m

//

//  Created by Noval Agung Prayogo on 2/5/14.

//  Copyright (c) 2014 Noval Agung Prayogo. All rights reserved.

//

#import "NVDate.h"

@implementation NVDate {

NSDateFormatter *_dateFormatter;

NSCalendar *_calendar;

NSDate *_date;

NSCalendarUnit _dateTimeCalendarUnit;

}

- (id)init {

if (self = [super init]) {

_dateFormatter = [[NSDateFormatter alloc] init];

_dateFormatter.dateStyle = NSDateFormatterFullStyle;

_dateFormatter.timeStyle = NSDateFormatterFullStyle;

_calendar = [NSCalendar currentCalendar];

_date = [[NSDate alloc] init];

_dateTimeCalendarUnit = (NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit);

}

returnself;

}

- (id)initUsingToday {

if (self = [self init]) {

_date = [NSDate date];

}

returnself;

}

- (id)initUsingString:(NSString *)stringDate {

if (self = [self init]) {

_date = [_dateFormatter dateFromString:stringDate];

}

returnself;

}

- (id)initUsingString:(NSString *)stringDate withFormat:(NSString *)dateFormat {

if (self = [self init]) {

_dateFormatter.dateFormat = dateFormat;

_date = [_dateFormatter dateFromString:stringDate];

}

returnself;

}

- (id)initUsingYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day {

if (self = [self init]) {

NSDateComponents *dateComponents = [[NSDateComponents alloc] init];

dateComponents.year = year;

dateComponents.month = month;

dateComponents.day = day;

_date = [_calendar dateFromComponents:dateComponents];

}

returnself;

}

- (id)initUsingYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute second:(NSInteger)second {

if (self = [self init]) {

NSDateComponents *dateComponents = [[NSDateComponents alloc] init];

dateComponents.year = year;

dateComponents.month = month;

dateComponents.day = day;

dateComponents.hour = hour;

dateComponents.minute = minute;

dateComponents.second = second;

_date = [_calendar dateFromComponents:dateComponents];

}

returnself;

}

- (id)initUsingDate:(NSDate *)date {

if (self = [self init]) {

_date = date;

}

returnself;

}

- (id)initUsingSeconds:(NSInteger)seconds {

if (self = [self init]) {

_date = [NSDate dateWithTimeIntervalSinceReferenceDate:seconds];

}

returnself;

}

- (NSDate *)date {

return _date;

}

- (NSString *)stringValue {

return [_dateFormatter stringFromDate:_date];

}

- (NSString *)stringValueWithFormat:(NSString *)dateFormat {

NSDateFormatter *localDateFormatter = [_dateFormatter copy];

localDateFormatter.dateFormat = dateFormat;

return [localDateFormatter stringFromDate:_date];

}

- (void)zeroTime {

NSDateComponents *dateComponents = [_calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:_date];

dateComponents.hour = 0;

dateComponents.minute = 0;

dateComponents.second = 0;

_date = [_calendar dateFromComponents:dateComponents];

}

- (void)setDateFormatUsingString:(NSString *)dateFormatUsingString {

_dateFormatter.dateFormat = dateFormatUsingString;

}

- (NSString *)dateFormatUsingString {

return _dateFormatter.dateFormat;

}

- (void)setDateFormatUsingStyle:(NSDateFormatterStyle)dateFormatUsingStyle {

_dateFormatter.dateStyle = dateFormatUsingStyle;

}

- (NSDateFormatterStyle)dateFormatUsingStyle {

return _dateFormatter.dateStyle;

}

- (void)setTimeFormatUsingStyle:(NSDateFormatterStyle)timeFormatUsingStyle {

_dateFormatter.timeStyle = timeFormatUsingStyle;

}

- (NSDateFormatterStyle)timeFormatUsingStyle {

return _dateFormatter.timeStyle;

}

- (instancetype)daysCalculate:(NSInteger)days isForward:(BOOL)isForward {

NSDateComponents *dateComponents = [[NSDateComponents alloc] init];

dateComponents.day = days * (isForward ? 1 : -1);

_date = [_calendar dateByAddingComponents:dateComponents toDate:_date options:0];

returnself;

}

- (instancetype)previousDay {

return [self previousDays:1];

}

- (instancetype)previousDays:(NSInteger)days {

return [self daysCalculate:days isForward:NO];

}

- (instancetype)nextDay {

return [self nextDays:1];

}

- (instancetype)nextDays:(NSInteger)days {

return [self daysCalculate:days isForward:YES];

}

- (instancetype)weeksCalculate:(NSInteger)weeks isForward:(BOOL)isForward {

NSDateComponents *dateComponents = [[NSDateComponents alloc] init];

dateComponents.day = (7 * weeks) * (isForward ? 1 : -1);

_date = [_calendar dateByAddingComponents:dateComponents toDate:_date options:0];

returnself;

}

- (instancetype)previousWeek {

return [self previousWeeks:1];

}

- (instancetype)previousWeeks:(NSInteger)weeks {

return [self weeksCalculate:weeks isForward:NO];

}

- (instancetype)nextWeek {

return [self nextWeeks:1];

}

- (instancetype)nextWeeks:(NSInteger)weeks {

return [self weeksCalculate:weeks isForward:YES];

}

- (instancetype)monthsCalculate:(NSInteger)months isForward:(BOOL)isForward {

NSDateComponents *dateComponents = [[NSDateComponents alloc] init];

dateComponents.month = months * (isForward ? 1 : -1);

_date = [_calendar dateByAddingComponents:dateComponents toDate:_date options:0];

returnself;

}

- (instancetype)previousMonth {

return [self previousMonths:1];

}

- (instancetype)previousMonths:(NSInteger)months {

return [self monthsCalculate:months isForward:NO];

}

- (instancetype)nextMonth {

return [self nextMonths:1];

}

- (instancetype)nextMonths:(NSInteger)months {

return [self monthsCalculate:months isForward:YES];

}

- (instancetype)yearsCalculate:(NSInteger)years isForward:(BOOL)isForward {

NSDateComponents *dateComponents = [[NSDateComponents alloc] init];

dateComponents.year = years * (isForward ? 1 : -1);

_date = [_calendar dateByAddingComponents:dateComponents toDate:_date options:0];

returnself;

}

- (instancetype)previousYear {

return [self previousYears:1];

}

- (instancetype)previousYears:(NSInteger)years {

return [self yearsCalculate:years isForward:NO];

}

- (instancetype)nextYear {

return [self nextYears:1];

}

- (instancetype)nextYears:(NSInteger)years {

return [self yearsCalculate:years isForward:YES];

}

- (instancetype)firstDayOfMonth {

NSDateComponents *dateComponents = [_calendar components:_dateTimeCalendarUnit fromDate:_date];

dateComponents.day = 1;

_date = [_calendar dateFromComponents:dateComponents];

returnself;

}

- (instancetype)lastDayOfMonth {

NSDateComponents *dateComponents;

NSDate *date;

dateComponents = [_calendar components:_dateTimeCalendarUnit fromDate:_date];

dateComponents.day = 1;

date = [_calendar dateFromComponents:dateComponents];

dateComponents = [[NSDateComponents alloc] init];

dateComponents.month = 1;

date = [_calendar dateByAddingComponents:dateComponents toDate:date options:0];

dateComponents = [[NSDateComponents alloc] init];

dateComponents.day = -1;

_date = [_calendar dateByAddingComponents:dateComponents toDate:date options:0];

returnself;

}

- (instancetype)firstMonthOfYear {

NSDateComponents *dateComponents = [_calendar components:_dateTimeCalendarUnit fromDate:_date];

dateComponents.month = NVMonthUnitJanuary;

_date = [_calendar dateFromComponents:dateComponents];

returnself;

}

- (instancetype)lastMonthOfYear {

NSDateComponents *dateComponents = [_calendar components:_dateTimeCalendarUnit fromDate:_date];

dateComponents.month = NVMonthUnitDecember;

_date = [_calendar dateFromComponents:dateComponents];

returnself;

}

- (instancetype)previousDayOfDayName:(NVDayUnit)dayUnit {

int currentWeekDay = [_calendar components:_dateTimeCalendarUnit fromDate:_date].weekday;

if (currentWeekDay == dayUnit)

return [self previousWeek];

NSDateComponents *dateComponents = [[NSDateComponents alloc] init];

if (currentWeekDay > dayUnit)

dateComponents.day = -(currentWeekDay - dayUnit);

else

dateComponents.day = -currentWeekDay - (7 - dayUnit);

_date = [_calendar dateByAddingComponents:dateComponents toDate:_date options:0];

returnself;

}

- (instancetype)nextDayOfDayName:(NVDayUnit)dayUnit {

int currentWeekDay = [_calendar components:_dateTimeCalendarUnit fromDate:_date].weekday;

if (currentWeekDay == dayUnit)

return [self nextWeek];

NSDateComponents *dateComponents = [[NSDateComponents alloc] init];

if (currentWeekDay < dayUnit)

dateComponents.day = dayUnit - currentWeekDay;

else

dateComponents.day = -currentWeekDay + dayUnit;

_date = [_calendar dateByAddingComponents:dateComponents toDate:_date options:0];

returnself;

}

- (BOOL)isCurrentDayName:(NVDayUnit)dayUnit {

return ([_calendar components:_dateTimeCalendarUnit fromDate:_date].weekday == dayUnit);

}

- (BOOL)isCurrentMonthName:(NVMonthUnit)monthUnit {

return ([_calendar components:_dateTimeCalendarUnit fromDate:_date].month == monthUnit);

}

- (NSInteger)year {

return [_calendar components:_dateTimeCalendarUnit fromDate:_date].year;

}

- (void)setYear:(NSInteger)year {

NSDateComponents *components = [_calendar components:_dateTimeCalendarUnit fromDate:_date];

components.year = year;

_date = [_calendar dateFromComponents:components];

}

- (NSInteger)month {

return [_calendar components:_dateTimeCalendarUnit fromDate:_date].month;

}

- (void)setMonth:(NSInteger)month {

NSDateComponents *components = [_calendar components:_dateTimeCalendarUnit fromDate:_date];

components.month = month;

_date = [_calendar dateFromComponents:components];

}

- (NSInteger)week {

return [_calendar components:_dateTimeCalendarUnit fromDate:_date].week;

}

- (NSInteger)day {

return [_calendar components:_dateTimeCalendarUnit fromDate:_date].day;

}

- (void)setDay:(NSInteger)day {

NSDateComponents *components = [_calendar components:_dateTimeCalendarUnit fromDate:_date];

components.day = day;

_date = [_calendar dateFromComponents:components];

}

- (NSInteger)hour {

return [_calendar components:_dateTimeCalendarUnit fromDate:_date].hour;

}

- (void)setHour:(NSInteger)hour {

NSDateComponents *components = [_calendar components:_dateTimeCalendarUnit fromDate:_date];

components.hour = hour;

_date = [_calendar dateFromComponents:components];

}

- (NSInteger)minute {

return [_calendar components:_dateTimeCalendarUnit fromDate:_date].minute;

}

- (void)setMinute:(NSInteger)minute {

NSDateComponents *components = [_calendar components:_dateTimeCalendarUnit fromDate:_date];

components.minute = minute;

_date = [_calendar dateFromComponents:components];

}

- (NSInteger)second {

return [_calendar components:_dateTimeCalendarUnit fromDate:_date].second;

}

- (void)setSecond:(NSInteger)second {

NSDateComponents *components = [_calendar components:_dateTimeCalendarUnit fromDate:_date];

components.second = second;

_date = [_calendar dateFromComponents:components];

}

@end

Nsdate的各种常用操作的更多相关文章

  1. 【三】用Markdown写blog的常用操作

    本系列有五篇:分别是 [一]Ubuntu14.04+Jekyll+Github Pages搭建静态博客:主要是安装方面 [二]jekyll 的使用 :主要是jekyll的配置 [三]Markdown+ ...

  2. php模拟数据库常用操作效果

    test.php <?php header("Content-type:text/html;charset='utf8'"); error_reporting(E_ALL); ...

  3. Mac OS X常用操作入门指南

    前两天入手一个Macbook air,在装软件过程中摸索了一些基本操作,现就常用操作进行总结, 1关于触控板: 按下(不区分左右)            =鼠标左键 control+按下        ...

  4. mysql常用操作语句

    mysql常用操作语句 1.mysql -u root -p   2.mysql -h localhost -u root -p database_name 2.列出数据库: 1.show datab ...

  5. nodejs配置及cmd常用操作

    一.cmd常用操作 1.返回根目录cd\ 2.返回上层目录cd .. 3.查找当前目录下的所有文件dir 4.查找下层目录cd window 二.nodejs配置 Node.js安装包及源码下载地址为 ...

  6. Oracle常用操作——创建表空间、临时表空间、创建表分区、创建索引、锁表处理

    摘要:Oracle数据库的库表常用操作:创建与添加表空间.临时表空间.创建表分区.创建索引.锁表处理 1.表空间 ■  详细查看表空间使用状况,包括总大小,使用空间,使用率,剩余空间 --详细查看表空 ...

  7. python 异常处理、文件常用操作

    异常处理 http://www.jb51.net/article/95033.htm 文件常用操作 http://www.jb51.net/article/92946.htm

  8. byte数据的常用操作函数[转发]

    /// <summary> /// 本类提供了对byte数据的常用操作函数 /// </summary> public class ByteUtil { ','A','B',' ...

  9. Linux Shell数组常用操作详解

    Linux Shell数组常用操作详解 1数组定义: declare -a 数组名 数组名=(元素1 元素2 元素3 ) declare -a array array=( ) 数组用小括号括起,数组元 ...

随机推荐

  1. Android sqlite3工具的使用

    sqlite3 <数据库名称> 进入数据库操作模式 eg: sqlite3 contacts.db .tables 查看所有的表 eg: .table .schema 查看查看库中所有表的 ...

  2. Delphi For Android 开发笔记 1 - 开发工具介绍

    在开始前,推荐喜欢delphi或者pascal的朋友,如果想将原来Windows的软件工程移植到Android,可使用CodeTyphon+Delphi XE7进行开发. 1.CodeTyphon C ...

  3. C#和.NET版本

    1999年,就听说微软公司在研发一种名为“cool”的新开发语言,而具体内幕一直是个谜,直到2000年6月26日微软在奥兰多举行的“职业开发人员技术大会”(PDC 2000)上,这个谜底终于揭晓了,这 ...

  4. STM32F4_USART配置及细节描述

    Ⅰ.概述 关于USART串口通信,可以说是MCU的标配.不管是在实际项目应用中,还是在开发过程中,它都起着很重要的作用. 在项目应用中我们常常使用UART串口进行通信,根据通信的距离及稳定性,还选择添 ...

  5. 第六章 管理类型(In .net4.5) 之 创建类型

    1. 概述 本章内容包括 C#5中如何更好的创建类型以及如何扩展现有类型. 2. 主要内容 2.1 如何选择类型 C#类型系统包括三种类型:值类型.引用类型.指针类型.(指针类型用于非托管代码,很少使 ...

  6. Java入门到精通——调错篇之解决MyEclipse 输入注册码后:Enter or update your subscription information.问题

    这几天,我用MyEclipse做例子的时候总是出现下面图上面的提示: 不用看就是注册码到期了要注册.找了好几个注册码总是出现Enter or update your subscription info ...

  7. 使用 libevent 和 libev 提高网络应用性能——I/O模型演进变化史

    构建现代的服务器应用程序需要以某种方法同时接收数百.数千甚至数万个事件,无论它们是内部请求还是网络连接,都要有效地处理它们的操作. 有许多解决方案,但事件驱动也被广泛应用到网络编程中.并大规模部署在高 ...

  8. ios中三种多线程的技术对比

    1.NSThread 使用较少 在NSThread调用的方法中,同样要使用autoreleasepool进行内存管理,否则容易出现内存泄露. 使用流程:创建线程-->启动线程 2.NSOpera ...

  9. Golang与MySQL

    1. 在golib下载go-sql-driver/mysql go get github.com/go-sql-driver/mysql 2. 代码引入 import ( "database ...

  10. 28.USB的传输类型

    USB上必须将数据组织成 事务 才能够进行传输.事务常有两个或三个包.令牌包用于启动一个事务,由主机发送:数据包传送数据,方向由令牌包确定:握手包常是数据接收方发送的,用于表示接收数据的状态.USB协 ...