mirror of
https://github.com/HackPlan/MTDates.git
synced 2026-01-12 17:02:37 +08:00
init
This commit is contained in:
22
LICENSE
Normal file
22
LICENSE
Normal 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
10
MTDates.podspec
Normal 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
|
||||
@@ -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 */
|
||||
};
|
||||
|
||||
@@ -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
|
||||
@@ -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
204
MTDates/NSDate+MTDates.h
Executable 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
856
MTDates/NSDate+MTDates.m
Executable 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
|
||||
@@ -9,5 +9,5 @@
|
||||
#import <SenTestingKit/SenTestingKit.h>
|
||||
|
||||
@interface MTDatesTests : SenTestCase
|
||||
|
||||
@property (strong, nonatomic) NSDateFormatter *formatter;
|
||||
@end
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user