This commit is contained in:
Adam Kirk
2012-08-13 19:56:03 -06:00
parent ec2385ba97
commit 847b2dd74a
9 changed files with 1791 additions and 42 deletions

22
LICENSE Normal file
View File

@@ -0,0 +1,22 @@
Copyright (c) 2012, Mysterious Trousers
All rights reserved.
Redistribution and use in source and binary forms, with or without modification
, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

10
MTDates.podspec Normal file
View File

@@ -0,0 +1,10 @@
Pod::Spec.new do |s|
s.name = "MTDates"
s.version = "0.0.1"
s.summary = "A category on NSDate that'll make all your dreams come true."
s.homepage = "https://github.com/mysterioustrousers/MTDates"
s.license = 'BSD '
s.author = { "Adam Kirk" => "atomkirk@gmail.com" }
s.source = { :git => "https://github.com/mysterioustrousers/MTDates.git", :tag => "0.0.1" }
s.source_files = 'MTDates/*.{h,m}'
end

View File

@@ -8,14 +8,14 @@
/* Begin PBXBuildFile section */
C2ABA6EF15D48E93000A34A1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C2ABA6EE15D48E93000A34A1 /* Foundation.framework */; };
C2ABA6F415D48E93000A34A1 /* MTDates.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C2ABA6F315D48E93000A34A1 /* MTDates.h */; };
C2ABA6F615D48E93000A34A1 /* MTDates.m in Sources */ = {isa = PBXBuildFile; fileRef = C2ABA6F515D48E93000A34A1 /* MTDates.m */; };
C2ABA6FE15D48E93000A34A1 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C2ABA6FD15D48E93000A34A1 /* SenTestingKit.framework */; };
C2ABA70015D48E93000A34A1 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C2ABA6FF15D48E93000A34A1 /* UIKit.framework */; };
C2ABA70115D48E93000A34A1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C2ABA6EE15D48E93000A34A1 /* Foundation.framework */; };
C2ABA70415D48E93000A34A1 /* libMTDates.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C2ABA6EB15D48E92000A34A1 /* libMTDates.a */; };
C2ABA70A15D48E93000A34A1 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = C2ABA70815D48E93000A34A1 /* InfoPlist.strings */; };
C2ABA70D15D48E93000A34A1 /* MTDatesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C2ABA70C15D48E93000A34A1 /* MTDatesTests.m */; };
C2ABA72415D490B4000A34A1 /* NSDate+MTDates.m in Sources */ = {isa = PBXBuildFile; fileRef = C2ABA72315D490B4000A34A1 /* NSDate+MTDates.m */; };
C2ABA72515D490B4000A34A1 /* NSDate+MTDates.m in Sources */ = {isa = PBXBuildFile; fileRef = C2ABA72315D490B4000A34A1 /* NSDate+MTDates.m */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -35,7 +35,6 @@
dstPath = "include/${PRODUCT_NAME}";
dstSubfolderSpec = 16;
files = (
C2ABA6F415D48E93000A34A1 /* MTDates.h in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -45,8 +44,6 @@
C2ABA6EB15D48E92000A34A1 /* libMTDates.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMTDates.a; sourceTree = BUILT_PRODUCTS_DIR; };
C2ABA6EE15D48E93000A34A1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
C2ABA6F215D48E93000A34A1 /* MTDates-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MTDates-Prefix.pch"; sourceTree = "<group>"; };
C2ABA6F315D48E93000A34A1 /* MTDates.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTDates.h; sourceTree = "<group>"; };
C2ABA6F515D48E93000A34A1 /* MTDates.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTDates.m; sourceTree = "<group>"; };
C2ABA6FC15D48E93000A34A1 /* MTDatesTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MTDatesTests.octest; sourceTree = BUILT_PRODUCTS_DIR; };
C2ABA6FD15D48E93000A34A1 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; };
C2ABA6FF15D48E93000A34A1 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
@@ -54,6 +51,8 @@
C2ABA70915D48E93000A34A1 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
C2ABA70B15D48E93000A34A1 /* MTDatesTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTDatesTests.h; sourceTree = "<group>"; };
C2ABA70C15D48E93000A34A1 /* MTDatesTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTDatesTests.m; sourceTree = "<group>"; };
C2ABA72215D490B4000A34A1 /* NSDate+MTDates.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDate+MTDates.h"; sourceTree = "<group>"; };
C2ABA72315D490B4000A34A1 /* NSDate+MTDates.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDate+MTDates.m"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -111,8 +110,8 @@
C2ABA6F015D48E93000A34A1 /* MTDates */ = {
isa = PBXGroup;
children = (
C2ABA6F315D48E93000A34A1 /* MTDates.h */,
C2ABA6F515D48E93000A34A1 /* MTDates.m */,
C2ABA72215D490B4000A34A1 /* NSDate+MTDates.h */,
C2ABA72315D490B4000A34A1 /* NSDate+MTDates.m */,
C2ABA6F115D48E93000A34A1 /* Supporting Files */,
);
path = MTDates;
@@ -243,7 +242,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
C2ABA6F615D48E93000A34A1 /* MTDates.m in Sources */,
C2ABA72415D490B4000A34A1 /* NSDate+MTDates.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -252,6 +251,7 @@
buildActionMask = 2147483647;
files = (
C2ABA70D15D48E93000A34A1 /* MTDatesTests.m in Sources */,
C2ABA72515D490B4000A34A1 /* NSDate+MTDates.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -396,6 +396,7 @@
C2ABA71215D48E93000A34A1 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
C2ABA71315D48E93000A34A1 /* Build configuration list for PBXNativeTarget "MTDatesTests" */ = {
isa = XCConfigurationList;
@@ -404,6 +405,7 @@
C2ABA71515D48E93000A34A1 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};

View File

@@ -1,13 +0,0 @@
//
// MTDates.h
// MTDates
//
// Created by Adam Kirk on 8/9/12.
// Copyright (c) 2012 Mysterious Trousers. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface MTDates : NSObject
@end

View File

@@ -1,13 +0,0 @@
//
// MTDates.m
// MTDates
//
// Created by Adam Kirk on 8/9/12.
// Copyright (c) 2012 Mysterious Trousers. All rights reserved.
//
#import "MTDates.h"
@implementation MTDates
@end

204
MTDates/NSDate+MTDates.h Executable file
View File

@@ -0,0 +1,204 @@
//
// NSDate+Utilities.h
// calvetica
//
// Created by Adam Kirk on 4/21/11.
// Copyright 2011 Mysterious Trousers, LLC. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface NSDate (MTDates)
# pragma mark - GLOBAL CONFIG
+ (void)setLocale:(NSLocale *)locale;
+ (void)setTimeZone:(NSTimeZone *)timeZone;
#pragma mark - CONSTRUCTORS
+ (NSDate *)dateFromISOString:(NSString *)ISOString;
+ (NSDate *)dateFromYear:(NSUInteger)year month:(NSUInteger)month day:(NSUInteger)day;
+ (NSDate *)dateFromYear:(NSUInteger)year month:(NSUInteger)month day:(NSUInteger)day hour:(NSUInteger)hour minute:(NSUInteger)minute;
+ (NSDate *)dateFromYear:(NSUInteger)year month:(NSUInteger)month day:(NSUInteger)day hour:(NSUInteger)hour minute:(NSUInteger)minute second:(NSUInteger)second;
+ (NSDate *)dateFromYear:(NSUInteger)year week:(NSUInteger)week weekDay:(NSUInteger)weekDay;
+ (NSDate *)dateFromYear:(NSUInteger)year week:(NSUInteger)week weekDay:(NSUInteger)weekDay hour:(NSUInteger)hour minute:(NSUInteger)minute;
+ (NSDate *)dateFromYear:(NSUInteger)year week:(NSUInteger)week weekDay:(NSUInteger)weekDay hour:(NSUInteger)hour minute:(NSUInteger)minute second:(NSUInteger)second;
- (NSDate *)dateByAddingYears:(NSInteger)years months:(NSInteger)months weeks:(NSInteger)weeks days:(NSInteger)days hours:(NSInteger)hours minutes:(NSInteger)minutes seconds:(NSInteger)seconds;
#pragma mark - SYMBOLS
+ (NSArray *)shortWeekdaySymbols;
+ (NSArray *)weekdaySymbols;
+ (NSArray *)veryShortWeekdaySymbols;
+ (NSArray *)shortMonthlySymbols;
+ (NSArray *)monthlySymbols;
+ (NSArray *)veryShortMonthlySymbols;
#pragma mark - COMPONENTS
- (NSUInteger)year;
- (NSUInteger)weekOfYear;
- (NSUInteger)weekDayOfWeek;
- (NSUInteger)monthOfYear;
- (NSUInteger)dayOfMonth;
- (NSUInteger)hourOfDay;
- (NSUInteger)hourOfDayNonMilitary;
- (NSUInteger)minuteOfHour;
- (NSUInteger)secondOfMinute;
- (NSTimeInterval)secondsIntoDay;
#pragma mark - RELATIVES
#pragma mark years
- (NSDate *)startOfPreviousYear;
- (NSDate *)startOfCurrentYear;
- (NSDate *)startOfNextYear;
- (NSDate *)endOfPreviousYear;
- (NSDate *)endOfCurrentYear;
- (NSDate *)endOfNextYear;
- (NSDate *)oneYearPrevious;
- (NSDate *)oneYearNext;
- (NSDate *)dateYearsBefore:(NSUInteger)years;
- (NSDate *)dateYearsAfter:(NSUInteger)years;
- (NSInteger)yearsSinceDate:(NSDate *)date;
#pragma mark months
- (NSDate *)startOfPreviousMonth;
- (NSDate *)startOfCurrentMonth;
- (NSDate *)startOfNextMonth;
- (NSDate *)endOfPreviousMonth;
- (NSDate *)endOfCurrentMonth;
- (NSDate *)endOfNextMonth;
- (NSDate *)oneMonthPrevious;
- (NSDate *)oneMonthNext;
- (NSDate *)dateMonthsBefore:(NSUInteger)months;
- (NSDate *)dateMonthsAfter:(NSUInteger)months;
- (NSInteger)monthsSinceDate:(NSDate *)date;
#pragma mark weeks
- (NSDate *)startOfPreviousWeek;
- (NSDate *)startOfCurrentWeek;
- (NSDate *)startOfNextWeek;
- (NSDate *)endOfPreviousWeek;
- (NSDate *)endOfCurrentWeek;
- (NSDate *)endOfNextWeek;
- (NSDate *)oneWeekPrevious;
- (NSDate *)oneWeekNext;
- (NSDate *)dateWeeksBefore:(NSUInteger)weeks;
- (NSDate *)dateWeeksAfter:(NSUInteger)weeks;
- (NSInteger)weeksSinceDate:(NSDate *)date;
#pragma mark days
- (NSDate *)startOfPreviousDay;
- (NSDate *)startOfCurrentDay;
- (NSDate *)startOfNextDay;
- (NSDate *)endOfPreviousDay;
- (NSDate *)endOfCurrentDay;
- (NSDate *)endOfNextDay;
- (NSDate *)oneDayPrevious;
- (NSDate *)oneDayNext;
- (NSDate *)dateDaysBefore:(NSUInteger)days;
- (NSDate *)dateDaysAfter:(NSUInteger)days;
- (NSInteger)daysSinceDate:(NSDate *)date;
#pragma mark hours
- (NSDate *)startOfPreviousHour;
- (NSDate *)startOfCurrentHour;
- (NSDate *)startOfNextHour;
- (NSDate *)endOfPreviousHour;
- (NSDate *)endOfCurrentHour;
- (NSDate *)endOfNextHour;
- (NSDate *)oneHourPrevious;
- (NSDate *)oneHourNext;
- (NSDate *)dateHoursBefore:(NSUInteger)hours;
- (NSDate *)dateHoursAfter:(NSUInteger)hours;
- (NSInteger)hoursSinceDate:(NSDate *)date;
#pragma mark - COMPARES
- (BOOL)isAfter:(NSDate *)date;
- (BOOL)isBefore:(NSDate *)date;
- (BOOL)isOnOrAfter:(NSDate *)date;
- (BOOL)isOnOrBefore:(NSDate *)date;
- (BOOL)isWithinSameMonth:(NSDate *)date;
- (BOOL)isWithinSameWeek:(NSDate *)date;
- (BOOL)isWithinSameDay:(NSDate *)date;
- (BOOL)isWithinSameHour:(NSDate *)date;
#pragma mark - STRINGS
- (NSString *)stringFromDatesShortMonth;
- (NSString *)stringFromDatesFullMonth;
- (NSString *)stringFromDateWithFormat:(NSString *)format; // http://unicode.org/reports/tr35/tr35-10.html#Date_Format_Patterns
- (NSString *)stringFromDateWithISODateTime;
- (NSString *)stringFromDateWithGreatestComponentsForSecondsPassed:(NSTimeInterval)interval;
#pragma mark - MISC
+ (NSUInteger)convertHour:(NSUInteger)hour toMilitaryFromAM:(BOOL)isAM;
+ (NSArray *)datesCollectionFromDate:(NSDate *)startDate untilDate:(NSDate *)endDate;
- (NSArray *)hoursInCurrentDayAsDatesCollection;
- (BOOL)isInAM;
- (BOOL)isStartOfAnHour;
- (NSUInteger)weekdayStartOfCurrentMonth;
- (NSUInteger)daysInCurrentMonth;
- (NSUInteger)daysInPreviousMonth;
- (NSUInteger)daysInNextMonth;
@end

856
MTDates/NSDate+MTDates.m Executable file
View File

@@ -0,0 +1,856 @@
//
// NSDate+Utilities.m
// calvetica
//
// Created by Adam Kirk on 4/21/11.
// Copyright 2011 Mysterious Trousers, LLC. All rights reserved.
//
#import "NSDate+MTDates.h"
#define SECONDS_IN_MINUTE 60
#define MINUTES_IN_HOUR 60
#define DAYS_IN_WEEK 7
#define SECONDS_IN_HOUR (SECONDS_IN_MINUTE * MINUTES_IN_HOUR)
#define HOURS_IN_DAY 24
#define SECONDS_IN_DAY (HOURS_IN_DAY * SECONDS_IN_HOUR)
#define SECONDS_IN_WEEK (DAYS_IN_WEEK * SECONDS_IN_DAY)
#define SECONDS_IN_MONTH (30 * SECONDS_IN_DAY)
@implementation NSDate (MTDates)
// These are NOT thread safe, so we must use a seperate one on each thread
static NSMutableDictionary *_calendars = nil;
static NSMutableDictionary *_components = nil;
static NSMutableDictionary *_formatters = nil;
static NSLocale *_locale = nil;
static NSTimeZone *_timeZone = nil;
#pragma mark - STATIC
+ (NSCalendar *)calendar
{
if (!_calendars) _calendars = [NSMutableDictionary dictionary];
dispatch_queue_t queue = dispatch_get_current_queue();
NSString *queueLabel = [NSString stringWithUTF8String:dispatch_queue_get_label(queue)];
NSCalendar *calendar = [_calendars objectForKey:queueLabel];
if (!calendar) {
calendar = [[NSCalendar currentCalendar] copy];
[_calendars setObject:calendar forKey:queueLabel];
}
return calendar;
}
+ (NSDateComponents *)components
{
if (!_components) _components = [NSMutableDictionary dictionary];
dispatch_queue_t queue = dispatch_get_current_queue();
NSString *queueLabel = [NSString stringWithUTF8String:dispatch_queue_get_label(queue)];
NSDateComponents *component = [_components objectForKey:queueLabel];
if (!component) {
component = [[NSDateComponents alloc] init];
component.calendar = [self calendar];
if (_timeZone) component.timeZone = _timeZone;
[_components setObject:component forKey:queueLabel];
}
[component setEra:NSUndefinedDateComponent];
[component setYear:NSUndefinedDateComponent];
[component setMonth:NSUndefinedDateComponent];
[component setDay:NSUndefinedDateComponent];
[component setHour:NSUndefinedDateComponent];
[component setMinute:NSUndefinedDateComponent];
[component setSecond:NSUndefinedDateComponent];
[component setWeek:NSUndefinedDateComponent];
[component setWeekday:NSUndefinedDateComponent];
[component setWeekdayOrdinal:NSUndefinedDateComponent];
[component setQuarter:NSUndefinedDateComponent];
return component;
}
+ (NSDateFormatter *)formatter
{
if (!_formatters) _formatters = [NSMutableDictionary dictionary];
dispatch_queue_t queue = dispatch_get_current_queue();
NSString *queueLabel = [NSString stringWithUTF8String:dispatch_queue_get_label(queue)];
NSDateFormatter *formatter = [_formatters objectForKey:queueLabel];
if (!formatter) {
formatter = [[NSDateFormatter alloc] init];
formatter.calendar = [self calendar];
if (_locale) formatter.locale = _locale;
if (_timeZone) formatter.timeZone = _timeZone;
[_formatters setObject:formatter forKey:queueLabel];
}
return formatter;
}
+ (void)reset
{
[_calendars removeAllObjects];
[_components removeAllObjects];
[_formatters removeAllObjects];
}
+ (void)setLocale:(NSLocale *)locale {
_locale = locale;
[self reset];
}
+ (void)setTimeZone:(NSTimeZone *)timeZone {
_timeZone = timeZone;
[self reset];
}
#pragma mark - CONSTRUCTORS
+ (NSDate *)dateFromISOString:(NSString *)ISOString
{
if (ISOString == nil || (NSNull *)ISOString == [NSNull null]) return nil;
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
NSDate *result = [formatter dateFromString:ISOString];
return result;
}
+ (NSDate *)dateFromYear:(NSUInteger)year month:(NSUInteger)month day:(NSUInteger)day
{
NSDateComponents *comps = [NSDate components];
[comps setYear:year];
[comps setMonth:month];
[comps setDay:day];
[comps setHour:0];
[comps setMinute:0];
[comps setSecond:0];
return [[NSDate calendar] dateFromComponents:comps];
}
+ (NSDate *)dateFromYear:(NSUInteger)year month:(NSUInteger)month day:(NSUInteger)day hour:(NSUInteger)hour minute:(NSUInteger)minute
{
NSDateComponents *comps = [NSDate components];
[comps setYear:year];
[comps setMonth:month];
[comps setDay:day];
[comps setHour:hour];
[comps setMinute:minute];
[comps setSecond:0];
return [[NSDate calendar] dateFromComponents:comps];//@leaks
}
+ (NSDate *)dateFromYear:(NSUInteger)year month:(NSUInteger)month day:(NSUInteger)day hour:(NSUInteger)hour minute:(NSUInteger)minute second:(NSUInteger)second
{
NSDateComponents *comps = [NSDate components];
[comps setYear:year];
[comps setMonth:month];
[comps setDay:day];
[comps setHour:hour];
[comps setMinute:minute];
[comps setSecond:second];
return [[NSDate calendar] dateFromComponents:comps];
}
+ (NSDate *)dateFromYear:(NSUInteger)year week:(NSUInteger)week weekDay:(NSUInteger)weekDay
{
NSDateComponents *comps = [NSDate components];
[comps setYear:year];
[comps setWeek:week];
[comps setWeekday:weekDay];
[comps setHour:0];
[comps setMinute:0];
[comps setSecond:0];
return [[NSDate calendar] dateFromComponents:comps];
}
+ (NSDate *)dateFromYear:(NSUInteger)year week:(NSUInteger)week weekDay:(NSUInteger)weekDay hour:(NSUInteger)hour minute:(NSUInteger)minute
{
NSDateComponents *comps = [NSDate components];
[comps setYear:year];
[comps setWeek:week];
[comps setWeekday:weekDay];
[comps setHour:hour];
[comps setMinute:minute];
[comps setSecond:0];
return [[NSDate calendar] dateFromComponents:comps];
}
+ (NSDate *)dateFromYear:(NSUInteger)year week:(NSUInteger)week weekDay:(NSUInteger)weekDay hour:(NSUInteger)hour minute:(NSUInteger)minute second:(NSUInteger)second
{
NSDateComponents *comps = [NSDate components];
[comps setYear:year];
[comps setWeek:week];
[comps setWeekday:weekDay];
[comps setHour:hour];
[comps setMinute:minute];
[comps setSecond:second];
return [[NSDate calendar] dateFromComponents:comps];
}
- (NSDate *)dateByAddingYears:(NSInteger)years months:(NSInteger)months weeks:(NSInteger)weeks days:(NSInteger)days hours:(NSInteger)hours minutes:(NSInteger)minutes seconds:(NSInteger)seconds
{
NSDateComponents *comps = [NSDate components];
if (years) [comps setYear:years];
if (months) [comps setMonth:months];
if (weeks) [comps setWeek:weeks];
if (days) [comps setDay:days];
if (hours) [comps setHour:hours];
if (minutes) [comps setMinute:minutes];
if (seconds) [comps setSecond:seconds];
return [[NSDate calendar] dateByAddingComponents:comps toDate:self options:0];
}
#pragma mark - SYMBOLS
+ (NSArray *)shortWeekdaySymbols
{
return [[NSDate formatter] shortWeekdaySymbols];
}
+ (NSArray *)weekdaySymbols
{
return [[NSDate formatter] weekdaySymbols];
}
+ (NSArray *)veryShortWeekdaySymbols
{
return [[NSDate formatter] veryShortWeekdaySymbols];
}
+ (NSArray *)shortMonthlySymbols
{
return [[NSDate formatter] shortMonthSymbols];
}
+ (NSArray *)monthlySymbols
{
return [[NSDate formatter] monthSymbols];
}
+ (NSArray *)veryShortMonthlySymbols
{
return [[NSDate formatter] veryShortMonthSymbols];
}
#pragma mark - COMPONENTS
- (NSUInteger)year
{
NSDateComponents *components = [[NSDate calendar] components:NSYearCalendarUnit fromDate:self];
return [components year];
}
- (NSUInteger)weekOfYear
{
NSDateComponents *comps = [[NSDate calendar] components:NSWeekOfYearCalendarUnit | NSYearCalendarUnit fromDate:self];
return [comps weekOfYear];
}
- (NSUInteger)weekDayOfWeek
{
return [[NSDate calendar] ordinalityOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:self];
}
- (NSUInteger)monthOfYear
{
NSDateComponents *components = [[NSDate calendar] components:NSMonthCalendarUnit fromDate:self];
return [components month];
}
- (NSUInteger)dayOfMonth
{
NSDateComponents *components = [[NSDate calendar] components:NSDayCalendarUnit fromDate:self];
return [components day];
}
- (NSUInteger)hourOfDay
{
NSDateComponents *components = [[NSDate calendar] components:NSHourCalendarUnit fromDate:self];
return [components hour];
}
- (NSUInteger)hourOfDayNonMilitary
{
NSDateComponents *components = [[NSDate calendar] components:NSHourCalendarUnit fromDate:self];
NSInteger hour = [components hour] % 12;
return (hour == 0 ? 12 : hour);
}
- (NSUInteger)minuteOfHour
{
NSDateComponents *components = [[NSDate calendar] components:NSMinuteCalendarUnit fromDate:self];
return [components minute];
}
- (NSUInteger)secondOfMinute
{
NSDateComponents *components = [[NSDate calendar] components:NSSecondCalendarUnit fromDate:self];
return [components second];
}
- (NSTimeInterval)secondsIntoDay
{
return [self timeIntervalSinceDate:[self startOfCurrentDay]];
}
#pragma mark - RELATIVES
#pragma mark years
- (NSDate *)startOfPreviousYear
{
return [[self startOfCurrentYear] oneYearPrevious];
}
- (NSDate *)startOfCurrentYear
{
return [NSDate dateFromYear:[self year] month:1 day:1];
}
- (NSDate *)startOfNextYear
{
return [[self startOfCurrentYear] oneYearNext];
}
- (NSDate *)endOfPreviousYear
{
return [[self endOfCurrentYear] oneYearPrevious];
}
- (NSDate *)endOfCurrentYear
{
return [[self startOfCurrentYear] dateByAddingYears:1 months:0 weeks:0 days:0 hours:0 minutes:0 seconds:-1];
}
- (NSDate *)endOfNextYear
{
return [[self endOfCurrentYear] oneYearNext];
}
- (NSDate *)oneYearPrevious
{
return [self dateByAddingYears:-1 months:0 weeks:0 days:0 hours:0 minutes:0 seconds:0];
}
- (NSDate *)oneYearNext
{
return [self dateByAddingYears:1 months:0 weeks:0 days:0 hours:0 minutes:0 seconds:0];
}
- (NSDate *)dateYearsBefore:(NSUInteger)years
{
return [self dateByAddingYears:-years months:0 weeks:0 days:0 hours:0 minutes:0 seconds:0];
}
- (NSDate *)dateYearsAfter:(NSUInteger)years
{
return [self dateByAddingYears:years months:0 weeks:0 days:0 hours:0 minutes:0 seconds:0];
}
- (NSInteger)yearsSinceDate:(NSDate *)date
{
NSDateComponents *comps = [[NSDate calendar] components:NSYearCalendarUnit fromDate:date toDate:self options:0];
NSInteger years = [comps year];
return years;
}
#pragma mark months
- (NSDate *)startOfPreviousMonth
{
return [[self startOfCurrentMonth] oneMonthPrevious];
}
- (NSDate *)startOfCurrentMonth
{
return [NSDate dateFromYear:[self year] month:[self monthOfYear] day:1];
}
- (NSDate *)startOfNextMonth
{
return [[self startOfCurrentMonth] oneMonthNext];
}
- (NSDate *)endOfPreviousMonth
{
return [[self endOfCurrentMonth] oneMonthPrevious];
}
- (NSDate *)endOfCurrentMonth
{
return [[self startOfCurrentMonth] dateByAddingYears:0 months:1 weeks:0 days:0 hours:0 minutes:0 seconds:-1];
}
- (NSDate *)endOfNextMonth
{
return [[self endOfCurrentMonth] oneMonthNext];
}
- (NSDate *)oneMonthPrevious
{
return [self dateByAddingYears:0 months:-1 weeks:0 days:0 hours:0 minutes:0 seconds:0];
}
- (NSDate *)oneMonthNext
{
return [self dateByAddingYears:0 months:1 weeks:0 days:0 hours:0 minutes:0 seconds:0];
}
- (NSDate *)dateMonthsBefore:(NSUInteger)months
{
return [self dateByAddingYears:0 months:-months weeks:0 days:0 hours:0 minutes:0 seconds:0];
}
- (NSDate *)dateMonthsAfter:(NSUInteger)months
{
return [self dateByAddingYears:0 months:months weeks:0 days:0 hours:0 minutes:0 seconds:0];
}
- (NSInteger)monthsSinceDate:(NSDate *)date
{
NSDateComponents *components = [[NSDate calendar] components:NSMonthCalendarUnit fromDate:date toDate:self options:0];
NSInteger months = [components month];
return months;
}
#pragma mark weeks
- (NSDate *)startOfPreviousWeek
{
return [[self startOfCurrentWeek] oneWeekPrevious];
}
- (NSDate *)startOfCurrentWeek
{
NSInteger weekday = [self weekDayOfWeek];
NSDate *date = [self dateDaysAfter:-(weekday - 1)];
return [NSDate dateFromYear:[date year] month:[date monthOfYear] day:[date dayOfMonth] hour:0 minute:0 second:0];
}
- (NSDate *)startOfNextWeek
{
return [[self startOfCurrentWeek] oneWeekNext];
}
- (NSDate *)endOfPreviousWeek
{
return [[self endOfCurrentWeek] oneWeekPrevious];
}
- (NSDate *)endOfCurrentWeek
{
return [[self startOfCurrentWeek] dateByAddingYears:0 months:0 weeks:1 days:0 hours:0 minutes:0 seconds:-1];
}
- (NSDate *)endOfNextWeek
{
return [[self endOfCurrentWeek] oneWeekNext];
}
- (NSDate *)oneWeekPrevious
{
return [self dateByAddingYears:0 months:0 weeks:-1 days:0 hours:0 minutes:0 seconds:0];
}
- (NSDate *)oneWeekNext
{
return [self dateByAddingYears:0 months:0 weeks:1 days:0 hours:0 minutes:0 seconds:0];
}
- (NSDate *)dateWeeksBefore:(NSUInteger)weeks
{
return [self dateByAddingYears:0 months:0 weeks:-weeks days:0 hours:0 minutes:0 seconds:0];
}
- (NSDate *)dateWeeksAfter:(NSUInteger)weeks
{
return [self dateByAddingYears:0 months:0 weeks:weeks days:0 hours:0 minutes:0 seconds:0];
}
- (NSInteger)weeksSinceDate:(NSDate *)date
{
NSDateComponents *components = [[NSDate calendar] components:NSWeekCalendarUnit fromDate:date toDate:self options:0];
NSInteger weeks = [components week];
return weeks;
}
#pragma mark days
- (NSDate *)startOfPreviousDay
{
return [[self startOfCurrentDay] oneDayPrevious];
}
- (NSDate *)startOfCurrentDay
{
return [NSDate dateFromYear:[self year] month:[self monthOfYear] day:[self dayOfMonth] hour:0 minute:0];
}
- (NSDate *)startOfNextDay
{
return [[self startOfCurrentDay] oneDayNext];
}
- (NSDate *)endOfPreviousDay
{
return [[self endOfCurrentDay] oneDayPrevious];
}
- (NSDate *)endOfCurrentDay
{
return [[self startOfCurrentDay] dateByAddingYears:0 months:0 weeks:0 days:1 hours:0 minutes:0 seconds:-1];
}
- (NSDate *)endOfNextDay
{
return [[self endOfCurrentDay] oneDayNext];
}
- (NSDate *)oneDayPrevious
{
return [self dateByAddingYears:0 months:0 weeks:0 days:-1 hours:0 minutes:0 seconds:0];
}
- (NSDate *)oneDayNext
{
return [self dateByAddingYears:0 months:0 weeks:0 days:1 hours:0 minutes:0 seconds:0];
}
- (NSDate *)dateDaysBefore:(NSUInteger)days
{
return [self dateByAddingYears:0 months:0 weeks:0 days:-days hours:0 minutes:0 seconds:0];
}
- (NSDate *)dateDaysAfter:(NSUInteger)days
{
return [self dateByAddingYears:0 months:0 weeks:0 days:days hours:0 minutes:0 seconds:0];
}
- (NSInteger)daysSinceDate:(NSDate *)date
{
NSDateComponents *comps = [[NSDate calendar] components:NSDayCalendarUnit fromDate:date toDate:self options:0];
NSInteger days = [comps day];
return days;
}
#pragma mark hours
- (NSDate *)startOfPreviousHour
{
return [[self startOfCurrentHour] oneHourPrevious];
}
- (NSDate *)startOfCurrentHour
{
return [NSDate dateFromYear:[self year] month:[self monthOfYear] day:[self dayOfMonth] hour:[self hourOfDay] minute:0];
}
- (NSDate *)startOfNextHour
{
return [[self startOfCurrentHour] oneHourNext];
}
- (NSDate *)endOfPreviousHour
{
return [[self endOfCurrentHour] oneHourPrevious];
}
- (NSDate *)endOfCurrentHour
{
return [[self startOfCurrentHour] dateByAddingYears:0 months:0 weeks:0 days:0 hours:1 minutes:0 seconds:-1];
}
- (NSDate *)endOfNextHour
{
return [[self endOfCurrentHour] oneHourNext];
}
- (NSDate *)oneHourPrevious
{
return [self dateByAddingYears:0 months:0 weeks:0 days:0 hours:-1 minutes:0 seconds:0];
}
- (NSDate *)oneHourNext
{
return [self dateByAddingYears:0 months:0 weeks:0 days:0 hours:1 minutes:0 seconds:0];
}
- (NSDate *)dateHoursBefore:(NSUInteger)hours
{
return [self dateByAddingYears:0 months:0 weeks:0 days:0 hours:-hours minutes:0 seconds:0];
}
- (NSDate *)dateHoursAfter:(NSUInteger)hours
{
return [self dateByAddingYears:0 months:0 weeks:0 days:0 hours:hours minutes:0 seconds:0];
}
- (NSInteger)hoursSinceDate:(NSDate *)date
{
NSDateComponents *comps = [[NSDate calendar] components:NSHourCalendarUnit fromDate:date toDate:self options:0];
NSInteger hours = [comps hour];
return hours;
}
#pragma mark - COMPARES
- (BOOL)isAfter:(NSDate *)date
{
return [self timeIntervalSinceDate:date] > 0 ? YES : NO;
}
- (BOOL)isBefore:(NSDate *)date
{
return [date timeIntervalSinceDate:self] > 0 ? YES : NO;
}
- (BOOL)isOnOrAfter:(NSDate *)date
{
return [self timeIntervalSinceDate:date] >= 0 ? YES : NO;
}
- (BOOL)isOnOrBefore:(NSDate *)date
{
return [date timeIntervalSinceDate:self] >= 0 ? YES : NO;
}
- (BOOL)isWithinSameYear:(NSDate *)date
{
if ([self year] == [date year]) {
return YES;
}
return NO;
}
- (BOOL)isWithinSameMonth:(NSDate *)date
{
if ([self year] == [date year] && [self monthOfYear] == [date monthOfYear]) {
return YES;
}
return NO;
}
- (BOOL)isWithinSameWeek:(NSDate *)date
{
if ([self isOnOrAfter:[date startOfCurrentWeek]] && [self isOnOrBefore:[date endOfCurrentWeek]]) {
return YES;
}
return NO;
}
- (BOOL)isWithinSameDay:(NSDate *)date
{
if ([self year] == [date year] && [self monthOfYear] == [date monthOfYear] && [self dayOfMonth] == [date dayOfMonth]) {
return YES;
}
return NO;
}
- (BOOL)isWithinSameHour:(NSDate *)date
{
if ([self year] == [date year] && [self monthOfYear] == [date monthOfYear] && [self dayOfMonth] == [date dayOfMonth] && [self hourOfDay] == [date hourOfDay]) {
return YES;
}
return NO;
}
#pragma mark - STRINGS
- (NSString *)stringFromDatesShortMonth {
return [self stringFromDateWithFormat:@"MMM"];
}
- (NSString *)stringFromDatesFullMonth {
return [self stringFromDateWithFormat:@"MMMM"];
}
- (NSString *)stringFromDateWithFormat:(NSString *)format {
NSDateFormatter *formatter = [NSDate formatter];
[formatter setDateFormat:format];
return [formatter stringFromDate:self];
}
- (NSString *)stringFromDateWithISODateTime
{
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
NSString* result = [formatter stringFromDate:self];
return result;
}
- (NSString *)stringFromDateWithGreatestComponentsForSecondsPassed:(NSTimeInterval)interval
{
NSMutableString *s = [NSMutableString string];
NSTimeInterval absInterval = interval > 0 ? interval : -interval;
NSInteger months = floor(absInterval / (float)SECONDS_IN_MONTH);
if (months > 0) {
[s appendFormat:@"%d months, ", months];
absInterval -= months * SECONDS_IN_MONTH;
}
NSInteger days = floor(absInterval / (float)SECONDS_IN_DAY);
if (days > 0) {
[s appendFormat:@"%d days, ", days];
absInterval -= days * SECONDS_IN_DAY;
}
NSInteger hours = floor(absInterval / (float)SECONDS_IN_HOUR);
if (hours > 0) {
[s appendFormat:@"%d hours, ", hours];
absInterval -= hours * SECONDS_IN_HOUR;
}
NSInteger minutes = floor(absInterval / (float)SECONDS_IN_MINUTE);
if (minutes > 0) {
[s appendFormat:@"%d minutes, ", minutes];
absInterval -= minutes * SECONDS_IN_MINUTE;
}
NSInteger seconds = absInterval;
if (seconds > 0) {
[s appendFormat:@"%d seconds, ", seconds];
}
NSString *preString = [s stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@" ,"]];
return interval < 0 ? [NSString stringWithFormat:@"%@ before", preString] : [NSString stringWithFormat:@"%@ after", preString];
}
#pragma mark - MISC
+ (NSUInteger)convertHour:(NSUInteger)hour toMilitaryFromAM:(BOOL)isAM
{
if (hour >= 12) {
return (isAM ? 0 : 12);
}
return (isAM ? hour : hour + 12);
}
+ (NSArray *)datesCollectionFromDate:(NSDate *)startDate untilDate:(NSDate *)endDate
{
NSInteger days = [endDate daysSinceDate:startDate];
NSMutableArray *datesArray = [NSMutableArray array];
for (int i = 0; i < days; i++) {
[datesArray addObject:[startDate dateDaysAfter:i]];
}
return [NSArray arrayWithArray:datesArray];
}
- (NSArray *)hoursInCurrentDayAsDatesCollection
{
NSMutableArray *hours = [NSMutableArray array];
for (int i = 23; i >= 0; i--) {
[hours addObject:[NSDate dateFromYear:[self year]
month:[self monthOfYear]
day:[self dayOfMonth]
hour:i
minute:0]];
}
return [NSArray arrayWithArray:hours];
}
- (BOOL)isInAM
{
return [self hourOfDay] > 11 ? NO : YES;
}
- (BOOL)isStartOfAnHour
{
return [self minuteOfHour] == 0 && [self secondOfMinute] == 0;
}
- (NSUInteger)weekdayStartOfCurrentMonth
{
return [[self startOfCurrentMonth] weekDayOfWeek];
}
- (NSUInteger)daysInCurrentMonth
{
return [[self endOfCurrentMonth] dayOfMonth];
}
- (NSUInteger)daysInPreviousMonth
{
return [[self endOfPreviousMonth] dayOfMonth];
}
- (NSUInteger)daysInNextMonth
{
return [[self endOfNextMonth] dayOfMonth];
}
@end

View File

@@ -9,5 +9,5 @@
#import <SenTestingKit/SenTestingKit.h>
@interface MTDatesTests : SenTestCase
@property (strong, nonatomic) NSDateFormatter *formatter;
@end

View File

@@ -7,26 +7,707 @@
//
#import "MTDatesTests.h"
#import "NSDate+MTDates.h"
@implementation MTDatesTests
- (void)setUp
{
_formatter = [[NSDateFormatter alloc] init];
_formatter.dateFormat = @"MM/dd/yyyy hh:mma";
[super setUp];
// Set-up code here.
}
- (void)tearDown
{
// Tear-down code here.
[super tearDown];
}
- (void)testExample
{
STFail(@"Unit tests are not implemented yet in MTDatesTests");
#pragma mark - CONSTRUCTORS
- (void)test_dateFromISOString {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
STAssertTrue([[NSDate dateFromISOString:@"1986-07-11T17:29:00"] isEqualToDate:date], nil);
}
- (void)test_dateFromYear_month_day {
NSDate *date = [_formatter dateFromString:@"07/11/1986 12:00am"];
STAssertTrue([[NSDate dateFromYear:1986 month:7 day:11] isEqualToDate:date], nil);
}
- (void)test_dateFromYear_month_day_hour_minute {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
STAssertTrue([[NSDate dateFromYear:1986 month:7 day:11 hour:11 minute:29] isEqualToDate:date], nil);
}
- (void)test_dateFromYear_month_day_hour_minute_second {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
STAssertTrue([[NSDate dateFromYear:1986 month:7 day:11 hour:11 minute:29 second:0] isEqualToDate:date], nil);
}
- (void)test_dateFromYear_week_weekDay {
NSDate *date = [_formatter dateFromString:@"07/11/1986 12:00am"];
STAssertTrue([[NSDate dateFromYear:1986 week:28 weekDay:6] isEqualToDate:date], nil);
}
- (void)test_dateFromYear_week_weekDay_hour_minute {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
STAssertTrue([[NSDate dateFromYear:1986 week:28 weekDay:6 hour:11 minute:29] isEqualToDate:date], nil);
}
- (void)test_dateFromYear_week_weekDay_hour_minute_second {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
STAssertTrue([[NSDate dateFromYear:1986 week:28 weekDay:6 hour:11 minute:29 second:0] isEqualToDate:date], nil);
}
- (void)test_dateByAddingYears_months_weeks_days_hours_minutes_seconds {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"02/05/1982 10:05am"];
STAssertTrue([[date2 dateByAddingYears:4 months:5 weeks:0 days:6 hours:1 minutes:24 seconds:0] isEqualToDate:date], nil);
NSDate *date3 = [_formatter dateFromString:@"06/27/1986 10:05am"];
STAssertTrue([[date3 dateByAddingYears:0 months:0 weeks:2 days:0 hours:1 minutes:24 seconds:0] isEqualToDate:date], nil);
}
#pragma mark - SYMBOLS
- (void)test_shortWeekdaySymbols {
STAssertTrue([NSDate shortWeekdaySymbols].count == 7, nil);
}
- (void)test_weekdaySymbols {
STAssertTrue([NSDate shortWeekdaySymbols].count == 7, nil);
}
- (void)test_veryShortWeekdaySymbols {
STAssertTrue([NSDate shortWeekdaySymbols].count == 7, nil);
}
- (void)test_shortMonthlySymbols {
STAssertTrue([NSDate shortMonthlySymbols].count == 12, nil);
}
- (void)test_monthlySymbols {
STAssertTrue([NSDate shortMonthlySymbols].count == 12, nil);
}
- (void)test_veryShortMonthlySymbols {
STAssertTrue([NSDate shortMonthlySymbols].count == 12, nil);
}
#pragma mark - COMPONENTS
- (void)test_year {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
STAssertTrue([date year] == 1986, nil);
}
- (void)test_weekOfYear {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
STAssertTrue([date weekOfYear] == 28, nil);
}
- (void)test_weekDayOfWeek {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
STAssertTrue([date weekDayOfWeek] == 6, nil);
}
- (void)test_monthOfYear {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
STAssertTrue([date monthOfYear] == 7, nil);
}
- (void)test_dayOfMonth {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
STAssertTrue([date dayOfMonth] == 11, nil);
}
- (void)test_hourOfDay {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
STAssertTrue([date hourOfDay] == 11, nil);
}
- (void)test_hourOfDayNonMilitary {
NSDate *date = [_formatter dateFromString:@"07/11/1986 2:29pm"];
STAssertTrue([date hourOfDayNonMilitary] == 2, nil);
}
- (void)test_minuteOfHour {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
STAssertTrue([date minuteOfHour] == 29, nil);
}
- (void)test_secondOfMinute {
_formatter.dateFormat = @"MM/dd/yyyy hh:mm:ssa";
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29:33am"];
STAssertTrue([date secondOfMinute] == 33, nil);
}
- (void)test_secondsIntoDay {
_formatter.dateFormat = @"MM/dd/yyyy hh:mm:ssa";
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29:33am"];
STAssertTrue([date secondsIntoDay] == 41373, nil);
}
#pragma mark - RELATIVES
#pragma mark years
- (void)test_startOfPreviousYear {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"01/01/1985 12:00am"];
STAssertTrue([[date startOfPreviousYear] isEqualToDate:date2], nil);
}
- (void)test_startOfCurrentYear {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"01/01/1986 12:00am"];
STAssertTrue([[date startOfCurrentYear] isEqualToDate:date2], nil);
}
- (void)test_startOfNextYear {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"01/01/1987 12:00am"];
STAssertTrue([[date startOfNextYear] isEqualToDate:date2], nil);
}
- (void)test_endOfPreviousYear {
_formatter.dateFormat = @"MM/dd/yyyy hh:mm:ssa";
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29:00am"];
NSDate *date2 = [_formatter dateFromString:@"12/31/1985 11:59:59pm"];
STAssertTrue([[date endOfPreviousYear] isEqualToDate:date2], nil);
}
- (void)test_endOfCurrentYear {
_formatter.dateFormat = @"MM/dd/yyyy hh:mm:ssa";
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29:00am"];
NSDate *date2 = [_formatter dateFromString:@"12/31/1986 11:59:59pm"];
STAssertTrue([[date endOfCurrentYear] isEqualToDate:date2], nil);
}
- (void)test_endOfNextYear {
_formatter.dateFormat = @"MM/dd/yyyy hh:mm:ssa";
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29:00am"];
NSDate *date2 = [_formatter dateFromString:@"12/31/1986 11:59:59pm"];
STAssertTrue([[date endOfCurrentYear] isEqualToDate:date2], nil);
}
- (void)test_oneYearPrevious {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/11/1985 11:29am"];
STAssertTrue([[date oneYearPrevious] isEqualToDate:date2], nil);
}
- (void)test_oneYearNext {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/11/1987 11:29am"];
STAssertTrue([[date oneYearNext] isEqualToDate:date2], nil);
}
- (void)test_dateYearsBefore {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/11/1982 11:29am"];
STAssertTrue([[date dateYearsBefore:4] isEqualToDate:date2], nil);
}
- (void)test_dateYearsAfter {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/11/1994 11:29am"];
STAssertTrue([[date dateYearsAfter:8] isEqualToDate:date2], nil);
}
- (void)test_yearsSinceDate {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/11/1994 11:29am"];
STAssertTrue([date2 yearsSinceDate:date] == 8, nil);
}
#pragma mark months
- (void)test_startOfPreviousMonth {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"06/01/1986 12:00am"];
STAssertTrue([[date startOfPreviousMonth] isEqualToDate:date2], nil);
}
- (void)test_startOfCurrentMonth {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/01/1986 12:00am"];
STAssertTrue([[date startOfCurrentMonth] isEqualToDate:date2], nil);
}
- (void)test_startOfNextMonth {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"08/01/1986 12:00am"];
STAssertTrue([[date startOfNextMonth] isEqualToDate:date2], nil);
}
- (void)test_endOfPreviousMonth {
_formatter.dateFormat = @"MM/dd/yyyy hh:mm:ssa";
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29:00am"];
NSDate *date2 = [_formatter dateFromString:@"06/30/1986 11:59:59pm"];
STAssertTrue([[date endOfPreviousMonth] isEqualToDate:date2], nil);
}
- (void)test_endOfCurrentMonth {
_formatter.dateFormat = @"MM/dd/yyyy hh:mm:ssa";
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29:00am"];
NSDate *date2 = [_formatter dateFromString:@"07/31/1986 11:59:59pm"];
STAssertTrue([[date endOfCurrentMonth] isEqualToDate:date2], nil);
}
- (void)test_endOfNextMonth {
_formatter.dateFormat = @"MM/dd/yyyy hh:mm:ssa";
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29:00am"];
NSDate *date2 = [_formatter dateFromString:@"08/31/1986 11:59:59pm"];
STAssertTrue([[date endOfNextMonth] isEqualToDate:date2], nil);
}
- (void)test_oneMonthPrevious {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"06/11/1986 11:29am"];
STAssertTrue([[date oneMonthPrevious] isEqualToDate:date2], nil);
}
- (void)test_oneMonthNext {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"08/11/1986 11:29am"];
STAssertTrue([[date oneMonthNext] isEqualToDate:date2], nil);
}
- (void)test_dateMonthsBefore {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"03/11/1986 11:29am"];
STAssertTrue([[date dateMonthsBefore:4] isEqualToDate:date2], nil);
}
- (void)test_dateMonthsAfter {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"10/11/1986 11:29am"];
STAssertTrue([[date dateMonthsAfter:3] isEqualToDate:date2], nil);
}
- (void)test_monthsSinceDate {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"10/11/1986 11:29am"];
STAssertTrue([date2 monthsSinceDate:date] == 3, nil);
}
#pragma mark weeks
- (void)test_startOfPreviousWeek {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"06/29/1986 12:00am"];
STAssertTrue([[date startOfPreviousWeek] isEqualToDate:date2], nil);
}
- (void)test_startOfCurrentWeek {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/06/1986 12:00am"];
STAssertTrue([[date startOfCurrentWeek] isEqualToDate:date2], nil);
}
- (void)test_startOfNextWeek {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/13/1986 12:00am"];
STAssertTrue([[date startOfNextWeek] isEqualToDate:date2], nil);
}
- (void)test_endOfPreviousWeek {
_formatter.dateFormat = @"MM/dd/yyyy hh:mm:ssa";
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29:00am"];
NSDate *date2 = [_formatter dateFromString:@"07/05/1986 11:59:59pm"];
STAssertTrue([[date endOfPreviousWeek] isEqualToDate:date2], nil);
}
- (void)test_endOfCurrentWeek {
_formatter.dateFormat = @"MM/dd/yyyy hh:mm:ssa";
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29:00am"];
NSDate *date2 = [_formatter dateFromString:@"07/12/1986 11:59:59pm"];
STAssertTrue([[date endOfCurrentWeek] isEqualToDate:date2], nil);
}
- (void)test_endOfNextWeek {
_formatter.dateFormat = @"MM/dd/yyyy hh:mm:ssa";
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29:00am"];
NSDate *date2 = [_formatter dateFromString:@"07/19/1986 11:59:59pm"];
STAssertTrue([[date endOfNextWeek] isEqualToDate:date2], nil);
}
- (void)test_oneWeekPrevious {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/04/1986 11:29am"];
STAssertTrue([[date oneWeekPrevious] isEqualToDate:date2], nil);
}
- (void)test_oneWeekNext {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/18/1986 11:29am"];
STAssertTrue([[date oneWeekNext] isEqualToDate:date2], nil);
}
- (void)test_dateWeeksBefore {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"02/07/1986 11:29am"];
STAssertTrue([[date dateWeeksBefore:22] isEqualToDate:date2], nil);
}
- (void)test_dateWeeksAfter {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"11/21/1986 11:29am"];
STAssertTrue([[date dateWeeksAfter:19] isEqualToDate:date2], nil);
}
- (void)test_weeksSinceDate {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"02/07/1986 11:29am"];
STAssertTrue([date weeksSinceDate:date2] == 22, nil);
}
#pragma mark days
- (void)test_startOfPreviousDay {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/10/1986 12:00am"];
STAssertTrue([[date startOfPreviousDay] isEqualToDate:date2], nil);
}
- (void)test_startOfCurrentDay {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/11/1986 12:00am"];
STAssertTrue([[date startOfCurrentDay] isEqualToDate:date2], nil);
}
- (void)test_startOfNextDay {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/12/1986 12:00am"];
STAssertTrue([[date startOfNextDay] isEqualToDate:date2], nil);
}
- (void)test_endOfPreviousDay {
_formatter.dateFormat = @"MM/dd/yyyy hh:mm:ssa";
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29:00am"];
NSDate *date2 = [_formatter dateFromString:@"07/10/1986 11:59:59pm"];
STAssertTrue([[date endOfPreviousDay] isEqualToDate:date2], nil);
}
- (void)test_endOfCurrentDay {
_formatter.dateFormat = @"MM/dd/yyyy hh:mm:ssa";
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29:00am"];
NSDate *date2 = [_formatter dateFromString:@"07/11/1986 11:59:59pm"];
STAssertTrue([[date endOfCurrentDay] isEqualToDate:date2], nil);
}
- (void)test_endOfNextDay {
_formatter.dateFormat = @"MM/dd/yyyy hh:mm:ssa";
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29:00am"];
NSDate *date2 = [_formatter dateFromString:@"07/12/1986 11:59:59pm"];
STAssertTrue([[date endOfNextDay] isEqualToDate:date2], nil);
}
- (void)test_oneDayPrevious {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/10/1986 11:29am"];
STAssertTrue([[date oneDayPrevious] isEqualToDate:date2], nil);
}
- (void)test_oneDayNext {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/12/1986 11:29am"];
STAssertTrue([[date oneDayNext] isEqualToDate:date2], nil);
}
- (void)test_dateDaysBefore {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/05/1986 11:29am"];
STAssertTrue([[date dateDaysBefore:6] isEqualToDate:date2], nil);
}
- (void)test_dateDaysAfter {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/15/1986 11:29am"];
STAssertTrue([[date dateDaysAfter:4] isEqualToDate:date2], nil);
}
- (void)test_daysSinceDate {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/15/1986 11:29am"];
STAssertTrue([date2 daysSinceDate:date] == 4, nil);
}
#pragma mark hours
- (void)test_startOfPreviousHour {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/11/1986 10:00am"];
STAssertTrue([[date startOfPreviousHour] isEqualToDate:date2], nil);
}
- (void)test_startOfCurrentHour {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/11/1986 11:00am"];
STAssertTrue([[date startOfCurrentHour] isEqualToDate:date2], nil);
}
- (void)test_startOfNextHour {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/11/1986 12:00pm"];
STAssertTrue([[date startOfNextHour] isEqualToDate:date2], nil);
}
- (void)test_endOfPreviousHour {
_formatter.dateFormat = @"MM/dd/yyyy hh:mm:ssa";
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29:00am"];
NSDate *date2 = [_formatter dateFromString:@"07/11/1986 10:59:59am"];
STAssertTrue([[date endOfPreviousHour] isEqualToDate:date2], nil);
}
- (void)test_endOfCurrentHour {
_formatter.dateFormat = @"MM/dd/yyyy hh:mm:ssa";
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29:00am"];
NSDate *date2 = [_formatter dateFromString:@"07/11/1986 11:59:59am"];
STAssertTrue([[date endOfCurrentHour] isEqualToDate:date2], nil);
}
- (void)test_endOfNextHour {
_formatter.dateFormat = @"MM/dd/yyyy hh:mm:ssa";
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29:00am"];
NSDate *date2 = [_formatter dateFromString:@"07/11/1986 12:59:59pm"];
STAssertTrue([[date endOfNextHour] isEqualToDate:date2], nil);
}
- (void)test_oneHourPrevious {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/11/1986 10:29am"];
STAssertTrue([[date oneHourPrevious] isEqualToDate:date2], nil);
}
- (void)test_oneHourNext {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/11/1986 12:29pm"];
STAssertTrue([[date oneHourNext] isEqualToDate:date2], nil);
}
- (void)test_dateHoursBefore {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/11/1986 05:29am"];
STAssertTrue([[date dateHoursBefore:6] isEqualToDate:date2], nil);
}
- (void)test_dateHoursAfter {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/11/1986 05:29pm"];
STAssertTrue([[date dateHoursAfter:6] isEqualToDate:date2], nil);
}
- (void)test_hoursSinceDate {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/11/1986 07:29am"];
STAssertTrue([date hoursSinceDate:date2] == 4, nil);
}
#pragma mark - COMPARES
- (void)test_isAfter {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/11/1986 07:29am"];
STAssertTrue([date isAfter:date2], nil);
}
- (void)test_isBefore {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/11/1986 07:29am"];
STAssertTrue([date2 isBefore:date], nil);
}
- (void)test_isOnOrAfter {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/11/1986 11:29am"];
STAssertTrue([date2 isOnOrAfter:date], nil);
NSDate *date3 = [_formatter dateFromString:@"07/11/1986 11:30am"];
STAssertTrue([date3 isOnOrAfter:date], nil);
}
- (void)test_isOnOrBefore {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/11/1986 11:29am"];
STAssertTrue([date2 isOnOrBefore:date], nil);
NSDate *date3 = [_formatter dateFromString:@"07/11/1986 11:28am"];
STAssertTrue([date3 isOnOrBefore:date], nil);
}
- (void)test_isWithinSameMonth {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/28/1986 07:29am"];
STAssertTrue([date2 isWithinSameMonth:date], nil);
NSDate *date3 = [_formatter dateFromString:@"08/01/1986 07:29am"];
STAssertFalse([date3 isWithinSameMonth:date], nil);
NSDate *date4 = [_formatter dateFromString:@"06/01/1986 07:29am"];
STAssertFalse([date4 isWithinSameMonth:date], nil);
}
- (void)test_isWithinSameWeek {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/12/1986 07:29am"];
STAssertTrue([date2 isWithinSameWeek:date], nil);
NSDate *date3 = [_formatter dateFromString:@"07/13/1986 07:29am"];
STAssertFalse([date3 isWithinSameWeek:date], nil);
NSDate *date4 = [_formatter dateFromString:@"06/05/1986 07:29am"];
STAssertFalse([date4 isWithinSameWeek:date], nil);
}
- (void)test_isWithinSameDay {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/11/1986 07:29am"];
STAssertTrue([date2 isWithinSameDay:date], nil);
NSDate *date3 = [_formatter dateFromString:@"07/12/1986 12:00am"];
STAssertFalse([date3 isWithinSameDay:date], nil);
NSDate *date4 = [_formatter dateFromString:@"07/10/1986 07:29am"];
STAssertFalse([date4 isWithinSameDay:date], nil);
}
- (void)test_isWithinSameHour {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
NSDate *date2 = [_formatter dateFromString:@"07/11/1986 11:07am"];
STAssertTrue([date2 isWithinSameHour:date], nil);
NSDate *date3 = [_formatter dateFromString:@"07/11/1986 12:00am"];
STAssertFalse([date3 isWithinSameHour:date], nil);
NSDate *date4 = [_formatter dateFromString:@"07/11/1986 07:29am"];
STAssertFalse([date4 isWithinSameHour:date], nil);
}
#pragma mark - STRINGS
- (void)test_stringFromDatesShortMonth {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
STAssertTrue([[date stringFromDatesShortMonth] isEqualToString:@"Jul"], nil);
}
- (void)test_stringFromDatesFullMonth {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
STAssertTrue([[date stringFromDatesFullMonth] isEqualToString:@"July"], nil);
}
- (void)test_stringFromDateWithFormat {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
STAssertTrue([[date stringFromDateWithFormat:@"MMM dd yyyy"] isEqualToString:@"Jul 11 1986"], nil);
}
- (void)test_stringFromDateWithISODateTime {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
STAssertTrue([[date stringFromDateWithISODateTime] isEqualToString:@"1986-07-11T17:29:00Z"], nil);
}
- (void)test_stringFromDateWithGreatestComponentsForInterval {
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
STAssertTrue([[date stringFromDateWithGreatestComponentsForSecondsPassed:3002] isEqualToString:@"50 minutes, 2 seconds after"], nil);
}
#pragma mark - MISC
- (void)test_convertHour_to24HourFromatFromAM {
STAssertTrue([NSDate convertHour:9 toMilitaryFromAM:YES] == 9, nil);
STAssertTrue([NSDate convertHour:9 toMilitaryFromAM:NO] == 21, nil);
}
- (void)test_datesCollectionFromDate_untilDate {
NSDate *date = [_formatter dateFromString:@"07/02/1986 12:00am"];
NSDate *date2 = [_formatter dateFromString:@"07/11/1986 12:00am"];
NSArray *dates = [NSDate datesCollectionFromDate:date untilDate:date2];
STAssertTrue(dates.count == 9, nil);
}
- (void)test_hoursInCurrentDayAsDatesCollection {
NSDate *date = [_formatter dateFromString:@"07/02/1986 12:00am"];
STAssertTrue([date hoursInCurrentDayAsDatesCollection].count == 24, nil);
}
- (void)test_isInAM {
NSDate *date = [_formatter dateFromString:@"07/02/1986 09:00am"];
STAssertTrue([date isInAM], nil);
}
- (void)test_isStartOfAnHour {
NSDate *date = [_formatter dateFromString:@"07/02/1986 09:00am"];
STAssertTrue([date isStartOfAnHour], nil);
}
- (void)test_weekdayStartOfCurrentMonth {
NSDate *date = [_formatter dateFromString:@"07/11/1986 09:23am"];
STAssertTrue([date weekdayStartOfCurrentMonth] == 3, nil);
}
- (void)test_daysInCurrentMonth {
NSDate *date = [_formatter dateFromString:@"07/11/1986 09:23am"];
STAssertTrue([date daysInCurrentMonth] == 31, nil);
}
- (void)test_daysInPreviousMonth {
NSDate *date = [_formatter dateFromString:@"07/11/1986 09:23am"];
STAssertTrue([date daysInPreviousMonth] == 30, nil);
}
- (void)test_daysInNextMonth {
NSDate *date = [_formatter dateFromString:@"07/11/1986 09:23am"];
STAssertTrue([date daysInNextMonth] == 31, nil);
}
@end