Full Code of azu/NSDate-Escort for AI

master 2100a2c7c81c cached
50 files
361.9 KB
85.9k tokens
1 symbols
1 requests
Download .txt
Showing preview only (380K chars total). Download the full file or copy to clipboard to get everything.
Repository: azu/NSDate-Escort
Branch: master
Commit: 2100a2c7c81c
Files: 50
Total size: 361.9 KB

Directory structure:
gitextract_azev1r4l/

├── .gitignore
├── .ruby-version
├── .swift-version
├── .travis.yml
├── Benchmark/
│   ├── BenchMakeFormReferenceDate.m
│   └── Info.plist
├── Gemfile
├── LICENSE
├── Makefile
├── NSDate-Escort/
│   ├── Date+Escort.swift
│   ├── NSDate+Escort.h
│   └── NSDate+Escort.m
├── NSDate-Escort.podspec
├── NSDate-Escort.xcodeproj/
│   ├── project.pbxproj
│   └── xcshareddata/
│       └── xcschemes/
│           ├── NSDate_Escort.xcscheme
│           ├── NSDate_Escort_iOS.xcscheme
│           └── Test.xcscheme
├── NSDate-Escort.xcworkspace/
│   ├── contents.xcworkspacedata
│   └── xcshareddata/
│       └── IDEWorkspaceChecks.plist
├── NSDate-Escort_Cocoa/
│   ├── Info.plist
│   └── NSDate-Escort.h
├── NSDate_Escort_iOS/
│   ├── Info.plist
│   └── NSDate_Escort_iOS.h
├── Podfile
├── README.md
├── SwiftTest/
│   ├── EscortAdjustingDatesSpec.swift
│   ├── EscortClassSpec.swift
│   ├── EscortComparingSpec.swift
│   ├── EscortDateRoles.swift
│   ├── EscortDecomposingSpec.swift
│   ├── EscortExtractSpec.swift
│   ├── EscortRetrievingIntervalsSpec.swift
│   └── Info.plist
├── Test/
│   ├── EscortAdjustingDatesSpec.m
│   ├── EscortAmountOfSpecs.m
│   ├── EscortCacheSpec.m
│   ├── EscortClassSpec.m
│   ├── EscortComparingSpec.m
│   ├── EscortDateRoles.m
│   ├── EscortDecomposingSpec.m
│   ├── EscortRetrievingIntervalsSpec.m
│   ├── Lib/
│   │   └── FakeDateUtil/
│   │       ├── FakeDateUtil.h
│   │       └── FakeDateUtil.m
│   ├── Matcher/
│   │   ├── AZNSDateKiwiMatcher.h
│   │   └── AZNSDateKiwiMatcher.m
│   ├── Test-Info.plist
│   ├── Test-Prefix.pch
│   └── en.lproj/
│       └── InfoPlist.strings
└── script/
    ├── bin/
    │   └── ios-sim-locale
    └── run-test.sh

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
# Xcode
.DS_Store
*/build/*
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
profile
*.moved-aside
DerivedData
.idea/
*.hmap
*.xccheckout

#CocoaPods
Pods


================================================
FILE: .ruby-version
================================================
2.6.3


================================================
FILE: .swift-version
================================================
5.0

================================================
FILE: .travis.yml
================================================
language: objective-c
osx_image: xcode10.2
env: LC_CTYPE=en_US.UTF-8
before_install:
#   - sudo easy_install cpp-coveralls
  - bundle install
  - bundle exec pod repo update
  - bundle exec pod install
script:
  - ./script/run-test.sh
# after_success:
#   - coveralls -e Pods -e Test


================================================
FILE: Benchmark/BenchMakeFormReferenceDate.m
================================================
//
// Created by azu on 2013/06/09.
// License MIT
//


#import <XCTest/XCTest.h>

@interface BenchMakeFormReferenceDate : XCTestCase
@end

@implementation BenchMakeFormReferenceDate {
}

- (void)test_timeIntervalSinceReferenceDate {
    [self measureBlock:^{
        NSTimeInterval timeInterval = [[NSDate date] timeIntervalSinceReferenceDate] + 1000;
        [NSDate dateWithTimeIntervalSinceReferenceDate:timeInterval];
    }];
}

- (void)test_class_timeIntervalSinceReferenceDate {
    [self measureBlock:^{
        NSTimeInterval timeInterval = [NSDate timeIntervalSinceReferenceDate] + 1000;
        [NSDate dateWithTimeIntervalSinceReferenceDate:timeInterval];
    }];
}

- (void)test_dateWithTimeIntervalSinceNow {
    [self measureBlock:^{
        [NSDate dateWithTimeIntervalSinceNow:1000];
    }];
}

- (void)test_dateByAddingTimeInterval {
    NSDate *date = [NSDate date];
    [self measureBlock:^{
        [date dateByAddingTimeInterval:1000];
    }];
}

- (void)test_dateByAddingComponents {
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *oneDayComponents = [[NSDateComponents alloc] init];
    oneDayComponents.day = 1000;
    [self measureBlock:^{
        [calendar dateByAddingComponents:oneDayComponents toDate:[NSDate date] options:0];
    }];
}

- (void)test_calendar {
    NSDateComponents *oneDayComponents = [[NSDateComponents alloc] init];
    oneDayComponents.day = 1000;
    [self measureBlock:^{
        for (int i = 0; i < 1000 * 1000; i++ ) {
            NSCalendar *calendar = [NSCalendar currentCalendar];
            [calendar dateByAddingComponents:oneDayComponents toDate:[NSDate date] options:0];
        }
    }];
}

- (void)test_calendar_timezone {
    NSDateComponents *oneDayComponents = [[NSDateComponents alloc] init];
    oneDayComponents.day = 1000;
    [self measureBlock:^{
        for (int i = 0; i < 1000 * 1000; i++ ) {
            NSCalendar *calendar = [NSCalendar currentCalendar];
//            calendar.timeZone = [NSTimeZone systemTimeZone];
            [calendar dateByAddingComponents:oneDayComponents toDate:[NSDate date] options:0];
        }
    }];
}

- (void)test_cache_calendar_timezone {
    NSDateComponents *oneDayComponents = [[NSDateComponents alloc] init];
    oneDayComponents.day = 1000;
    [self measureBlock:^{
        NSCalendar *calendar = [NSCalendar currentCalendar];
        for (int i = 0; i < 1000 * 1000; i++ ) {
            calendar.timeZone = [NSTimeZone systemTimeZone];
            [calendar dateByAddingComponents:oneDayComponents toDate:[NSDate date] options:0];
        }
    }];
}

- (void)test_cache_calendar_reset_timezone {
    NSDateComponents *oneDayComponents = [[NSDateComponents alloc] init];
    oneDayComponents.day = 1000;
    [self measureBlock:^{
        NSCalendar *calendar = [NSCalendar currentCalendar];
        for (int i = 0; i < 1000 * 1000; i++ ) {
            [NSTimeZone resetSystemTimeZone];
            calendar.timeZone = [NSTimeZone systemTimeZone];
            [calendar dateByAddingComponents:oneDayComponents toDate:[NSDate date] options:0];
        }
    }];
}

- (void)test_cache_calendar_local_timezone {
    NSDateComponents *oneDayComponents = [[NSDateComponents alloc] init];
    oneDayComponents.day = 1000;
    [self measureBlock:^{
        NSCalendar *calendar = [NSCalendar currentCalendar];
        for (int i = 0; i < 1000 * 1000; i++ ) {
            calendar.timeZone = [NSTimeZone localTimeZone];
            [calendar dateByAddingComponents:oneDayComponents toDate:[NSDate date] options:0];
        }
    }];
}

- (void)test_cache_calendar_cache_timezone {
    NSDateComponents *oneDayComponents = [[NSDateComponents alloc] init];
    oneDayComponents.day = 1000;
    [self measureBlock:^{
        NSCalendar *calendar = [NSCalendar currentCalendar];
        calendar.timeZone = [NSTimeZone systemTimeZone];
        for (int i = 0; i < 1000 * 1000; i++ ) {
            [calendar dateByAddingComponents:oneDayComponents toDate:[NSDate date] options:0];
        }
    }];
}
@end


================================================
FILE: Benchmark/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>en</string>
	<key>CFBundleExecutable</key>
	<string>$(EXECUTABLE_NAME)</string>
	<key>CFBundleIdentifier</key>
	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>$(PRODUCT_NAME)</string>
	<key>CFBundlePackageType</key>
	<string>BNDL</string>
	<key>CFBundleShortVersionString</key>
	<string>1.0</string>
	<key>CFBundleSignature</key>
	<string>????</string>
	<key>CFBundleVersion</key>
	<string>1</string>
</dict>
</plist>


================================================
FILE: Gemfile
================================================
source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "cocoapods"


================================================
FILE: LICENSE
================================================
Copyright (c) 2013 azu

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: Makefile
================================================
test-all: test-en test-ja

test:
	./script/run-test.sh

test-en:
	osascript -e 'tell app "iPhone Simulator" to quit'
	./script/bin/ios-sim-locale -sdk 6.1 -language en -locale en_US
	./script/run-test.sh
test-ja:
	osascript -e 'tell app "iPhone Simulator" to quit'
	./script/bin/ios-sim-locale -sdk 6.1 -language ja -locale ja_JP
	./script/run-test.sh


================================================
FILE: NSDate-Escort/Date+Escort.swift
================================================
import Foundation

extension Date {
    static var _currentCalendar: Calendar?
    public static var currentCalendar: Calendar {
        get {
            if _currentCalendar == nil || _currentCalendar?.identifier != identifier {
                if let identifier = defaultCalendarIdentifier {
                    _currentCalendar = Calendar(identifier: identifier)
                } else {
                    _currentCalendar = Calendar.current
                }
            }
            _currentCalendar!.timeZone = NSTimeZone.local
            return _currentCalendar!
        }
    }
    
    static var lock = NSLock()
    static var identifier: Calendar.Identifier?
    public static var defaultCalendarIdentifier: Calendar.Identifier? {
        get {
            lock.lock()
            let i = identifier
            lock.unlock()
            return i
        }
        set {
            lock.lock()
            identifier = newValue
            lock.unlock()
        }
    }
    
    //
    public static func tomorrow() -> Date {
        return Date.dateFormNow(day: 1)
    }
    
    public static func yesterday() -> Date {
        return Date.dateFormNow(day: -1)
    }
    
    public static func dateFormNow(day: Int) -> Date {
        return Date().add(day: day)
    }
    
    //
    public func startDateOfYear() -> Date {
        return date(of: .year).date
    }
    
    public func startDateOfMonth() -> Date {
        return date(of: .month).date
    }
    
    public func startDateOfWeekday() -> Date {
        return date(of: .weekOfYear).date
    }
    
    public func startDateOfDay() -> Date {
        return date(of: .day).date
    }
    
    public func date(of unit: NSCalendar.Unit) -> (date: Date, interval: TimeInterval) {
        let calendar = type(of: self).currentCalendar as NSCalendar
        var start: NSDate?
        var interval: TimeInterval = 0
        calendar.range(of: unit, start: &start, interval: &interval, for: self)
        return (start! as Date, interval)
    }
        
    
    // comparing
    public func isSameYear(as date: Date) -> Bool {
        let calendar = Calendar(identifier: .gregorian)
        let leftComponents = calendar.dateComponents([.era, .year], from: self)
        let rightComponents = calendar.dateComponents([.era, .year], from: date)
        return leftComponents.era == rightComponents.era
            && leftComponents.year == rightComponents.year
    }
    
    public func isThisYear() -> Bool {
        return self.isSameYear(as: Date())
    }
    
    public func isSameMonth(as date: Date) -> Bool {
        let calendar = Calendar(identifier: .gregorian)
        let leftComponents = calendar.dateComponents([.era, .year, .month], from: self)
        let rightComponents = calendar.dateComponents([.era, .year, .month], from: date)
        return leftComponents.era == rightComponents.era
            && leftComponents.year == rightComponents.year
            && leftComponents.month == rightComponents.month
    }
    
    public func isThisMonth() -> Bool {
        return self.isSameWeek(as: Date())
    }
    
    public func isSameWeek(as date: Date) -> Bool {
        let leftComponents = type(of: self).currentCalendar.dateComponents([.weekOfYear, .yearForWeekOfYear], from: self)
        let rightComponents = type(of: self).currentCalendar.dateComponents([.weekOfYear, .yearForWeekOfYear], from: date)
        return leftComponents.weekOfYear == rightComponents.weekOfYear
            && leftComponents.yearForWeekOfYear == rightComponents.yearForWeekOfYear
    }
    
    public func isThisWeek() -> Bool {
        return self.isSameWeek(as: Date())
    }
    
    public func isNextWeek() -> Bool {
        return self.isSameWeek(as: Date().add(weekOfYear: 1))
    }
    
    public func isLastWeek() -> Bool {
        return self.isSameWeek(as: Date().add(weekOfYear: -1))
    }
    
    public func isEqual(ignoringTime date: Date) -> Bool {
        let calendar = type(of: self).currentCalendar
        let components: Set<Calendar.Component> = [.era, .year, .month, .day]
        let left = calendar.dateComponents(components, from: self)
        let right = calendar.dateComponents(components, from: date)
        return left.era == right.era
            && left.year == right.year
            && left.month == right.month
            && left.day == right.day
    }
    
    public func isToday() -> Bool {
        return self.isEqual(ignoringTime: Date())
    }
    
    public func isTomorrow() -> Bool {
        return self.isEqual(ignoringTime: Date.tomorrow())
    }
    
    public func isYesterday() -> Bool {
        return self.isEqual(ignoringTime: Date.yesterday())
    }
    
    public func isInPast() -> Bool {
        return self < Date()
    }
    
    public func isInFuture() -> Bool {
        return Date() < self
    }
    
    // date roles
    public func isTypicallyWorkday() -> Bool {
        return !self.isTypicallyWeekend()
    }
    
    public func isTypicallyWeekend() -> Bool {
        let calendar = type(of: self).currentCalendar
        let weekdayRange = calendar.maximumRange(of: .weekday)
        let weekdayOfDate = calendar.component(.weekday, from: self)
        return weekdayOfDate == weekdayRange!.lowerBound || weekdayOfDate == weekdayRange!.upperBound - 1
    }
    
    // retrieving interval
    public func seconds(after date: Date) -> Int {
        return Date.currentCalendar.dateComponents([.second], from: self, to: date).second!
    }
    
    public func minutes(after date: Date) -> Int {
        return Date.currentCalendar.dateComponents([.minute], from: self, to: date).minute!
    }
    
    public func hours(after date: Date) -> Int {
        return Date.currentCalendar.dateComponents([.hour], from: self, to: date).hour!
    }
    
    public func days(after date: Date) -> Int {
        return Date.currentCalendar.dateComponents([.day], from: self, to: date).day!
    }
    
    public func months(after date: Date) -> Int {
        return Date.currentCalendar.dateComponents([.month], from: self, to: date).month!
    }
    
    public func years(after date: Date) -> Int {
        return Date.currentCalendar.dateComponents([.year], from: self, to: date).year!
    }
    
    public func add(era: Int? = nil, year: Int? = nil, month: Int? = nil, day: Int? = nil, hour: Int? = nil, minute: Int? = nil, second: Int? = nil, nanosecond: Int? = nil, weekday: Int? = nil, weekdayOrdinal: Int? = nil, quarter: Int? = nil, weekOfMonth: Int? = nil, weekOfYear: Int? = nil, yearForWeekOfYear: Int? = nil) -> Date {
        var components = DateComponents()
        
        components.era = era
        components.year = year
        components.month = month
        components.day = day
        components.hour = hour
        components.minute = minute
        components.second = second
        components.nanosecond = nanosecond
        components.weekday = weekday
        components.weekdayOrdinal = weekdayOrdinal
        components.quarter = quarter
        components.weekOfMonth = weekOfMonth
        components.weekOfYear = weekOfYear
        components.yearForWeekOfYear = yearForWeekOfYear
        
        let calendar = type(of: self).currentCalendar
        return calendar.date(byAdding: components, to: self)!
    }
    
    // decomposing
    public var era: Int {
        get { return type(of: self).currentCalendar.component(.era, from: self) }
    }
    
    public var year: Int {
        get { return type(of: self).currentCalendar.component(.year, from: self) }
    }
    
    public var month: Int {
        get { return type(of: self).currentCalendar.component(.month, from: self) }
    }
    
    public var day: Int {
        get { return type(of: self).currentCalendar.component(.day, from: self) }
    }
    
    public var hour: Int {
        get { return type(of: self).currentCalendar.component(.hour, from: self) }
    }
    
    public var minute: Int {
        get { return type(of: self).currentCalendar.component(.minute, from: self) }
    }
    
    public var second: Int {
        get { return type(of: self).currentCalendar.component(.second, from: self) }
    }
    
    public var weekday: Int {
        get { return type(of: self).currentCalendar.component(.weekday, from: self) }
    }
    
    public var weekdayOrdinal: Int {
        get { return type(of: self).currentCalendar.component(.weekdayOrdinal, from: self) }
    }
    
    public var quarter: Int {
        get { return type(of: self).currentCalendar.component(.quarter, from: self) }
    }
    
    public var weekOfMonth: Int {
        get { return type(of: self).currentCalendar.component(.weekOfMonth, from: self) }
    }
    
    public var weekOfYear: Int {
        get { return type(of: self).currentCalendar.component(.weekOfYear, from: self) }
    }
    
    public var yearForWeekOfYear: Int {
        get { return type(of: self).currentCalendar.component(.yearForWeekOfYear, from: self) }
    }
    
    public var nanosecond: Int {
        get { return type(of: self).currentCalendar.component(.nanosecond, from: self) }
    }
    
    // extract
    public var gregorianYear: Int {
        get {
            var calendar = Calendar(identifier: .gregorian)
            calendar.timeZone = NSTimeZone.local
            return calendar.dateComponents([.year], from: self).year!
        }
        
    }
    
    public var nearestHour: Int {
        get {
            let calendar = type(of: self).currentCalendar
            let minuteRange = calendar.range(of: .minute, in: .hour, for: self)!
            // always 30...
            let halfMinuteInHour = (minuteRange.upperBound - minuteRange.lowerBound) / 2
            if (minute < halfMinuteInHour) {
                return hour
            } else {
                let anHourLater = self.add(hour: 1)
                return anHourLater.hour
            }
        }
    }
}


================================================
FILE: NSDate-Escort/NSDate+Escort.h
================================================
// LICENSE : MIT

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface NSDate (Escort)

#pragma mark - Setting default calendar

/**
 Returns the calendarIdentifier of calendars that is used by this library for date calculation.
 @see AZ_setDefaultCalendarIdentifier: for more details.
 */
+ (NSString * _Nullable)AZ_defaultCalendarIdentifier;
/**
 Sets the calendarIdentifier of calendars that is used by this library for date calculation.
 You can specify any calendarIdentifiers predefined by NSLocale. If you provide nil, the library uses
 [NSCalendar currentCalendar]. Default value is nil.
 
 You can't provide individual calendars for individual date objects. If you need to perform such
 complicated date calculations, you should rather create calendars on your own.
 */
+ (void)AZ_setDefaultCalendarIdentifier:(NSString * _Nullable)calendarIdentifier;

#pragma mark - Relative dates from the current date
+ (NSDate *)dateTomorrow;

+ (NSDate *)dateYesterday;

+ (NSDate *)dateWithDaysFromNow:(NSInteger) dDays;

+ (NSDate *)dateWithDaysBeforeNow:(NSInteger) dDays;

+ (NSDate *)dateWithHoursFromNow:(NSInteger) dHours;

+ (NSDate *)dateWithHoursBeforeNow:(NSInteger) dHours;

+ (NSDate *)dateWithMinutesFromNow:(NSInteger) dMinutes;

+ (NSDate *)dateWithMinutesBeforeNow:(NSInteger) dMinutes;

#pragma mark - Comparing dates

- (BOOL)isEqualToDateIgnoringTime:(NSDate *) otherDate;

- (BOOL)isToday;

- (BOOL)isTomorrow;

- (BOOL)isYesterday;

- (BOOL)isSameWeekAsDate:(NSDate *) aDate;

- (BOOL)isThisWeek;

- (BOOL)isNextWeek;

- (BOOL)isLastWeek;

- (BOOL)isSameMonthAsDate:(NSDate *) aDate;

- (BOOL)isThisMonth;

- (BOOL)isSameYearAsDate:(NSDate *) aDate;

- (BOOL)isThisYear;

- (BOOL)isNextYear;

- (BOOL)isLastYear;

- (BOOL)isEarlierThanDate:(NSDate *) aDate;

- (BOOL)isLaterThanDate:(NSDate *) aDate;

- (BOOL)isEarlierThanOrEqualDate:(NSDate *) aDate;

- (BOOL)isLaterThanOrEqualDate:(NSDate *) aDate;

- (BOOL)isInFuture;

- (BOOL)isInPast;

#pragma mark - Date roles

- (BOOL)isTypicallyWorkday;

- (BOOL)isTypicallyWeekend;

#pragma mark - Adjusting dates
- (NSDate *)dateByAddingYears:(NSInteger) dYears;

- (NSDate *)dateBySubtractingYears:(NSInteger) dYears;

- (NSDate *)dateByAddingMonths:(NSInteger) dMonths;

- (NSDate *)dateBySubtractingMonths:(NSInteger) dMonths;

- (NSDate *)dateByAddingDays:(NSInteger) dDays;

- (NSDate *)dateBySubtractingDays:(NSInteger) dDays;

- (NSDate *)dateByAddingHours:(NSInteger) dHours;

- (NSDate *)dateBySubtractingHours:(NSInteger) dHours;

- (NSDate *)dateByAddingMinutes:(NSInteger) dMinutes;

- (NSDate *)dateBySubtractingMinutes:(NSInteger) dMinutes;

- (NSDate *)dateByAddingSeconds:(NSInteger) dSeconds;

- (NSDate *)dateBySubtractingSeconds:(NSInteger) dSeconds;

- (NSDate *)dateAtStartOfDay;

- (NSDate *)dateAtStartOfNextDay;

- (NSDate *)dateAtStartOfWeek;

- (NSDate *)dateAtStartOfNextWeek;

- (NSDate *)dateAtStartOfMonth;

- (NSDate *)dateAtStartOfNextMonth;

- (NSDate *)dateAtStartOfYear;

- (NSDate *)dateAtStartOfNextYear;

#pragma mark - Retrieving intervals
- (NSInteger)secondsAfterDate:(NSDate *) aDate;

- (NSInteger)secondsBeforeDate:(NSDate *) aDate;

- (NSInteger)minutesAfterDate:(NSDate *) aDate;

- (NSInteger)minutesBeforeDate:(NSDate *) aDate;

- (NSInteger)hoursAfterDate:(NSDate *) aDate;

- (NSInteger)hoursBeforeDate:(NSDate *) aDate;

- (NSInteger)daysAfterDate:(NSDate *) aDate;

- (NSInteger)daysBeforeDate:(NSDate *) aDate;

- (NSInteger)monthsAfterDate:(NSDate *) aDate;

- (NSInteger)monthsBeforeDate:(NSDate *) aDate;

/**
* return distance days
*/
- (NSInteger)distanceInDaysToDate:(NSDate *) aDate;

#pragma mark amount

- (NSInteger)hoursOfDay;

- (NSInteger)daysOfMonth;

- (NSInteger)daysOfYear;

- (NSInteger)monthsOfYear;


#pragma mark - Decomposing dates
/**
* return nearest hour
*/
@property(readonly) NSInteger nearestHour;
@property(readonly) NSInteger hour;
@property(readonly) NSInteger minute;
@property(readonly) NSInteger seconds;
@property(readonly) NSInteger day;
@property(readonly) NSInteger month;
@property(readonly) NSInteger week;
//  in the Gregorian calendar, n is 7 and Sunday is represented by 1.
@property(readonly) NSInteger weekday;
@property(readonly) NSInteger firstDayOfWeekday;
@property(readonly) NSInteger lastDayOfWeekday;
// e.g. 2nd Tuesday of the month == 2
@property(readonly) NSInteger nthWeekday;
@property(readonly) NSInteger year;
@property(readonly) NSInteger gregorianYear;
@end

NS_ASSUME_NONNULL_END


================================================
FILE: NSDate-Escort/NSDate+Escort.m
================================================
#import "NSDate+Escort.h"

NS_ASSUME_NONNULL_BEGIN

@implementation NSDate (Escort)

static NSString * AZ_DefaultCalendarIdentifier = nil;
static NSLock * AZ_DefaultCalendarIdentifierLock = nil;
static dispatch_once_t AZ_DefaultCalendarIdentifierLock_onceToken;

#pragma mark - private
+ (NSCalendar *)AZ_currentCalendar {
    NSString *key = @"AZ_currentCalendar_";
    NSString *calendarIdentifier = [NSDate AZ_defaultCalendarIdentifier];
    if (calendarIdentifier) {
        key = [key stringByAppendingString:calendarIdentifier];
    }
    NSMutableDictionary *dictionary = [[NSThread currentThread] threadDictionary];
    NSCalendar *currentCalendar = [dictionary objectForKey:key];
    if (currentCalendar == nil) {
        if (calendarIdentifier == nil) {
            currentCalendar = [NSCalendar currentCalendar];
        } else {
            currentCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:calendarIdentifier];
            NSAssert(currentCalendar != nil, @"NSDate-Escort failed to create a calendar since the provided calendarIdentifier is invalid.");
        }
        [dictionary setObject:currentCalendar forKey:key];
    }
    currentCalendar.timeZone = [NSTimeZone localTimeZone];
    return currentCalendar;
}

- (NSInteger)numberOfDaysInWeek {
    return [[NSDate AZ_currentCalendar] maximumRangeOfUnit:NSCalendarUnitWeekday].length;
}
#pragma mark - Setting default calendar
+ (NSString * _Nullable)AZ_defaultCalendarIdentifier {
    dispatch_once(&AZ_DefaultCalendarIdentifierLock_onceToken, ^{
        AZ_DefaultCalendarIdentifierLock = [[NSLock alloc] init];
    });
    NSString *string;
    [AZ_DefaultCalendarIdentifierLock lock];
    string = AZ_DefaultCalendarIdentifier;
    [AZ_DefaultCalendarIdentifierLock unlock];
    return string;
}
+ (void)AZ_setDefaultCalendarIdentifier:(NSString * _Nullable)calendarIdentifier {
    dispatch_once(&AZ_DefaultCalendarIdentifierLock_onceToken, ^{
        AZ_DefaultCalendarIdentifierLock = [[NSLock alloc] init];
    });
    [AZ_DefaultCalendarIdentifierLock lock];
    AZ_DefaultCalendarIdentifier = calendarIdentifier;
    [AZ_DefaultCalendarIdentifierLock unlock];
}
#pragma mark - Relative dates from the current date
+ (NSDate *)dateTomorrow {
    return [NSDate dateWithDaysFromNow:1];
}

+ (NSDate *)dateYesterday {
    return [NSDate dateWithDaysBeforeNow:1];
}

+ (NSDate *)dateWithDaysFromNow:(NSInteger) dDays {
    return [[NSDate date] dateByAddingDays:dDays];
}

+ (NSDate *)dateWithDaysBeforeNow:(NSInteger) dDays {
    return [[NSDate date] dateBySubtractingDays:dDays];
}

+ (NSDate *)dateWithHoursFromNow:(NSInteger) dHours {
    return [[NSDate date] dateByAddingHours:dHours];
}

+ (NSDate *)dateWithHoursBeforeNow:(NSInteger) dHours {
    return [[NSDate date] dateBySubtractingHours:dHours];
}

+ (NSDate *)dateWithMinutesFromNow:(NSInteger) dMinutes {
    return [[NSDate date] dateByAddingMinutes:dMinutes];
}

+ (NSDate *)dateWithMinutesBeforeNow:(NSInteger) dMinutes {
    return [[NSDate date] dateBySubtractingMinutes:dMinutes];
}

#pragma mark - Comparing dates
- (BOOL)isEqualToDateIgnoringTime:(NSDate *) otherDate {
    NSCalendar *currentCalendar = [NSDate AZ_currentCalendar];
    NSCalendarUnit unitFlags = NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
    NSDateComponents *components1 = [currentCalendar components:unitFlags fromDate:self];
    NSDateComponents *components2 = [currentCalendar components:unitFlags fromDate:otherDate];
    return (components1.era == components2.era) &&
        (components1.year == components2.year) &&
        (components1.month == components2.month) &&
        (components1.day == components2.day);
}

- (BOOL)isToday {
    return [self isEqualToDateIgnoringTime:[NSDate date]];
}

- (BOOL)isTomorrow {
    return [self isEqualToDateIgnoringTime:[NSDate dateTomorrow]];
}

- (BOOL)isYesterday {
    return [self isEqualToDateIgnoringTime:[NSDate dateYesterday]];
}

- (BOOL)isSameWeekAsDate:(NSDate *) aDate {
    NSDateComponents *leftComponents = [[NSDate AZ_currentCalendar] components:NSCalendarUnitWeekOfYear | NSCalendarUnitYearForWeekOfYear fromDate:self];
    NSDateComponents *rightComponents = [[NSDate AZ_currentCalendar] components:NSCalendarUnitWeekOfYear | NSCalendarUnitYearForWeekOfYear fromDate:aDate];
    return leftComponents.weekOfYear == rightComponents.weekOfYear
    && leftComponents.yearForWeekOfYear == rightComponents.yearForWeekOfYear;
}

- (BOOL)isThisWeek {
    return [self isSameWeekAsDate:[NSDate date]];
}

- (BOOL)isNextWeek {
    NSDate *nextWeek = [NSDate dateWithDaysFromNow:[self numberOfDaysInWeek]];
    return [self isSameWeekAsDate:nextWeek];
}

- (BOOL)isLastWeek {
    NSDate *lastWeek = [NSDate dateWithDaysBeforeNow:[self numberOfDaysInWeek]];
    return [self isSameWeekAsDate:lastWeek];
}

- (BOOL)isSameMonthAsDate:(NSDate *) aDate {
    NSDate *dateAtStartSelf = [[self dateAtStartOfMonth] dateAtStartOfDay];
    NSDate *dateAtStartArgs = [[aDate dateAtStartOfMonth] dateAtStartOfDay];
    return [dateAtStartSelf isEqualToDate:dateAtStartArgs];
}

- (BOOL)isThisMonth {
    return [self isSameMonthAsDate:[NSDate date]];
}

- (BOOL)isSameYearAsDate:(NSDate *) aDate {
    NSDate *dateAtStartSelf = [[self dateAtStartOfYear] dateAtStartOfDay];
    NSDate *dateAtStartArgs = [[aDate dateAtStartOfYear] dateAtStartOfDay];
    return [dateAtStartSelf isEqualToDate:dateAtStartArgs];
}

- (BOOL)isThisYear {
    return [self isSameYearAsDate:[NSDate date]];
}

- (BOOL)isNextYear {
    NSDate *nextYear = [[NSDate date] dateByAddingYears:1];
    return [self isSameYearAsDate:nextYear];
}

- (BOOL)isLastYear {
    NSDate *lastYear = [[NSDate date] dateBySubtractingYears:1];
    return [self isSameYearAsDate:lastYear];
}

- (BOOL)isEarlierThanDate:(NSDate *) aDate {
    return ([self compare:aDate] == NSOrderedAscending);
}

- (BOOL)isLaterThanDate:(NSDate *) aDate {
    return ([self compare:aDate] == NSOrderedDescending);
}

- (BOOL)isEarlierThanOrEqualDate:(NSDate *) aDate {
    NSComparisonResult comparisonResult = [self compare:aDate];
    return (comparisonResult == NSOrderedAscending) || (comparisonResult == NSOrderedSame);
}

- (BOOL)isLaterThanOrEqualDate:(NSDate *) aDate {
    NSComparisonResult comparisonResult = [self compare:aDate];
    return (comparisonResult == NSOrderedDescending) || (comparisonResult == NSOrderedSame);
}

- (BOOL)isInPast {
    return [self isEarlierThanDate:[NSDate date]];
}

- (BOOL)isInFuture {
    return [self isLaterThanDate:[NSDate date]];
}


#pragma mark - Date roles
// https://github.com/erica/NSDate-Extensions/issues/12
- (BOOL)isTypicallyWorkday {
    return ([self isTypicallyWeekend] == NO);
}

- (BOOL)isTypicallyWeekend {
    NSCalendar *calendar = [NSDate AZ_currentCalendar];
    NSRange weekdayRange = [calendar maximumRangeOfUnit:NSCalendarUnitWeekday];
    NSDateComponents *components = [calendar components:NSCalendarUnitWeekday fromDate:self];
    NSInteger weekdayOfDate = [components weekday];
    return (weekdayOfDate == weekdayRange.location || weekdayOfDate == weekdayRange.location + weekdayRange.length - 1);
}

#pragma mark - Adjusting dates
- (NSDate *)dateByAddingYears:(NSInteger) dYears {
    NSDateComponents *components = [[NSDateComponents alloc] init];
    components.year = dYears;
    NSCalendar *calendar = [NSDate AZ_currentCalendar];
    return [calendar dateByAddingComponents:components toDate:self options:0];
}

- (NSDate *)dateBySubtractingYears:(NSInteger) dYears {
    return [self dateByAddingYears:-dYears];
}

- (NSDate *)dateByAddingMonths:(NSInteger) dMonths {
    NSDateComponents *components = [[NSDateComponents alloc] init];
    components.month = dMonths;
    NSCalendar *calendar = [NSDate AZ_currentCalendar];
    return [calendar dateByAddingComponents:components toDate:self options:0];
}

- (NSDate *)dateBySubtractingMonths:(NSInteger) dMonths {
    return [self dateByAddingMonths:-dMonths];
}

- (NSDate *)dateByAddingDays:(NSInteger) dDays {
    NSDateComponents *components = [[NSDateComponents alloc] init];
    components.day = dDays;
    NSCalendar *calendar = [NSDate AZ_currentCalendar];
    return [calendar dateByAddingComponents:components toDate:self options:0];
}

- (NSDate *)dateBySubtractingDays:(NSInteger) dDays {
    return [self dateByAddingDays:-dDays];
}

- (NSDate *)dateByAddingHours:(NSInteger) dHours {
    NSDateComponents *components = [[NSDateComponents alloc] init];
    components.hour = dHours;
    NSCalendar *calendar = [NSDate AZ_currentCalendar];
    return [calendar dateByAddingComponents:components toDate:self options:0];
}

- (NSDate *)dateBySubtractingHours:(NSInteger) dHours {
    return [self dateByAddingHours:-dHours];
}

- (NSDate *)dateByAddingMinutes:(NSInteger) dMinutes {
    NSDateComponents *components = [[NSDateComponents alloc] init];
    components.minute = dMinutes;
    NSCalendar *calendar = [NSDate AZ_currentCalendar];
    return [calendar dateByAddingComponents:components toDate:self options:0];
}

- (NSDate *)dateBySubtractingMinutes:(NSInteger) dMinutes {
    return [self dateByAddingMinutes:-dMinutes];
}

- (NSDate *)dateByAddingSeconds:(NSInteger) dSeconds {
    NSDateComponents *components = [[NSDateComponents alloc] init];
    components.second = dSeconds;
    NSCalendar *calendar = [NSDate AZ_currentCalendar];
    return [calendar dateByAddingComponents:components toDate:self options:0];
}

- (NSDate *)dateBySubtractingSeconds:(NSInteger) dSeconds {
    return [self dateByAddingSeconds:-dSeconds];
}

- (NSDate *)dateAtStartOfDay {
    NSCalendar *calendar = [NSDate AZ_currentCalendar];
    NSDateComponents *components = [calendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond fromDate:self];
    components.hour = 0;
    components.minute = 0;
    components.second = 0;
    components.timeZone = calendar.timeZone;
    return [calendar dateFromComponents:components];
}

- (NSDate *)dateAtStartOfNextDay {
    NSCalendar *calendar = [NSDate AZ_currentCalendar];
    NSDateComponents *components = [calendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond fromDate:self];
    components.day += 1;
    components.hour = 0;
    components.minute = 0;
    components.second = 0;
    components.timeZone = calendar.timeZone;
    return [calendar dateFromComponents:components];
}

- (NSDate *)dateAtStartOfWeek
{
    NSDate *startOfWeek = nil;
    [[NSDate AZ_currentCalendar] rangeOfUnit:NSCalendarUnitWeekOfMonth startDate:&startOfWeek interval:NULL forDate:self];
    return startOfWeek;
}

- (NSDate *)dateAtStartOfNextWeek {
    NSDate *startOfWeek = nil;
    NSTimeInterval interval = 0;
    [[NSDate AZ_currentCalendar] rangeOfUnit:NSCalendarUnitWeekOfMonth startDate:&startOfWeek interval:&interval forDate:self];
    return [startOfWeek dateByAddingTimeInterval:interval];
}

- (NSDate *)dateAtStartOfMonth {
    NSCalendar *calendar = [NSDate AZ_currentCalendar];
    NSDateComponents *components = [calendar components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond fromDate:self];
    NSRange range = [calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:self];
    components.day = range.location;
    return [calendar dateFromComponents:components];
}

- (NSDate *)dateAtStartOfNextMonth {
    NSCalendar *calendar = [NSDate AZ_currentCalendar];
    NSDateComponents *components = [calendar components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond fromDate:self];
    NSRange range = [calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:self];
    components.month += 1;
    components.day = range.location;
    return [calendar dateFromComponents:components];
}

- (NSDate *)dateAtStartOfYear {
    NSCalendar *calendar = [NSDate AZ_currentCalendar];
    NSDateComponents *components = [calendar components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond fromDate:self];
    NSRange monthRange = [calendar rangeOfUnit:NSCalendarUnitMonth inUnit:NSCalendarUnitYear forDate:self];
    NSRange dayRange = [calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:self];
    components.day = dayRange.location;
    components.month = monthRange.location;
    NSDate *startOfYear = [calendar dateFromComponents:components];
    return startOfYear;
}

- (NSDate *)dateAtStartOfNextYear {
    NSCalendar *calendar = [NSDate AZ_currentCalendar];
    NSDateComponents *components = [calendar components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond fromDate:self];
    NSRange monthRange = [calendar rangeOfUnit:NSCalendarUnitMonth inUnit:NSCalendarUnitYear forDate:self];
    NSRange dayRange = [calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:self];
    components.year += 1;
    components.day = dayRange.location;
    components.month = monthRange.location;
    NSDate *startOfYear = [calendar dateFromComponents:components];
    return startOfYear;
}


#pragma mark - Retrieving intervals
- (NSInteger)secondsAfterDate:(NSDate *) aDate {
    NSDateComponents *components = [[NSDate AZ_currentCalendar] components:NSCalendarUnitSecond fromDate:aDate toDate:self options:0];
    return [components second];
}

- (NSInteger)secondsBeforeDate:(NSDate *) aDate {
    NSDateComponents *components = [[NSDate AZ_currentCalendar] components:NSCalendarUnitSecond fromDate:self toDate:aDate options:0];
    return [components second];
}

- (NSInteger)minutesAfterDate:(NSDate *) aDate {
    NSDateComponents *components = [[NSDate AZ_currentCalendar] components:NSCalendarUnitMinute fromDate:aDate toDate:self options:0];
    return [components minute];
}

- (NSInteger)minutesBeforeDate:(NSDate *) aDate {
    NSDateComponents *components = [[NSDate AZ_currentCalendar] components:NSCalendarUnitMinute fromDate:self toDate:aDate options:0];
    return [components minute];
}

- (NSInteger)hoursAfterDate:(NSDate *) aDate {
    NSDateComponents *components = [[NSDate AZ_currentCalendar] components:NSCalendarUnitHour fromDate:aDate toDate:self options:0];
    return [components hour];
}

- (NSInteger)hoursBeforeDate:(NSDate *) aDate {
    NSDateComponents *components = [[NSDate AZ_currentCalendar] components:NSCalendarUnitHour fromDate:self toDate:aDate options:0];
    return [components hour];
}

- (NSInteger)daysAfterDate:(NSDate *) aDate {
    NSDateComponents *components = [[NSDate AZ_currentCalendar] components:NSCalendarUnitDay fromDate:aDate toDate:self options:0];
    return [components day];
}

- (NSInteger)daysBeforeDate:(NSDate *) aDate {
    NSDateComponents *components = [[NSDate AZ_currentCalendar] components:NSCalendarUnitDay fromDate:self toDate:aDate options:0];
    return [components day];
}

- (NSInteger)monthsAfterDate:(NSDate *) aDate {
    NSDateComponents *components = [[NSDate AZ_currentCalendar] components:NSCalendarUnitMonth fromDate:aDate toDate:self options:0];
    return [components month];
}

- (NSInteger)monthsBeforeDate:(NSDate *) aDate {
    NSDateComponents *components = [[NSDate AZ_currentCalendar] components:NSCalendarUnitMonth fromDate:self toDate:aDate options:0];
    return [components month];
}

- (NSTimeInterval)timeIntervalIgnoringDay:(NSDate *) aDate {
    NSCalendar *calendar = [NSDate AZ_currentCalendar];
    NSCalendarUnit unitFlags = NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
    NSDateComponents *components = [calendar components:unitFlags fromDate:aDate];
    NSDateComponents *components1 = [calendar components:unitFlags fromDate:self];
    return [[calendar dateFromComponents:components] timeIntervalSinceDate:[calendar dateFromComponents:components1]];
}

- (NSInteger)distanceInDaysToDate:(NSDate *) aDate {
    NSCalendar *calendar = [NSDate AZ_currentCalendar];
    NSDateComponents *dateComponents = [calendar
        components:NSCalendarUnitDay fromDate:self toDate:aDate options:0];
    return [dateComponents day];
}

#pragma amount

- (NSInteger)hoursOfDay {
    NSCalendar *calendar = [NSDate AZ_currentCalendar];
    NSRange range = [calendar rangeOfUnit:NSCalendarUnitHour inUnit:NSCalendarUnitDay forDate:self];
    return range.length;
}

- (NSInteger)daysOfMonth {
    NSCalendar *calendar = [NSDate AZ_currentCalendar];
    NSRange range = [calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:self];
    return range.length;
}

- (NSInteger)daysOfYear {
    NSCalendar *calendar = [NSDate AZ_currentCalendar];
    NSDate *startOfYear;
    NSTimeInterval lengthOfYear;
    [calendar rangeOfUnit:NSCalendarUnitYear startDate:&startOfYear interval:&lengthOfYear forDate:self];
    
    NSDate *endOfYear = [startOfYear dateByAddingTimeInterval:lengthOfYear];
    return [startOfYear daysBeforeDate:endOfYear];
}

- (NSInteger)monthsOfYear {
    NSCalendar *calendar = [NSDate AZ_currentCalendar];
    NSRange range = [calendar rangeOfUnit:NSCalendarUnitMonth inUnit:NSCalendarUnitYear forDate:self];
    return range.length;
}

#pragma mark - Decomposing dates
// NSDate-Utilities API is broken?
- (NSInteger)nearestHour {
    NSCalendar *calendar = [NSDate AZ_currentCalendar];
    NSRange minuteRange = [calendar rangeOfUnit:NSCalendarUnitMinute inUnit:NSCalendarUnitHour forDate:self];
    // always 30...
    NSInteger halfMinuteInHour = minuteRange.length / 2;
    NSInteger currentMinute = self.minute;
    if (currentMinute < halfMinuteInHour) {
        return self.hour;
    } else {
        NSDate *anHourLater = [self dateByAddingHours:1];
        return [anHourLater hour];
    }
}

- (NSInteger)hour {
    NSDateComponents *components = [[NSDate AZ_currentCalendar] components:NSCalendarUnitHour fromDate:self];
    return [components hour];
}

- (NSInteger)minute {
    NSDateComponents *components = [[NSDate AZ_currentCalendar] components:NSCalendarUnitMinute fromDate:self];
    return [components minute];
}

- (NSInteger)seconds {
    NSDateComponents *components = [[NSDate AZ_currentCalendar] components:NSCalendarUnitSecond fromDate:self];
    return [components second];
}

- (NSInteger)day {
    NSDateComponents *components = [[NSDate AZ_currentCalendar] components:NSCalendarUnitDay fromDate:self];
    return [components day];
}

- (NSInteger)month {
    NSDateComponents *components = [[NSDate AZ_currentCalendar] components:NSCalendarUnitMonth fromDate:self];
    return [components month];
}

- (NSInteger)week {
    NSDateComponents *components = [[NSDate AZ_currentCalendar] components:NSCalendarUnitWeekOfMonth fromDate:self];
    return [components weekOfMonth];
}

- (NSInteger)weekday {
    NSDateComponents *components = [[NSDate AZ_currentCalendar] components:NSCalendarUnitWeekday fromDate:self];
    return [components weekday];
}

// http://stackoverflow.com/questions/11681815/current-week-start-and-end-date
- (NSInteger)firstDayOfWeekday {
    NSDate *startOfTheWeek;
    NSTimeInterval interval;
    [[NSDate AZ_currentCalendar] rangeOfUnit:NSCalendarUnitWeekOfMonth
                                 startDate:&startOfTheWeek
                                 interval:&interval
                                 forDate:self];
    return [startOfTheWeek day];
}

- (NSInteger)lastDayOfWeekday {
    return [self firstDayOfWeekday] + ([self numberOfDaysInWeek] - 1);
}

- (NSInteger)nthWeekday {
    NSDateComponents *components = [[NSDate AZ_currentCalendar] components:NSCalendarUnitWeekdayOrdinal fromDate:self];
    return [components weekdayOrdinal];
}

- (NSInteger)year {
    NSDateComponents *components = [[NSDate AZ_currentCalendar] components:NSCalendarUnitYear fromDate:self];
    return [components year];
}
- (NSInteger)gregorianYear {
    NSCalendar *currentCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    NSDateComponents *components = [currentCalendar components:NSCalendarUnitEra | NSCalendarUnitYear fromDate:self];
    return [components year];
}

@end

NS_ASSUME_NONNULL_END


================================================
FILE: NSDate-Escort.podspec
================================================

Pod::Spec.new do |s|
  s.name         = "NSDate-Escort"
  s.version      = "2.1.1"
  s.summary      = "A NSDate utility library that is compatible with NSDate-Extensions API."
  s.homepage     = "https://github.com/azu/NSDate-Escort"
  s.license      = { :type => 'MIT', :file => 'LICENSE' }
  s.author       = { "azu" => "azuciao@gmail.com" }
  s.source       = {
    :git => "https://github.com/azu/NSDate-Escort.git",
    :tag => s.version.to_s
  }
  s.requires_arc = true

  s.swift_version = '5.0'
  s.ios.deployment_target  = '11.4'
  s.osx.deployment_target  = '10.14'

  s.default_subspec = 'ObjC'

  s.subspec 'ObjC' do |a|
    a.source_files = 'NSDate-Escort/**/*.{h,m}'
  end
  s.subspec 'Swift' do |a|
    a.source_files = 'NSDate-Escort/**/*.{swift}'
  end
end


================================================
FILE: NSDate-Escort.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
	archiveVersion = 1;
	classes = {
	};
	objectVersion = 46;
	objects = {

/* Begin PBXBuildFile section */
		17B5C28A17FECDD022B846E6 /* NSDate+Escort.m in Sources */ = {isa = PBXBuildFile; fileRef = 17B5C5CD74BE7F1C57C3F0DB /* NSDate+Escort.m */; };
		17B5C474F10F4D9620AFFACC /* FakeDateUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 17B5CF001E83A221023FE180 /* FakeDateUtil.m */; };
		17B5C584E29A91E50FA691ED /* EscortComparingSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 17B5C809EA2391FF7D79ECD6 /* EscortComparingSpec.m */; };
		17B5C94FD65CD923332ED3EE /* EscortCacheSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 17B5CC3FA3B3583B8AC95DD8 /* EscortCacheSpec.m */; };
		17B5C9F98AC409F47299D54B /* EscortDecomposingSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 17B5CA6E7413A743441E0EF2 /* EscortDecomposingSpec.m */; };
		17B5CB0E0DEEAA0B86DB6754 /* EscortClassSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 17B5CF5E44E63D16B9757F5F /* EscortClassSpec.m */; };
		17B5CCF9CEC128B380974AF7 /* EscortAdjustingDatesSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 17B5C79FDE62EDC8C21A9FFC /* EscortAdjustingDatesSpec.m */; };
		17B5CD2E9AD0EF4A499B5DC2 /* EscortRetrievingIntervalsSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 17B5C3CB2F1D7F92A7D5D185 /* EscortRetrievingIntervalsSpec.m */; };
		17B5CEF22C864A71F222AF9B /* EscortDateRoles.m in Sources */ = {isa = PBXBuildFile; fileRef = 17B5C01AAD723EBDDDCC62A1 /* EscortDateRoles.m */; };
		73FCA17718DE837D009ED4AD /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 73FCA17518DE837D009ED4AD /* InfoPlist.strings */; };
		B8D01A3E899B060C25CC4398 /* libPods-Test.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BFDB70869B017E5594994DF /* libPods-Test.a */; };
		BE0BE9A01E9B221000D736C7 /* NSDate-Escort.h in Headers */ = {isa = PBXBuildFile; fileRef = BE0BE99E1E9B221000D736C7 /* NSDate-Escort.h */; settings = {ATTRIBUTES = (Public, ); }; };
		BE0BE9A41E9B221D00D736C7 /* NSDate+Escort.m in Sources */ = {isa = PBXBuildFile; fileRef = 17B5C5CD74BE7F1C57C3F0DB /* NSDate+Escort.m */; };
		BE0BE9AE1E9B238F00D736C7 /* NSDate_Escort_iOS.h in Headers */ = {isa = PBXBuildFile; fileRef = BE0BE9AC1E9B238F00D736C7 /* NSDate_Escort_iOS.h */; settings = {ATTRIBUTES = (Public, ); }; };
		BE10D2C020FCC68300B616FA /* EscortComparingSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE10D2BF20FCC68300B616FA /* EscortComparingSpec.swift */; };
		BE10D2C220FCC68300B616FA /* NSDate_Escort_Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BE0BE99C1E9B221000D736C7 /* NSDate_Escort_Cocoa.framework */; };
		BE10D2C820FCC68B00B616FA /* Date+Escort.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE10D2B720FCC65600B616FA /* Date+Escort.swift */; };
		BE10D2CA21020B8500B616FA /* EscortDecomposingSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE10D2C921020B8500B616FA /* EscortDecomposingSpec.swift */; };
		BE10D2CC2103125F00B616FA /* EscortExtractSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE10D2CB2103125F00B616FA /* EscortExtractSpec.swift */; };
		BE1650DB210D994300868737 /* EscortDateRoles.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE1650DA210D994300868737 /* EscortDateRoles.swift */; };
		BE1650DD210DAC5700868737 /* EscortClassSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE1650DC210DAC5700868737 /* EscortClassSpec.swift */; };
		BE1650DF212037FD00868737 /* EscortAdjustingDatesSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE1650DE212037FD00868737 /* EscortAdjustingDatesSpec.swift */; };
		BE1650E12121340B00868737 /* EscortRetrievingIntervalsSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE1650E02121340B00868737 /* EscortRetrievingIntervalsSpec.swift */; };
		BE5B7B151BBFB0AD005732C2 /* BenchMakeFormReferenceDate.m in Sources */ = {isa = PBXBuildFile; fileRef = BE5B7B131BBFB0AD005732C2 /* BenchMakeFormReferenceDate.m */; };
		BEAD6D3E1EB337AA004A4A3B /* EscortAmountOfSpecs.m in Sources */ = {isa = PBXBuildFile; fileRef = BEAD6D3D1EB337AA004A4A3B /* EscortAmountOfSpecs.m */; };
		C5BD6A3A196287E30053103A /* AZNSDateKiwiMatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = C5BD6A38196287E30053103A /* AZNSDateKiwiMatcher.m */; };
		D61E21D1C84D29A4E5422F51 /* libPods-SwiftTest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B01BA43AF189F3F78DC164D /* libPods-SwiftTest.a */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
		BE10D2C320FCC68300B616FA /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 7355ABD317638E8900DD1EC2 /* Project object */;
			proxyType = 1;
			remoteGlobalIDString = BE0BE99B1E9B221000D736C7;
			remoteInfo = NSDate_Escort_Cocoa;
		};
/* End PBXContainerItemProxy section */

/* Begin PBXFileReference section */
		17B5C01AAD723EBDDDCC62A1 /* EscortDateRoles.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EscortDateRoles.m; sourceTree = "<group>"; };
		17B5C2FFCAB36B1E0C17E2BF /* readme.md */ = {isa = PBXFileReference; lastKnownFileType = file.md; path = readme.md; sourceTree = "<group>"; };
		17B5C3CB2F1D7F92A7D5D185 /* EscortRetrievingIntervalsSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EscortRetrievingIntervalsSpec.m; sourceTree = "<group>"; };
		17B5C5CD74BE7F1C57C3F0DB /* NSDate+Escort.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = "NSDate+Escort.m"; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
		17B5C69FBFA4113BF4F99F02 /* FakeDateUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FakeDateUtil.h; sourceTree = "<group>"; };
		17B5C79FDE62EDC8C21A9FFC /* EscortAdjustingDatesSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = EscortAdjustingDatesSpec.m; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
		17B5C8039CF17DE12A52A9B3 /* NSDate+Escort.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDate+Escort.h"; sourceTree = "<group>"; };
		17B5C809EA2391FF7D79ECD6 /* EscortComparingSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EscortComparingSpec.m; sourceTree = "<group>"; };
		17B5CA6E7413A743441E0EF2 /* EscortDecomposingSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EscortDecomposingSpec.m; sourceTree = "<group>"; };
		17B5CC3FA3B3583B8AC95DD8 /* EscortCacheSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EscortCacheSpec.m; sourceTree = "<group>"; };
		17B5CF001E83A221023FE180 /* FakeDateUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FakeDateUtil.m; sourceTree = "<group>"; };
		17B5CF5E44E63D16B9757F5F /* EscortClassSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EscortClassSpec.m; sourceTree = "<group>"; };
		5DBBC214A3239FD7DB605EF7 /* Pods-Test.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Test.release.xcconfig"; path = "Pods/Target Support Files/Pods-Test/Pods-Test.release.xcconfig"; sourceTree = "<group>"; };
		6DD8C2208BC805D0B99E5503 /* Pods-Test.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Test.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Test/Pods-Test.debug.xcconfig"; sourceTree = "<group>"; };
		73FCA16E18DE837D009ED4AD /* Test.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Test.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
		73FCA17418DE837D009ED4AD /* Test-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Test-Info.plist"; sourceTree = "<group>"; };
		73FCA17618DE837D009ED4AD /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
		73FCA17A18DE837D009ED4AD /* Test-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Test-Prefix.pch"; sourceTree = "<group>"; };
		7B01BA43AF189F3F78DC164D /* libPods-SwiftTest.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-SwiftTest.a"; sourceTree = BUILT_PRODUCTS_DIR; };
		8BFDB70869B017E5594994DF /* libPods-Test.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Test.a"; sourceTree = BUILT_PRODUCTS_DIR; };
		BE0BE99C1E9B221000D736C7 /* NSDate_Escort_Cocoa.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NSDate_Escort_Cocoa.framework; sourceTree = BUILT_PRODUCTS_DIR; };
		BE0BE99E1E9B221000D736C7 /* NSDate-Escort.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "NSDate-Escort.h"; path = "../NSDate-Escort_Cocoa/NSDate-Escort.h"; sourceTree = "<group>"; };
		BE0BE99F1E9B221000D736C7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = "../NSDate-Escort_Cocoa/Info.plist"; sourceTree = "<group>"; };
		BE0BE9AA1E9B238F00D736C7 /* NSDate_Escort_iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NSDate_Escort_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; };
		BE0BE9AC1E9B238F00D736C7 /* NSDate_Escort_iOS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NSDate_Escort_iOS.h; sourceTree = "<group>"; };
		BE0BE9AD1E9B238F00D736C7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
		BE10D2B720FCC65600B616FA /* Date+Escort.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+Escort.swift"; sourceTree = "<group>"; };
		BE10D2BD20FCC68200B616FA /* SwiftTest.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SwiftTest.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
		BE10D2BF20FCC68300B616FA /* EscortComparingSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EscortComparingSpec.swift; sourceTree = "<group>"; };
		BE10D2C120FCC68300B616FA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
		BE10D2C921020B8500B616FA /* EscortDecomposingSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EscortDecomposingSpec.swift; sourceTree = "<group>"; };
		BE10D2CB2103125F00B616FA /* EscortExtractSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EscortExtractSpec.swift; sourceTree = "<group>"; };
		BE1650DA210D994300868737 /* EscortDateRoles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EscortDateRoles.swift; sourceTree = "<group>"; };
		BE1650DC210DAC5700868737 /* EscortClassSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EscortClassSpec.swift; sourceTree = "<group>"; };
		BE1650DE212037FD00868737 /* EscortAdjustingDatesSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EscortAdjustingDatesSpec.swift; sourceTree = "<group>"; };
		BE1650E02121340B00868737 /* EscortRetrievingIntervalsSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EscortRetrievingIntervalsSpec.swift; sourceTree = "<group>"; };
		BE5B7B0B1BBFB048005732C2 /* Benchmark.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Benchmark.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
		BE5B7B0F1BBFB048005732C2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
		BE5B7B131BBFB0AD005732C2 /* BenchMakeFormReferenceDate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BenchMakeFormReferenceDate.m; sourceTree = "<group>"; };
		BEAD6D3D1EB337AA004A4A3B /* EscortAmountOfSpecs.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EscortAmountOfSpecs.m; sourceTree = "<group>"; };
		C5BD6A37196287E30053103A /* AZNSDateKiwiMatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AZNSDateKiwiMatcher.h; sourceTree = "<group>"; };
		C5BD6A38196287E30053103A /* AZNSDateKiwiMatcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AZNSDateKiwiMatcher.m; sourceTree = "<group>"; };
		CF296903783DAA88609CE74A /* Pods-SwiftTest.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SwiftTest.release.xcconfig"; path = "Pods/Target Support Files/Pods-SwiftTest/Pods-SwiftTest.release.xcconfig"; sourceTree = "<group>"; };
		E747142ADB2B90EBAEE2595E /* Pods-SwiftTest.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SwiftTest.debug.xcconfig"; path = "Pods/Target Support Files/Pods-SwiftTest/Pods-SwiftTest.debug.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
		73FCA16B18DE837D009ED4AD /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
				B8D01A3E899B060C25CC4398 /* libPods-Test.a in Frameworks */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		BE0BE9981E9B221000D736C7 /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		BE0BE9A61E9B238F00D736C7 /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		BE10D2BA20FCC68200B616FA /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
				BE10D2C220FCC68300B616FA /* NSDate_Escort_Cocoa.framework in Frameworks */,
				D61E21D1C84D29A4E5422F51 /* libPods-SwiftTest.a in Frameworks */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		BE5B7B081BBFB048005732C2 /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
		17B5C141C52FB324DABC53BC /* FakeDateUtil */ = {
			isa = PBXGroup;
			children = (
				17B5CF001E83A221023FE180 /* FakeDateUtil.m */,
				17B5C69FBFA4113BF4F99F02 /* FakeDateUtil.h */,
			);
			path = FakeDateUtil;
			sourceTree = "<group>";
		};
		17B5C4F653B336A415A1AD4C /* NSDate-Escort */ = {
			isa = PBXGroup;
			children = (
				17B5C8039CF17DE12A52A9B3 /* NSDate+Escort.h */,
				17B5C5CD74BE7F1C57C3F0DB /* NSDate+Escort.m */,
				BE10D2B720FCC65600B616FA /* Date+Escort.swift */,
			);
			path = "NSDate-Escort";
			sourceTree = "<group>";
		};
		17B5CC2CE306C225BB3E62CC /* Lib */ = {
			isa = PBXGroup;
			children = (
				17B5C141C52FB324DABC53BC /* FakeDateUtil */,
			);
			path = Lib;
			sourceTree = "<group>";
		};
		7355ABD217638E8900DD1EC2 = {
			isa = PBXGroup;
			children = (
				73FCA17218DE837D009ED4AD /* Test */,
				BE5B7B0C1BBFB048005732C2 /* Benchmark */,
				BE0BE99D1E9B221000D736C7 /* NSDate-Escort_Cocoa */,
				BE0BE9AB1E9B238F00D736C7 /* NSDate_Escort_iOS */,
				BE10D2BE20FCC68300B616FA /* SwiftTest */,
				7355ABE017638E9600DD1EC2 /* Frameworks */,
				7355ABDF17638E9600DD1EC2 /* Products */,
				17B5C4F653B336A415A1AD4C /* NSDate-Escort */,
				17B5C2FFCAB36B1E0C17E2BF /* readme.md */,
				E3F719C54382129B7C172924 /* Pods */,
			);
			sourceTree = "<group>";
		};
		7355ABDF17638E9600DD1EC2 /* Products */ = {
			isa = PBXGroup;
			children = (
				73FCA16E18DE837D009ED4AD /* Test.xctest */,
				BE5B7B0B1BBFB048005732C2 /* Benchmark.xctest */,
				BE0BE99C1E9B221000D736C7 /* NSDate_Escort_Cocoa.framework */,
				BE0BE9AA1E9B238F00D736C7 /* NSDate_Escort_iOS.framework */,
				BE10D2BD20FCC68200B616FA /* SwiftTest.xctest */,
			);
			name = Products;
			sourceTree = "<group>";
		};
		7355ABE017638E9600DD1EC2 /* Frameworks */ = {
			isa = PBXGroup;
			children = (
				8BFDB70869B017E5594994DF /* libPods-Test.a */,
				7B01BA43AF189F3F78DC164D /* libPods-SwiftTest.a */,
			);
			name = Frameworks;
			sourceTree = "<group>";
		};
		73FCA17218DE837D009ED4AD /* Test */ = {
			isa = PBXGroup;
			children = (
				17B5CC2CE306C225BB3E62CC /* Lib */,
				C5BD6A34196287E30053103A /* Matcher */,
				73FCA17318DE837D009ED4AD /* Supporting Files */,
				17B5CA6E7413A743441E0EF2 /* EscortDecomposingSpec.m */,
				17B5CC3FA3B3583B8AC95DD8 /* EscortCacheSpec.m */,
				17B5C01AAD723EBDDDCC62A1 /* EscortDateRoles.m */,
				17B5C809EA2391FF7D79ECD6 /* EscortComparingSpec.m */,
				17B5CF5E44E63D16B9757F5F /* EscortClassSpec.m */,
				17B5C79FDE62EDC8C21A9FFC /* EscortAdjustingDatesSpec.m */,
				17B5C3CB2F1D7F92A7D5D185 /* EscortRetrievingIntervalsSpec.m */,
				BEAD6D3D1EB337AA004A4A3B /* EscortAmountOfSpecs.m */,
			);
			path = Test;
			sourceTree = "<group>";
		};
		73FCA17318DE837D009ED4AD /* Supporting Files */ = {
			isa = PBXGroup;
			children = (
				73FCA17418DE837D009ED4AD /* Test-Info.plist */,
				73FCA17518DE837D009ED4AD /* InfoPlist.strings */,
				73FCA17A18DE837D009ED4AD /* Test-Prefix.pch */,
			);
			name = "Supporting Files";
			sourceTree = "<group>";
		};
		BE0BE99D1E9B221000D736C7 /* NSDate-Escort_Cocoa */ = {
			isa = PBXGroup;
			children = (
				BE0BE99E1E9B221000D736C7 /* NSDate-Escort.h */,
				BE0BE99F1E9B221000D736C7 /* Info.plist */,
			);
			name = "NSDate-Escort_Cocoa";
			path = "NSDate-Escort";
			sourceTree = "<group>";
		};
		BE0BE9AB1E9B238F00D736C7 /* NSDate_Escort_iOS */ = {
			isa = PBXGroup;
			children = (
				BE0BE9AC1E9B238F00D736C7 /* NSDate_Escort_iOS.h */,
				BE0BE9AD1E9B238F00D736C7 /* Info.plist */,
			);
			path = NSDate_Escort_iOS;
			sourceTree = "<group>";
		};
		BE10D2BE20FCC68300B616FA /* SwiftTest */ = {
			isa = PBXGroup;
			children = (
				BE1650DE212037FD00868737 /* EscortAdjustingDatesSpec.swift */,
				BE1650DC210DAC5700868737 /* EscortClassSpec.swift */,
				BE10D2BF20FCC68300B616FA /* EscortComparingSpec.swift */,
				BE1650DA210D994300868737 /* EscortDateRoles.swift */,
				BE10D2C921020B8500B616FA /* EscortDecomposingSpec.swift */,
				BE10D2CB2103125F00B616FA /* EscortExtractSpec.swift */,
				BE1650E02121340B00868737 /* EscortRetrievingIntervalsSpec.swift */,
				BE10D2C120FCC68300B616FA /* Info.plist */,
			);
			path = SwiftTest;
			sourceTree = "<group>";
		};
		BE5B7B0C1BBFB048005732C2 /* Benchmark */ = {
			isa = PBXGroup;
			children = (
				BE5B7B131BBFB0AD005732C2 /* BenchMakeFormReferenceDate.m */,
				BE5B7B0F1BBFB048005732C2 /* Info.plist */,
			);
			path = Benchmark;
			sourceTree = "<group>";
		};
		C5BD6A34196287E30053103A /* Matcher */ = {
			isa = PBXGroup;
			children = (
				C5BD6A37196287E30053103A /* AZNSDateKiwiMatcher.h */,
				C5BD6A38196287E30053103A /* AZNSDateKiwiMatcher.m */,
			);
			path = Matcher;
			sourceTree = "<group>";
		};
		E3F719C54382129B7C172924 /* Pods */ = {
			isa = PBXGroup;
			children = (
				6DD8C2208BC805D0B99E5503 /* Pods-Test.debug.xcconfig */,
				5DBBC214A3239FD7DB605EF7 /* Pods-Test.release.xcconfig */,
				E747142ADB2B90EBAEE2595E /* Pods-SwiftTest.debug.xcconfig */,
				CF296903783DAA88609CE74A /* Pods-SwiftTest.release.xcconfig */,
			);
			name = Pods;
			sourceTree = "<group>";
		};
/* End PBXGroup section */

/* Begin PBXHeadersBuildPhase section */
		BE0BE9991E9B221000D736C7 /* Headers */ = {
			isa = PBXHeadersBuildPhase;
			buildActionMask = 2147483647;
			files = (
				BE0BE9A01E9B221000D736C7 /* NSDate-Escort.h in Headers */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		BE0BE9A71E9B238F00D736C7 /* Headers */ = {
			isa = PBXHeadersBuildPhase;
			buildActionMask = 2147483647;
			files = (
				BE0BE9AE1E9B238F00D736C7 /* NSDate_Escort_iOS.h in Headers */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXHeadersBuildPhase section */

/* Begin PBXNativeTarget section */
		73FCA16D18DE837D009ED4AD /* Test */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = 73FCA17D18DE837D009ED4AD /* Build configuration list for PBXNativeTarget "Test" */;
			buildPhases = (
				E37CDD676E2886EF4585F0C5 /* [CP] Check Pods Manifest.lock */,
				E4401CC6F9B84993A398AD96 /* Check Pods Manifest.lock */,
				73FCA16A18DE837D009ED4AD /* Sources */,
				73FCA16B18DE837D009ED4AD /* Frameworks */,
				73FCA16C18DE837D009ED4AD /* Resources */,
			);
			buildRules = (
			);
			dependencies = (
			);
			name = Test;
			productName = Test;
			productReference = 73FCA16E18DE837D009ED4AD /* Test.xctest */;
			productType = "com.apple.product-type.bundle.unit-test";
		};
		BE0BE99B1E9B221000D736C7 /* NSDate_Escort_Cocoa */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = BE0BE9A31E9B221000D736C7 /* Build configuration list for PBXNativeTarget "NSDate_Escort_Cocoa" */;
			buildPhases = (
				BE0BE9971E9B221000D736C7 /* Sources */,
				BE0BE9981E9B221000D736C7 /* Frameworks */,
				BE0BE9991E9B221000D736C7 /* Headers */,
				BE0BE99A1E9B221000D736C7 /* Resources */,
			);
			buildRules = (
			);
			dependencies = (
			);
			name = NSDate_Escort_Cocoa;
			productName = "NSDate-Escort";
			productReference = BE0BE99C1E9B221000D736C7 /* NSDate_Escort_Cocoa.framework */;
			productType = "com.apple.product-type.framework";
		};
		BE0BE9A91E9B238F00D736C7 /* NSDate_Escort_iOS */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = BE0BE9B11E9B238F00D736C7 /* Build configuration list for PBXNativeTarget "NSDate_Escort_iOS" */;
			buildPhases = (
				BE0BE9A51E9B238F00D736C7 /* Sources */,
				BE0BE9A61E9B238F00D736C7 /* Frameworks */,
				BE0BE9A71E9B238F00D736C7 /* Headers */,
				BE0BE9A81E9B238F00D736C7 /* Resources */,
			);
			buildRules = (
			);
			dependencies = (
			);
			name = NSDate_Escort_iOS;
			productName = NSDate_Escort_iOS;
			productReference = BE0BE9AA1E9B238F00D736C7 /* NSDate_Escort_iOS.framework */;
			productType = "com.apple.product-type.framework";
		};
		BE10D2BC20FCC68200B616FA /* SwiftTest */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = BE10D2C520FCC68300B616FA /* Build configuration list for PBXNativeTarget "SwiftTest" */;
			buildPhases = (
				9078C6BD826678D6E826CCBC /* [CP] Check Pods Manifest.lock */,
				BE10D2B920FCC68200B616FA /* Sources */,
				BE10D2BA20FCC68200B616FA /* Frameworks */,
				BE10D2BB20FCC68200B616FA /* Resources */,
			);
			buildRules = (
			);
			dependencies = (
				BE10D2C420FCC68300B616FA /* PBXTargetDependency */,
			);
			name = SwiftTest;
			productName = SwiftTest;
			productReference = BE10D2BD20FCC68200B616FA /* SwiftTest.xctest */;
			productType = "com.apple.product-type.bundle.unit-test";
		};
		BE5B7B0A1BBFB048005732C2 /* Benchmark */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = BE5B7B101BBFB048005732C2 /* Build configuration list for PBXNativeTarget "Benchmark" */;
			buildPhases = (
				BE5B7B071BBFB048005732C2 /* Sources */,
				BE5B7B081BBFB048005732C2 /* Frameworks */,
				BE5B7B091BBFB048005732C2 /* Resources */,
			);
			buildRules = (
			);
			dependencies = (
			);
			name = Benchmark;
			productName = Benchmark;
			productReference = BE5B7B0B1BBFB048005732C2 /* Benchmark.xctest */;
			productType = "com.apple.product-type.bundle.unit-test";
		};
/* End PBXNativeTarget section */

/* Begin PBXProject section */
		7355ABD317638E8900DD1EC2 /* Project object */ = {
			isa = PBXProject;
			attributes = {
				LastSwiftUpdateCheck = 0940;
				LastUpgradeCheck = 1020;
				TargetAttributes = {
					73FCA16D18DE837D009ED4AD = {
						LastSwiftMigration = 0940;
					};
					BE0BE99B1E9B221000D736C7 = {
						CreatedOnToolsVersion = 8.2.1;
						ProvisioningStyle = Automatic;
					};
					BE0BE9A91E9B238F00D736C7 = {
						CreatedOnToolsVersion = 8.2.1;
						ProvisioningStyle = Automatic;
					};
					BE10D2BC20FCC68200B616FA = {
						CreatedOnToolsVersion = 9.4.1;
						ProvisioningStyle = Automatic;
					};
					BE5B7B0A1BBFB048005732C2 = {
						CreatedOnToolsVersion = 7.0;
					};
				};
			};
			buildConfigurationList = 7355ABD617638E8900DD1EC2 /* Build configuration list for PBXProject "NSDate-Escort" */;
			compatibilityVersion = "Xcode 3.2";
			developmentRegion = English;
			hasScannedForEncodings = 0;
			knownRegions = (
				English,
				en,
				Base,
			);
			mainGroup = 7355ABD217638E8900DD1EC2;
			productRefGroup = 7355ABDF17638E9600DD1EC2 /* Products */;
			projectDirPath = "";
			projectRoot = "";
			targets = (
				73FCA16D18DE837D009ED4AD /* Test */,
				BE5B7B0A1BBFB048005732C2 /* Benchmark */,
				BE0BE99B1E9B221000D736C7 /* NSDate_Escort_Cocoa */,
				BE0BE9A91E9B238F00D736C7 /* NSDate_Escort_iOS */,
				BE10D2BC20FCC68200B616FA /* SwiftTest */,
			);
		};
/* End PBXProject section */

/* Begin PBXResourcesBuildPhase section */
		73FCA16C18DE837D009ED4AD /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				73FCA17718DE837D009ED4AD /* InfoPlist.strings in Resources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		BE0BE99A1E9B221000D736C7 /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		BE0BE9A81E9B238F00D736C7 /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		BE10D2BB20FCC68200B616FA /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		BE5B7B091BBFB048005732C2 /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXResourcesBuildPhase section */

/* Begin PBXShellScriptBuildPhase section */
		9078C6BD826678D6E826CCBC /* [CP] Check Pods Manifest.lock */ = {
			isa = PBXShellScriptBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			inputPaths = (
				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
				"${PODS_ROOT}/Manifest.lock",
			);
			name = "[CP] Check Pods Manifest.lock";
			outputPaths = (
				"$(DERIVED_FILE_DIR)/Pods-SwiftTest-checkManifestLockResult.txt",
			);
			runOnlyForDeploymentPostprocessing = 0;
			shellPath = /bin/sh;
			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
			showEnvVarsInLog = 0;
		};
		E37CDD676E2886EF4585F0C5 /* [CP] Check Pods Manifest.lock */ = {
			isa = PBXShellScriptBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			inputPaths = (
				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
				"${PODS_ROOT}/Manifest.lock",
			);
			name = "[CP] Check Pods Manifest.lock";
			outputPaths = (
				"$(DERIVED_FILE_DIR)/Pods-Test-checkManifestLockResult.txt",
			);
			runOnlyForDeploymentPostprocessing = 0;
			shellPath = /bin/sh;
			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
			showEnvVarsInLog = 0;
		};
		E4401CC6F9B84993A398AD96 /* Check Pods Manifest.lock */ = {
			isa = PBXShellScriptBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			inputPaths = (
			);
			name = "Check Pods Manifest.lock";
			outputPaths = (
			);
			runOnlyForDeploymentPostprocessing = 0;
			shellPath = /bin/sh;
			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n    cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n    exit 1\nfi\n";
			showEnvVarsInLog = 0;
		};
/* End PBXShellScriptBuildPhase section */

/* Begin PBXSourcesBuildPhase section */
		73FCA16A18DE837D009ED4AD /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				17B5C28A17FECDD022B846E6 /* NSDate+Escort.m in Sources */,
				17B5C9F98AC409F47299D54B /* EscortDecomposingSpec.m in Sources */,
				17B5C474F10F4D9620AFFACC /* FakeDateUtil.m in Sources */,
				BEAD6D3E1EB337AA004A4A3B /* EscortAmountOfSpecs.m in Sources */,
				17B5C94FD65CD923332ED3EE /* EscortCacheSpec.m in Sources */,
				C5BD6A3A196287E30053103A /* AZNSDateKiwiMatcher.m in Sources */,
				17B5CEF22C864A71F222AF9B /* EscortDateRoles.m in Sources */,
				17B5C584E29A91E50FA691ED /* EscortComparingSpec.m in Sources */,
				17B5CB0E0DEEAA0B86DB6754 /* EscortClassSpec.m in Sources */,
				17B5CCF9CEC128B380974AF7 /* EscortAdjustingDatesSpec.m in Sources */,
				17B5CD2E9AD0EF4A499B5DC2 /* EscortRetrievingIntervalsSpec.m in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		BE0BE9971E9B221000D736C7 /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				BE0BE9A41E9B221D00D736C7 /* NSDate+Escort.m in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		BE0BE9A51E9B238F00D736C7 /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		BE10D2B920FCC68200B616FA /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				BE1650E12121340B00868737 /* EscortRetrievingIntervalsSpec.swift in Sources */,
				BE1650DF212037FD00868737 /* EscortAdjustingDatesSpec.swift in Sources */,
				BE10D2CC2103125F00B616FA /* EscortExtractSpec.swift in Sources */,
				BE10D2C020FCC68300B616FA /* EscortComparingSpec.swift in Sources */,
				BE10D2CA21020B8500B616FA /* EscortDecomposingSpec.swift in Sources */,
				BE10D2C820FCC68B00B616FA /* Date+Escort.swift in Sources */,
				BE1650DB210D994300868737 /* EscortDateRoles.swift in Sources */,
				BE1650DD210DAC5700868737 /* EscortClassSpec.swift in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		BE5B7B071BBFB048005732C2 /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				BE5B7B151BBFB0AD005732C2 /* BenchMakeFormReferenceDate.m in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXSourcesBuildPhase section */

/* Begin PBXTargetDependency section */
		BE10D2C420FCC68300B616FA /* PBXTargetDependency */ = {
			isa = PBXTargetDependency;
			target = BE0BE99B1E9B221000D736C7 /* NSDate_Escort_Cocoa */;
			targetProxy = BE10D2C320FCC68300B616FA /* PBXContainerItemProxy */;
		};
/* End PBXTargetDependency section */

/* Begin PBXVariantGroup section */
		73FCA17518DE837D009ED4AD /* InfoPlist.strings */ = {
			isa = PBXVariantGroup;
			children = (
				73FCA17618DE837D009ED4AD /* en */,
			);
			name = InfoPlist.strings;
			sourceTree = "<group>";
		};
/* End PBXVariantGroup section */

/* Begin XCBuildConfiguration section */
		7355ABD717638E8900DD1EC2 /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_COMMA = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
				CLANG_WARN_STRICT_PROTOTYPES = YES;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				ENABLE_TESTABILITY = YES;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				IPHONEOS_DEPLOYMENT_TARGET = 12.2;
				MACOSX_DEPLOYMENT_TARGET = 10.14;
				ONLY_ACTIVE_ARCH = YES;
				SDKROOT = macosx;
				SWIFT_VERSION = 5.0;
			};
			name = Debug;
		};
		7355ABD817638E8900DD1EC2 /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_COMMA = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
				CLANG_WARN_STRICT_PROTOTYPES = YES;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				IPHONEOS_DEPLOYMENT_TARGET = 12.2;
				MACOSX_DEPLOYMENT_TARGET = 10.14;
				SDKROOT = macosx;
				SWIFT_COMPILATION_MODE = wholemodule;
				SWIFT_VERSION = 5.0;
			};
			name = Release;
		};
		73FCA17E18DE837D009ED4AD /* Debug */ = {
			isa = XCBuildConfiguration;
			baseConfigurationReference = 6DD8C2208BC805D0B99E5503 /* Pods-Test.debug.xcconfig */;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				COPY_PHASE_STRIP = NO;
				FRAMEWORK_SEARCH_PATHS = (
					"$(SDKROOT)/Developer/Library/Frameworks",
					"$(inherited)",
					"$(DEVELOPER_FRAMEWORKS_DIR)",
				);
				GCC_C_LANGUAGE_STANDARD = gnu99;
				GCC_DYNAMIC_NO_PIC = NO;
				GCC_OPTIMIZATION_LEVEL = 0;
				GCC_PRECOMPILE_PREFIX_HEADER = YES;
				GCC_PREFIX_HEADER = "Test/Test-Prefix.pch";
				GCC_PREPROCESSOR_DEFINITIONS = (
					"DEBUG=1",
					"$(inherited)",
				);
				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				INFOPLIST_FILE = "Test/Test-Info.plist";
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
				PRODUCT_BUNDLE_IDENTIFIER = "info.efcl.${PRODUCT_NAME:rfc1034identifier}";
				PRODUCT_NAME = "$(TARGET_NAME)";
				SDKROOT = iphoneos;
				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
				WRAPPER_EXTENSION = xctest;
			};
			name = Debug;
		};
		73FCA17F18DE837D009ED4AD /* Release */ = {
			isa = XCBuildConfiguration;
			baseConfigurationReference = 5DBBC214A3239FD7DB605EF7 /* Pods-Test.release.xcconfig */;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				COPY_PHASE_STRIP = YES;
				ENABLE_NS_ASSERTIONS = NO;
				FRAMEWORK_SEARCH_PATHS = (
					"$(SDKROOT)/Developer/Library/Frameworks",
					"$(inherited)",
					"$(DEVELOPER_FRAMEWORKS_DIR)",
				);
				GCC_C_LANGUAGE_STANDARD = gnu99;
				GCC_PRECOMPILE_PREFIX_HEADER = YES;
				GCC_PREFIX_HEADER = "Test/Test-Prefix.pch";
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				INFOPLIST_FILE = "Test/Test-Info.plist";
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
				PRODUCT_BUNDLE_IDENTIFIER = "info.efcl.${PRODUCT_NAME:rfc1034identifier}";
				PRODUCT_NAME = "$(TARGET_NAME)";
				SDKROOT = iphoneos;
				VALIDATE_PRODUCT = YES;
				WRAPPER_EXTENSION = xctest;
			};
			name = Release;
		};
		BE0BE9A11E9B221000D736C7 /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_ANALYZER_NONNULL = YES;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				CODE_SIGN_IDENTITY = "-";
				COMBINE_HIDPI_IMAGES = YES;
				COPY_PHASE_STRIP = NO;
				CURRENT_PROJECT_VERSION = 1;
				DEBUG_INFORMATION_FORMAT = dwarf;
				DEFINES_MODULE = YES;
				DYLIB_COMPATIBILITY_VERSION = 1;
				DYLIB_CURRENT_VERSION = 1;
				DYLIB_INSTALL_NAME_BASE = "@rpath";
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				FRAMEWORK_VERSION = A;
				GCC_C_LANGUAGE_STANDARD = gnu99;
				GCC_DYNAMIC_NO_PIC = NO;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_OPTIMIZATION_LEVEL = 0;
				GCC_PREPROCESSOR_DEFINITIONS = (
					"DEBUG=1",
					"$(inherited)",
				);
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				INFOPLIST_FILE = "NSDate-Escort_Cocoa/Info.plist";
				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
				MTL_ENABLE_DEBUG_INFO = YES;
				PRODUCT_BUNDLE_IDENTIFIER = "Escort.NSDate-Escort";
				PRODUCT_NAME = "$(TARGET_NAME)";
				SDKROOT = iphoneos;
				SKIP_INSTALL = YES;
				VERSIONING_SYSTEM = "apple-generic";
				VERSION_INFO_PREFIX = "";
			};
			name = Debug;
		};
		BE0BE9A21E9B221000D736C7 /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_ANALYZER_NONNULL = YES;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				CODE_SIGN_IDENTITY = "-";
				COMBINE_HIDPI_IMAGES = YES;
				COPY_PHASE_STRIP = NO;
				CURRENT_PROJECT_VERSION = 1;
				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
				DEFINES_MODULE = YES;
				DYLIB_COMPATIBILITY_VERSION = 1;
				DYLIB_CURRENT_VERSION = 1;
				DYLIB_INSTALL_NAME_BASE = "@rpath";
				ENABLE_NS_ASSERTIONS = NO;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				FRAMEWORK_VERSION = A;
				GCC_C_LANGUAGE_STANDARD = gnu99;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				INFOPLIST_FILE = "NSDate-Escort_Cocoa/Info.plist";
				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
				MTL_ENABLE_DEBUG_INFO = NO;
				PRODUCT_BUNDLE_IDENTIFIER = "Escort.NSDate-Escort";
				PRODUCT_NAME = "$(TARGET_NAME)";
				SDKROOT = iphoneos;
				SKIP_INSTALL = YES;
				VERSIONING_SYSTEM = "apple-generic";
				VERSION_INFO_PREFIX = "";
			};
			name = Release;
		};
		BE0BE9AF1E9B238F00D736C7 /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_ANALYZER_NONNULL = YES;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				CODE_SIGN_IDENTITY = "";
				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
				COPY_PHASE_STRIP = NO;
				CURRENT_PROJECT_VERSION = 1;
				DEBUG_INFORMATION_FORMAT = dwarf;
				DEFINES_MODULE = YES;
				DYLIB_COMPATIBILITY_VERSION = 1;
				DYLIB_CURRENT_VERSION = 1;
				DYLIB_INSTALL_NAME_BASE = "@rpath";
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				GCC_C_LANGUAGE_STANDARD = gnu99;
				GCC_DYNAMIC_NO_PIC = NO;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_OPTIMIZATION_LEVEL = 0;
				GCC_PREPROCESSOR_DEFINITIONS = (
					"DEBUG=1",
					"$(inherited)",
				);
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				INFOPLIST_FILE = NSDate_Escort_iOS/Info.plist;
				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
				MTL_ENABLE_DEBUG_INFO = YES;
				PRODUCT_BUNDLE_IDENTIFIER = "Escort.NSDate-Escort-iOS";
				PRODUCT_NAME = "$(TARGET_NAME)";
				SKIP_INSTALL = YES;
				TARGETED_DEVICE_FAMILY = "1,2";
				VERSIONING_SYSTEM = "apple-generic";
				VERSION_INFO_PREFIX = "";
			};
			name = Debug;
		};
		BE0BE9B01E9B238F00D736C7 /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_ANALYZER_NONNULL = YES;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				CODE_SIGN_IDENTITY = "";
				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
				COPY_PHASE_STRIP = NO;
				CURRENT_PROJECT_VERSION = 1;
				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
				DEFINES_MODULE = YES;
				DYLIB_COMPATIBILITY_VERSION = 1;
				DYLIB_CURRENT_VERSION = 1;
				DYLIB_INSTALL_NAME_BASE = "@rpath";
				ENABLE_NS_ASSERTIONS = NO;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				GCC_C_LANGUAGE_STANDARD = gnu99;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				INFOPLIST_FILE = NSDate_Escort_iOS/Info.plist;
				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
				MTL_ENABLE_DEBUG_INFO = NO;
				PRODUCT_BUNDLE_IDENTIFIER = "Escort.NSDate-Escort-iOS";
				PRODUCT_NAME = "$(TARGET_NAME)";
				SKIP_INSTALL = YES;
				TARGETED_DEVICE_FAMILY = "1,2";
				VALIDATE_PRODUCT = YES;
				VERSIONING_SYSTEM = "apple-generic";
				VERSION_INFO_PREFIX = "";
			};
			name = Release;
		};
		BE10D2C620FCC68300B616FA /* Debug */ = {
			isa = XCBuildConfiguration;
			baseConfigurationReference = E747142ADB2B90EBAEE2595E /* Pods-SwiftTest.debug.xcconfig */;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_ANALYZER_NONNULL = YES;
				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_ENABLE_OBJC_WEAK = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
				CODE_SIGN_IDENTITY = "iPhone Developer";
				CODE_SIGN_STYLE = Automatic;
				COPY_PHASE_STRIP = NO;
				DEBUG_INFORMATION_FORMAT = dwarf;
				DEVELOPMENT_TEAM = "";
				GCC_C_LANGUAGE_STANDARD = gnu11;
				GCC_DYNAMIC_NO_PIC = NO;
				GCC_OPTIMIZATION_LEVEL = 0;
				GCC_PREPROCESSOR_DEFINITIONS = (
					"DEBUG=1",
					"$(inherited)",
				);
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				INFOPLIST_FILE = SwiftTest/Info.plist;
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
				MTL_ENABLE_DEBUG_INFO = YES;
				PRODUCT_BUNDLE_IDENTIFIER = com.akuraru.SwiftTest;
				PRODUCT_NAME = "$(TARGET_NAME)";
				SDKROOT = iphoneos;
				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
				TARGETED_DEVICE_FAMILY = "1,2";
			};
			name = Debug;
		};
		BE10D2C720FCC68300B616FA /* Release */ = {
			isa = XCBuildConfiguration;
			baseConfigurationReference = CF296903783DAA88609CE74A /* Pods-SwiftTest.release.xcconfig */;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_ANALYZER_NONNULL = YES;
				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_ENABLE_OBJC_WEAK = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
				CODE_SIGN_IDENTITY = "iPhone Developer";
				CODE_SIGN_STYLE = Automatic;
				COPY_PHASE_STRIP = NO;
				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
				DEVELOPMENT_TEAM = "";
				ENABLE_NS_ASSERTIONS = NO;
				GCC_C_LANGUAGE_STANDARD = gnu11;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				INFOPLIST_FILE = SwiftTest/Info.plist;
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
				MTL_ENABLE_DEBUG_INFO = NO;
				PRODUCT_BUNDLE_IDENTIFIER = com.akuraru.SwiftTest;
				PRODUCT_NAME = "$(TARGET_NAME)";
				SDKROOT = iphoneos;
				SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
				TARGETED_DEVICE_FAMILY = "1,2";
				VALIDATE_PRODUCT = YES;
			};
			name = Release;
		};
		BE5B7B111BBFB048005732C2 /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				COMBINE_HIDPI_IMAGES = YES;
				COPY_PHASE_STRIP = NO;
				DEBUG_INFORMATION_FORMAT = dwarf;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				GCC_C_LANGUAGE_STANDARD = gnu99;
				GCC_DYNAMIC_NO_PIC = NO;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_OPTIMIZATION_LEVEL = 0;
				GCC_PREPROCESSOR_DEFINITIONS = (
					"DEBUG=1",
					"$(inherited)",
				);
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				INFOPLIST_FILE = Benchmark/Info.plist;
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
				MTL_ENABLE_DEBUG_INFO = YES;
				PRODUCT_BUNDLE_IDENTIFIER = jp.co.plusr.Benchmark;
				PRODUCT_NAME = "$(TARGET_NAME)";
				SDKROOT = macosx;
			};
			name = Debug;
		};
		BE5B7B121BBFB048005732C2 /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				COMBINE_HIDPI_IMAGES = YES;
				COPY_PHASE_STRIP = NO;
				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
				ENABLE_NS_ASSERTIONS = NO;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				GCC_C_LANGUAGE_STANDARD = gnu99;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				INFOPLIST_FILE = Benchmark/Info.plist;
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
				MTL_ENABLE_DEBUG_INFO = NO;
				PRODUCT_BUNDLE_IDENTIFIER = jp.co.plusr.Benchmark;
				PRODUCT_NAME = "$(TARGET_NAME)";
				SDKROOT = macosx;
			};
			name = Release;
		};
/* End XCBuildConfiguration section */

/* Begin XCConfigurationList section */
		7355ABD617638E8900DD1EC2 /* Build configuration list for PBXProject "NSDate-Escort" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				7355ABD717638E8900DD1EC2 /* Debug */,
				7355ABD817638E8900DD1EC2 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		73FCA17D18DE837D009ED4AD /* Build configuration list for PBXNativeTarget "Test" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				73FCA17E18DE837D009ED4AD /* Debug */,
				73FCA17F18DE837D009ED4AD /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		BE0BE9A31E9B221000D736C7 /* Build configuration list for PBXNativeTarget "NSDate_Escort_Cocoa" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				BE0BE9A11E9B221000D736C7 /* Debug */,
				BE0BE9A21E9B221000D736C7 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		BE0BE9B11E9B238F00D736C7 /* Build configuration list for PBXNativeTarget "NSDate_Escort_iOS" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				BE0BE9AF1E9B238F00D736C7 /* Debug */,
				BE0BE9B01E9B238F00D736C7 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		BE10D2C520FCC68300B616FA /* Build configuration list for PBXNativeTarget "SwiftTest" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				BE10D2C620FCC68300B616FA /* Debug */,
				BE10D2C720FCC68300B616FA /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		BE5B7B101BBFB048005732C2 /* Build configuration list for PBXNativeTarget "Benchmark" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				BE5B7B111BBFB048005732C2 /* Debug */,
				BE5B7B121BBFB048005732C2 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
/* End XCConfigurationList section */
	};
	rootObject = 7355ABD317638E8900DD1EC2 /* Project object */;
}


================================================
FILE: NSDate-Escort.xcodeproj/xcshareddata/xcschemes/NSDate_Escort.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
   LastUpgradeVersion = "1020"
   version = "1.3">
   <BuildAction
      parallelizeBuildables = "YES"
      buildImplicitDependencies = "YES">
      <BuildActionEntries>
         <BuildActionEntry
            buildForTesting = "YES"
            buildForRunning = "YES"
            buildForProfiling = "YES"
            buildForArchiving = "YES"
            buildForAnalyzing = "YES">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "BE0BE99B1E9B221000D736C7"
               BuildableName = "NSDate_Escort_Cocoa.framework"
               BlueprintName = "NSDate_Escort_Cocoa"
               ReferencedContainer = "container:NSDate-Escort.xcodeproj">
            </BuildableReference>
         </BuildActionEntry>
      </BuildActionEntries>
   </BuildAction>
   <TestAction
      buildConfiguration = "Debug"
      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
      shouldUseLaunchSchemeArgsEnv = "YES">
      <Testables>
         <TestableReference
            skipped = "NO">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "BE5B7B0A1BBFB048005732C2"
               BuildableName = "Benchmark.xctest"
               BlueprintName = "Benchmark"
               ReferencedContainer = "container:NSDate-Escort.xcodeproj">
            </BuildableReference>
         </TestableReference>
         <TestableReference
            skipped = "NO">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "BE10D2BC20FCC68200B616FA"
               BuildableName = "SwiftTest.xctest"
               BlueprintName = "SwiftTest"
               ReferencedContainer = "container:NSDate-Escort.xcodeproj">
            </BuildableReference>
         </TestableReference>
         <TestableReference
            skipped = "NO">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "73FCA16D18DE837D009ED4AD"
               BuildableName = "Test.xctest"
               BlueprintName = "Test"
               ReferencedContainer = "container:NSDate-Escort.xcodeproj">
            </BuildableReference>
         </TestableReference>
      </Testables>
      <MacroExpansion>
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "BE0BE99B1E9B221000D736C7"
            BuildableName = "NSDate_Escort_Cocoa.framework"
            BlueprintName = "NSDate_Escort_Cocoa"
            ReferencedContainer = "container:NSDate-Escort.xcodeproj">
         </BuildableReference>
      </MacroExpansion>
      <AdditionalOptions>
      </AdditionalOptions>
   </TestAction>
   <LaunchAction
      buildConfiguration = "Debug"
      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
      launchStyle = "0"
      useCustomWorkingDirectory = "NO"
      ignoresPersistentStateOnLaunch = "NO"
      debugDocumentVersioning = "YES"
      debugServiceExtension = "internal"
      allowLocationSimulation = "YES">
      <MacroExpansion>
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "BE0BE99B1E9B221000D736C7"
            BuildableName = "NSDate_Escort_Cocoa.framework"
            BlueprintName = "NSDate_Escort_Cocoa"
            ReferencedContainer = "container:NSDate-Escort.xcodeproj">
         </BuildableReference>
      </MacroExpansion>
      <AdditionalOptions>
      </AdditionalOptions>
   </LaunchAction>
   <ProfileAction
      buildConfiguration = "Release"
      shouldUseLaunchSchemeArgsEnv = "YES"
      savedToolIdentifier = ""
      useCustomWorkingDirectory = "NO"
      debugDocumentVersioning = "YES">
      <MacroExpansion>
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "BE0BE99B1E9B221000D736C7"
            BuildableName = "NSDate_Escort_Cocoa.framework"
            BlueprintName = "NSDate_Escort_Cocoa"
            ReferencedContainer = "container:NSDate-Escort.xcodeproj">
         </BuildableReference>
      </MacroExpansion>
   </ProfileAction>
   <AnalyzeAction
      buildConfiguration = "Debug">
   </AnalyzeAction>
   <ArchiveAction
      buildConfiguration = "Release"
      revealArchiveInOrganizer = "YES">
   </ArchiveAction>
</Scheme>


================================================
FILE: NSDate-Escort.xcodeproj/xcshareddata/xcschemes/NSDate_Escort_iOS.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
   LastUpgradeVersion = "1020"
   version = "1.3">
   <BuildAction
      parallelizeBuildables = "YES"
      buildImplicitDependencies = "YES">
      <BuildActionEntries>
         <BuildActionEntry
            buildForTesting = "YES"
            buildForRunning = "YES"
            buildForProfiling = "YES"
            buildForArchiving = "YES"
            buildForAnalyzing = "YES">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "BE0BE9A91E9B238F00D736C7"
               BuildableName = "NSDate_Escort_iOS.framework"
               BlueprintName = "NSDate_Escort_iOS"
               ReferencedContainer = "container:NSDate-Escort.xcodeproj">
            </BuildableReference>
         </BuildActionEntry>
      </BuildActionEntries>
   </BuildAction>
   <TestAction
      buildConfiguration = "Debug"
      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
      shouldUseLaunchSchemeArgsEnv = "YES">
      <Testables>
      </Testables>
      <AdditionalOptions>
      </AdditionalOptions>
   </TestAction>
   <LaunchAction
      buildConfiguration = "Debug"
      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
      launchStyle = "0"
      useCustomWorkingDirectory = "NO"
      ignoresPersistentStateOnLaunch = "NO"
      debugDocumentVersioning = "YES"
      debugServiceExtension = "internal"
      allowLocationSimulation = "YES">
      <MacroExpansion>
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "BE0BE9A91E9B238F00D736C7"
            BuildableName = "NSDate_Escort_iOS.framework"
            BlueprintName = "NSDate_Escort_iOS"
            ReferencedContainer = "container:NSDate-Escort.xcodeproj">
         </BuildableReference>
      </MacroExpansion>
      <AdditionalOptions>
      </AdditionalOptions>
   </LaunchAction>
   <ProfileAction
      buildConfiguration = "Release"
      shouldUseLaunchSchemeArgsEnv = "YES"
      savedToolIdentifier = ""
      useCustomWorkingDirectory = "NO"
      debugDocumentVersioning = "YES">
      <MacroExpansion>
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "BE0BE9A91E9B238F00D736C7"
            BuildableName = "NSDate_Escort_iOS.framework"
            BlueprintName = "NSDate_Escort_iOS"
            ReferencedContainer = "container:NSDate-Escort.xcodeproj">
         </BuildableReference>
      </MacroExpansion>
   </ProfileAction>
   <AnalyzeAction
      buildConfiguration = "Debug">
   </AnalyzeAction>
   <ArchiveAction
      buildConfiguration = "Release"
      revealArchiveInOrganizer = "YES">
   </ArchiveAction>
</Scheme>


================================================
FILE: NSDate-Escort.xcodeproj/xcshareddata/xcschemes/Test.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
   LastUpgradeVersion = "1020"
   version = "1.3">
   <BuildAction
      parallelizeBuildables = "YES"
      buildImplicitDependencies = "YES">
      <BuildActionEntries>
         <BuildActionEntry
            buildForTesting = "YES"
            buildForRunning = "YES"
            buildForProfiling = "YES"
            buildForArchiving = "YES"
            buildForAnalyzing = "YES">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "73FCA16D18DE837D009ED4AD"
               BuildableName = "Test.xctest"
               BlueprintName = "Test"
               ReferencedContainer = "container:NSDate-Escort.xcodeproj">
            </BuildableReference>
         </BuildActionEntry>
      </BuildActionEntries>
   </BuildAction>
   <TestAction
      buildConfiguration = "Debug"
      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
      shouldUseLaunchSchemeArgsEnv = "YES">
      <Testables>
         <TestableReference
            skipped = "NO">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "73FCA16D18DE837D009ED4AD"
               BuildableName = "Test.xctest"
               BlueprintName = "Test"
               ReferencedContainer = "container:NSDate-Escort.xcodeproj">
            </BuildableReference>
         </TestableReference>
         <TestableReference
            skipped = "NO">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "BE10D2BC20FCC68200B616FA"
               BuildableName = "SwiftTest.xctest"
               BlueprintName = "SwiftTest"
               ReferencedContainer = "container:NSDate-Escort.xcodeproj">
            </BuildableReference>
         </TestableReference>
      </Testables>
      <MacroExpansion>
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "73FCA16D18DE837D009ED4AD"
            BuildableName = "Test.xctest"
            BlueprintName = "Test"
            ReferencedContainer = "container:NSDate-Escort.xcodeproj">
         </BuildableReference>
      </MacroExpansion>
      <AdditionalOptions>
      </AdditionalOptions>
   </TestAction>
   <LaunchAction
      buildConfiguration = "Debug"
      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
      launchStyle = "0"
      useCustomWorkingDirectory = "NO"
      ignoresPersistentStateOnLaunch = "NO"
      debugDocumentVersioning = "YES"
      debugServiceExtension = "internal"
      allowLocationSimulation = "YES">
      <MacroExpansion>
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "73FCA16D18DE837D009ED4AD"
            BuildableName = "Test.xctest"
            BlueprintName = "Test"
            ReferencedContainer = "container:NSDate-Escort.xcodeproj">
         </BuildableReference>
      </MacroExpansion>
      <AdditionalOptions>
      </AdditionalOptions>
   </LaunchAction>
   <ProfileAction
      buildConfiguration = "Release"
      shouldUseLaunchSchemeArgsEnv = "YES"
      savedToolIdentifier = ""
      useCustomWorkingDirectory = "NO"
      debugDocumentVersioning = "YES">
      <MacroExpansion>
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "73FCA16D18DE837D009ED4AD"
            BuildableName = "Test.xctest"
            BlueprintName = "Test"
            ReferencedContainer = "container:NSDate-Escort.xcodeproj">
         </BuildableReference>
      </MacroExpansion>
   </ProfileAction>
   <AnalyzeAction
      buildConfiguration = "Debug">
   </AnalyzeAction>
   <ArchiveAction
      buildConfiguration = "Release"
      revealArchiveInOrganizer = "YES">
   </ArchiveAction>
</Scheme>


================================================
FILE: NSDate-Escort.xcworkspace/contents.xcworkspacedata
================================================
<?xml version='1.0' encoding='UTF-8'?><Workspace version='1.0'><FileRef location='group:NSDate-Escort.xcodeproj'/><FileRef location='group:Pods/Pods.xcodeproj'/></Workspace>

================================================
FILE: NSDate-Escort.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>IDEDidComputeMac32BitWarning</key>
	<true/>
</dict>
</plist>


================================================
FILE: NSDate-Escort_Cocoa/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>en</string>
	<key>CFBundleExecutable</key>
	<string>$(EXECUTABLE_NAME)</string>
	<key>CFBundleIdentifier</key>
	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>$(PRODUCT_NAME)</string>
	<key>CFBundlePackageType</key>
	<string>FMWK</string>
	<key>CFBundleShortVersionString</key>
	<string>1.0</string>
	<key>CFBundleVersion</key>
	<string>$(CURRENT_PROJECT_VERSION)</string>
	<key>NSPrincipalClass</key>
	<string></string>
</dict>
</plist>


================================================
FILE: NSDate-Escort_Cocoa/NSDate-Escort.h
================================================
//
//  NSDate-Escort.h
//  NSDate-Escort
//
//  Created by akuraru on 2017/04/10.
//
//

#import <Cocoa/Cocoa.h>

//! Project version number for NSDate-Escort.
FOUNDATION_EXPORT double NSDate_EscortVersionNumber;

//! Project version string for NSDate-Escort.
FOUNDATION_EXPORT const unsigned char NSDate_EscortVersionString[];

// In this header, you should import all the public headers of your framework using statements like #import <NSDate_Escort/PublicHeader.h>




================================================
FILE: NSDate_Escort_iOS/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>en</string>
	<key>CFBundleExecutable</key>
	<string>$(EXECUTABLE_NAME)</string>
	<key>CFBundleIdentifier</key>
	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>$(PRODUCT_NAME)</string>
	<key>CFBundlePackageType</key>
	<string>FMWK</string>
	<key>CFBundleShortVersionString</key>
	<string>1.0</string>
	<key>CFBundleVersion</key>
	<string>$(CURRENT_PROJECT_VERSION)</string>
	<key>NSPrincipalClass</key>
	<string></string>
</dict>
</plist>


================================================
FILE: NSDate_Escort_iOS/NSDate_Escort_iOS.h
================================================
//
//  NSDate_Escort_iOS.h
//  NSDate_Escort_iOS
//
//  Created by akuraru on 2017/04/10.
//
//

#import <UIKit/UIKit.h>

//! Project version number for NSDate_Escort_iOS.
FOUNDATION_EXPORT double NSDate_Escort_iOSVersionNumber;

//! Project version string for NSDate_Escort_iOS.
FOUNDATION_EXPORT const unsigned char NSDate_Escort_iOSVersionString[];

// In this header, you should import all the public headers of your framework using statements like #import <NSDate_Escort_iOS/PublicHeader.h>




================================================
FILE: Podfile
================================================
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '11.4'

target :Test do
	pod 'Kiwi'
	pod 'AZDateBuilder'
end

target :SwiftTest do
	swift_version= '4.2'
	pod 'Quick'
	pod 'AZDateBuilder/Swift'
end

================================================
FILE: README.md
================================================
# NSDate-Escort [![Build Status](https://travis-ci.org/azu/NSDate-Escort.png?branch=master)](https://travis-ci.org/azu/NSDate-Escort)

A NSDate Category library.

Current Status : **RELEASE**

## Proposal

- [NSDate-Extensions](https://github.com/erica/NSDate-Extensions "NSDate-Extensions") Compatible API
- Cache & Fast implement
- [[![Build Status](https://travis-ci.org/azu/NSDate-Escort.png?branch=master)](https://travis-ci.org/azu/NSDate-Escort)] Test Test Test!
- Test multiple languages
- MIT License

## Installation

### CocoaPods

1. ``pod 'NSDate-Escort'``

### D&D

1. Drag and drop the `NSDate-Escort` folder into your project.

## Usage

``` objc
/**
 Returns the calendarIdentifier of calendars that is used by this library for date calculation.
 @see AZ_setDefaultCalendarIdentifier: for more details.
 */
+ (NSString *)AZ_defaultCalendarIdentifier;
/**
 Sets the calendarIdentifier of calendars that is used by this library for date calculation.
 You can specify any calendarIdentifiers predefined by NSLocale. If you provide nil, the library uses
 [NSCalendar currentCalendar]. Default value is nil.

 You can't provide individual calendars for individual date objects. If you need to perform such
 complicated date calculations, you should rather create calendars on your own.
 */
+ (void)AZ_setDefaultCalendarIdentifier:(NSString *)calendarIdentifier;

#pragma mark - Relative dates from the current date

+ (NSDate *)dateTomorrow;
+ (NSDate *)dateYesterday;
+ (NSDate *)dateWithDaysFromNow:(NSInteger) dDays;
+ (NSDate *)dateWithDaysBeforeNow:(NSInteger) dDays;
+ (NSDate *)dateWithHoursFromNow:(NSInteger) dHours;
+ (NSDate *)dateWithHoursBeforeNow:(NSInteger) dHours;
+ (NSDate *)dateWithMinutesFromNow:(NSInteger) dMinutes;
+ (NSDate *)dateWithMinutesBeforeNow:(NSInteger) dMinutes;

#pragma mark - Comparing dates

- (BOOL)isEqualToDateIgnoringTime:(NSDate *) otherDate;
- (BOOL)isToday;
- (BOOL)isTomorrow;
- (BOOL)isYesterday;
- (BOOL)isSameWeekAsDate:(NSDate *) aDate;
- (BOOL)isThisWeek;
- (BOOL)isNextWeek;
- (BOOL)isLastWeek;
- (BOOL)isSameMonthAsDate:(NSDate *) aDate;
- (BOOL)isThisMonth;
- (BOOL)isSameYearAsDate:(NSDate *) aDate;
- (BOOL)isThisYear;
- (BOOL)isNextYear;
- (BOOL)isLastYear;
- (BOOL)isEarlierThanDate:(NSDate *) aDate;
- (BOOL)isLaterThanDate:(NSDate *) aDate;
- (BOOL)isEarlierThanOrEqualDate:(NSDate *) aDate;
- (BOOL)isLaterThanOrEqualDate:(NSDate *) aDate;
- (BOOL)isInFuture;
- (BOOL)isInPast;
#pragma mark - Date roles
- (BOOL)isTypicallyWorkday;
- (BOOL)isTypicallyWeekend;
#pragma mark - Adjusting dates
- (NSDate *)dateByAddingYears:(NSInteger) dYears;
- (NSDate *)dateBySubtractingYears:(NSInteger) dYears;
- (NSDate *)dateByAddingMonths:(NSInteger) dMonths;
- (NSDate *)dateBySubtractingMonths:(NSInteger) dMonths;
- (NSDate *)dateByAddingDays:(NSInteger) dDays;
- (NSDate *)dateBySubtractingDays:(NSInteger) dDays;
- (NSDate *)dateByAddingHours:(NSInteger) dHours;
- (NSDate *)dateBySubtractingHours:(NSInteger) dHours;
- (NSDate *)dateByAddingMinutes:(NSInteger) dMinutes;
- (NSDate *)dateBySubtractingMinutes:(NSInteger) dMinutes;
- (NSDate *)dateByAddingSeconds:(NSInteger) dSeconds;
- (NSDate *)dateBySubtractingSeconds:(NSInteger) dSeconds;
- (NSDate *)dateAtStartOfDay;
- (NSDate *)dateAtStartOfNextDay;
- (NSDate *)dateAtStartOfWeek;
- (NSDate *)dateAtStartOfNextWeek;
- (NSDate *)dateAtStartOfMonth;
- (NSDate *)dateAtStartOfNextMonth;
- (NSDate *)dateAtStartOfYear;
- (NSDate *)dateAtStartOfNextYear;

#pragma mark - Retrieving intervals
- (NSInteger)secondsAfterDate:(NSDate *) aDate;
- (NSInteger)secondsBeforeDate:(NSDate *) aDate;
- (NSInteger)minutesAfterDate:(NSDate *) aDate;
- (NSInteger)minutesBeforeDate:(NSDate *) aDate;
- (NSInteger)hoursAfterDate:(NSDate *) aDate;
- (NSInteger)hoursBeforeDate:(NSDate *) aDate;
- (NSInteger)daysAfterDate:(NSDate *) aDate;
- (NSInteger)daysBeforeDate:(NSDate *) aDate;
- (NSInteger)monthsAfterDate:(NSDate *) aDate;
- (NSInteger)monthsBeforeDate:(NSDate *) aDate;
- (NSInteger)distanceInDaysToDate:(NSDate *) aDate;

#pragma mark amount

- (NSInteger)hoursOfDay;
- (NSInteger)daysOfMonth;
- (NSInteger)daysOfYear;
- (NSInteger)monthsOfYear;

#pragma mark - Decomposing dates
/**
* return nearest hour
*/
@property(readonly) NSInteger nearestHour;
@property(readonly) NSInteger hour;
@property(readonly) NSInteger minute;
@property(readonly) NSInteger seconds;
@property(readonly) NSInteger day;
@property(readonly) NSInteger month;
@property(readonly) NSInteger week;
//  in the Gregorian calendar, n is 7 and Sunday is represented by 1.
@property(readonly) NSInteger weekday;
@property(readonly) NSInteger firstDayOfWeekday;
@property(readonly) NSInteger lastDayOfWeekday;
// e.g. 2nd Tuesday of the month == 2
@property(readonly) NSInteger nthWeekday;
@property(readonly) NSInteger year;
@property(readonly) NSInteger gregorianYear;
@end

NS_ASSUME_NONNULL_END

```

## Contributing

1. Fork it!
2. Create your feature branch: `git checkout -b my-new-feature`
3. Commit your changes: `git commit -am 'Add some feature'`
4. Push to the branch: `git push origin my-new-feature`
5. Submit a pull request :D

## Note

### What's the difference with [NSDate-Extensions](https://github.com/erica/NSDate-Extensions "NSDate-Extensions")?

This library has

* many test codes
* some additional methods.
* safely implements
* cache system

## Additional methods?

You should see `NSDate-Escort.h` :

``` objc
+ (NSString *)AZ_defaultCalendarIdentifier;
+ (void)AZ_setDefaultCalendarIdentifier:(NSString *)calendarIdentifier;

- (NSDate *)dateAtEndOfDay;
- (NSDate *)dateAtStartOfMonth;
- (NSDate *)dateAtEndOfMonth;
- (NSDate *)dateByAddingYears:(NSInteger) dYears;
- (NSDate *)dateBySubtractingYears:(NSInteger) dYears;
- (NSDate *)dateByAddingMonths:(NSInteger) dMonths;
- (NSDate *)dateBySubtractingMonths:(NSInteger) dMonths;
- (BOOL)isEarlierThanOrEqualDate:(NSDate *) aDate;
- (BOOL)isLaterThanOrEqualDate:(NSDate *) aDate;
- (NSInteger)monthsAfterDate:(NSDate *) aDate;
- (NSInteger)monthsBeforeDate:(NSDate *) aDate;
@property(readonly) NSInteger firstDayOfWeekday;
@property(readonly) NSInteger lastDayOfWeekday;
```

## Changelog

See [Releases · azu/NSDate-Escort](https://github.com/azu/NSDate-Escort/releases "Releases · azu/NSDate-Escort")

## License

MIT


================================================
FILE: SwiftTest/EscortAdjustingDatesSpec.swift
================================================
import XCTest
import Quick
import AZDateBuilder

class EscortAdjustingDatesSpec: QuickSpec {
    override func spec() {
        describe("add(day:)") {
            let currentDate = Date.date(by: [
                .year: 2010,
                .month: 10,
                .day: 11,
                .hour: 12,
                .minute: 13,
                .second: 14,
                ])
            it("add 0 day should return 2010-10-11") {
                XCTAssertEqual(currentDate, currentDate.add(day: 0))
            }
            it("add 1 day should return 2010-10-12") {
                let expectDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 12,
                    .hour: 12,
                    .minute: 13,
                    .second: 14,
                    ])
                XCTAssertEqual(expectDate, currentDate.add(day: 1))
            }
            it("add 30 days should return 2010-11-10") {
                let expectDate = Date.date(by: [
                    .year: 2010,
                    .month: 11,
                    .day: 10,
                    .hour: 12,
                    .minute: 13,
                    .second: 14,
                    ])
                XCTAssertEqual(expectDate, currentDate.add(day: 30))
            }
        }
        describe("add(hour:)") {
            let currentDate = Date.date(by: [
                .year: 2010,
                .month: 10,
                .day: 11,
                .hour: 12,
                .minute: 13,
                .second: 14,
                ])
            it("add 0 hour should return 2010-10-11 12") {
                XCTAssertEqual(currentDate, currentDate.add(hour: 0))
            }
            it("add 1 hour should return 2010-10-11 13") {
                let expectDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 11,
                    .hour: 13,
                    .minute: 13,
                    .second: 14,
                    ])
                XCTAssertEqual(expectDate, currentDate.add(hour: 1))
            }
            it("add 25 hours should return 2010-11-11 13") {
                let expectDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 12,
                    .hour: 13,
                    .minute: 13,
                    .second: 14,
                    ])
                XCTAssertEqual(expectDate, currentDate.add(hour: 25))
            }
        }
        describe("add(minute:)") {
            let currentDate = Date.date(by: [
                .year: 2010,
                .month: 10,
                .day: 11,
                .hour: 12,
                .minute: 13,
                .second: 14,
                ])
            it("add 0 minute should return 2010-10-11 12:13") {
                XCTAssertEqual(currentDate, currentDate.add(minute: 0))
            }
            it("add 1 minute should return 2010-10-11 12:14") {
                let expectDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 11,
                    .hour: 12,
                    .minute: 14,
                    .second: 14,
                    ])
                XCTAssertEqual(expectDate, currentDate.add(minute: 1))
            }
            it("add 60 minutes should return 2010-10-11 13:13") {
                let expectDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 11,
                    .hour: 13,
                    .minute: 13,
                    .second: 14,
                    ])
                XCTAssertEqual(expectDate, currentDate.add(minute: 60))
            }
        }
        describe("startDateOfYear") {
            let currentDate = Date.date(by: [
                .year: 2010,
                .month: 10,
                .day: 11,
                .hour: 12,
                .minute: 13,
                .second: 14,
                ])
            it("should return 2010-01-01 00:00:00") {
                let expectDate = Date.date(by: [
                    .year: 2010,
                    .month: 1,
                    .day: 1,
                    .hour: 0,
                    .minute: 0,
                    .second: 0,
                    ])
                XCTAssertEqual(expectDate, currentDate.startDateOfYear())
            }
        }
        describe("startDateOfMonth") {
            let currentDate = Date.date(by: [
                .year: 2010,
                .month: 10,
                .day: 11,
                .hour: 12,
                .minute: 13,
                .second: 14,
                ])
            it("should return 2010-10-01 00:00:00") {
                let expectDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 1,
                    .hour: 0,
                    .minute: 0,
                    .second: 0,
                    ])
                XCTAssertEqual(expectDate, currentDate.startDateOfMonth())
            }
        }
        describe("startDateOfWeek") {
            let currentDate = Date.date(by: [
                .year: 2010,
                .month: 10,
                .day: 11,
                .hour: 12,
                .minute: 13,
                .second: 14,
                ])
            it("should return 2010-10-10 00:00:00") {
                let expectDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 10,
                    .hour: 0,
                    .minute: 0,
                    .second: 0,
                    ])
                XCTAssertEqual(expectDate, currentDate.startDateOfWeekday())
            }
        }
        describe("startDateOfDay") {
            let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 11,
                    .hour: 12,
                    .minute: 13,
                    .second: 14,
                    ])
            it("should return 2010-10-11 00:00:00") {
                let expectDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 11,
                    .hour: 0,
                    .minute: 0,
                    .second: 0,
                    ])
                XCTAssertEqual(expectDate, currentDate.startDateOfDay())
            }
        }
    }
}


================================================
FILE: SwiftTest/EscortClassSpec.swift
================================================
import XCTest
import Quick
import AZDateBuilder

class EscortClassSpec: QuickSpec {
    override func spec() {
        describe("tomorrow") {
            let date = Date()
            it("should return add 1 day between 1 second") {
                let tomorrow = Date.tomorrow()
                let add1day = date.add(day: 1)
                XCTAssertTrue(add1day < tomorrow && tomorrow < add1day.add(second: 1))
            }
        }
        describe("yesterday") {
            let date = Date()
            it("should return subtract 1 day between 1 second") {
                let yesterday = Date.yesterday()
                let subtract1day = date.add(day: -1)
                XCTAssertTrue(subtract1day < yesterday && yesterday < subtract1day.add(second: 1))
            }
        }
    }
}


================================================
FILE: SwiftTest/EscortComparingSpec.swift
================================================
import XCTest
import Quick
import AZDateBuilder

class EscortComparingSpec: QuickSpec {
    override func spec() {
        describe("- isEqual(ignoringTime: date)") {
            let currentDate = Date()
            it("when same the date should be true") {
                XCTAssertTrue(currentDate.isEqual(ignoringTime: currentDate))
            }
            context("when target is today") {
                it("of start should return true") {
                    let beginOfDate = currentDate.date(by: [
                        .hour: 0,
                        .minute: 0,
                        .second: 0,
                        ])
                    XCTAssertTrue(currentDate.isEqual(ignoringTime: beginOfDate))
                }
                it("of end should return true") {
                    let endOfDate = currentDate.date(by: [
                        .hour: 0,
                        .minute: 0,
                        .second: 0,
                        ])
                    XCTAssertTrue(currentDate.isEqual(ignoringTime: endOfDate))
                }
            }
            it("when target is a later day should return false") {
                let laterDate = currentDate.date(by: [
                    .day: currentDate.day + Int(arc4random()) + 1,
                    .hour: 0,
                    .minute: 0,
                    .second: 0,
                    ])
                XCTAssertFalse(currentDate.isEqual(ignoringTime: laterDate))
            }
            it("when target is a earler day should return false") {
                let earlerDate = currentDate.date(by: [
                    .day: currentDate.day - Int(arc4random()) - 1,
                    .hour: 0,
                    .minute: 0,
                    .second: 0,
                    ])
                XCTAssertFalse(currentDate.isEqual(ignoringTime: earlerDate))
            }
            it("when target is previous era should return false") {
                let currentDate = Date.date(by: [
                    .year: 2014,
                    .month: 5,
                    .day: 19,
                    ])
                let previousEraDate = Date.date(by: [
                    .year: 1951,
                    .month: 5,
                    .day: 19,
                    ])
                
                Date.identifier = .japanese
                XCTAssertFalse(currentDate.isEqual(ignoringTime: previousEraDate))
            }
        }
        describe("isToday") {
            let currentDate = Date()
            it("when subject is same date should return true") {
                XCTAssertTrue(currentDate.isToday())
            }
            it("when subject is a later day should return false") {
                let laterDate = currentDate.date(by: [
                    .day: currentDate.day + 1,
                    .hour: 0,
                    .minute: 0,
                    .second: 0,
                    ])
                XCTAssertFalse(laterDate.isToday())
            }
            it("when subject is a earler day should return false") {
                let earlerDate = currentDate.date(by: [
                    .day: currentDate.day - 1,
                    .hour: 23,
                    .minute: 59,
                    .second: 59,
                    ])
                XCTAssertFalse(earlerDate.isToday())
            }
        }
        describe("isTomorrow") {
            let currentDate = Date()
            it("when subject is same date should return false") {
                XCTAssertFalse(currentDate.isTomorrow())
            }
            it("when subject is a tomorrow should return true") {
                let tomorrow = currentDate.date(by: [
                    .day: currentDate.day + 1,
                    .hour: 0,
                    .minute: 0,
                    .second: 0,
                    ])
                XCTAssertTrue(tomorrow.isTomorrow())
            }
            it("when subject is a 2 days later should return false") {
                let laterDate = currentDate.date(by: [
                    .day: currentDate.day + 2,
                    .hour: 23,
                    .minute: 59,
                    .second: 59,
                    ])
                XCTAssertFalse(laterDate.isTomorrow())
            }
        }
        describe("isYesterday") {
            let currentDate = Date()
            it("when subject is same date should return false") {
                XCTAssertFalse(currentDate.isYesterday())
            }
            it("when subject is a tomorrow should return true") {
                let tomorrow = currentDate.date(by: [
                    .day: currentDate.day - 1,
                    .hour: 0,
                    .minute: 0,
                    .second: 0,
                    ])
                XCTAssertTrue(tomorrow.isYesterday())
            }
            it("when subject is a 2 days later should return false") {
                let laterDate = currentDate.date(by: [
                    .day: currentDate.day - 2,
                    .hour: 23,
                    .minute: 59,
                    .second: 59,
                    ])
                XCTAssertFalse(laterDate.isYesterday())
            }
        }
        describe("isSameWeekAsDate") {
            context("today is 2010-10-10") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 10,
                    ])
                it("same date should return false") {
                    XCTAssertTrue(currentDate.isSameWeek(as: currentDate))
                }
                context("next day (monday)") {
                    context("firstWeekday is sunday") {
                        beforeEach {
                            var beginingOfMondayCalendar = Calendar(identifier: .gregorian)
                            beginingOfMondayCalendar.firstWeekday = 1
                            Date._currentCalendar = beginingOfMondayCalendar
                            Date.identifier = .gregorian
                        }
                        afterEach {
                            Date._currentCalendar = nil
                            Date.identifier = nil
                        }
                        it("should return true") {
                            XCTAssertTrue(currentDate.isSameWeek(as: currentDate.add(day: 1)))
                        }
                    }
                    context("firstWeekday is monday") {
                        beforeEach {
                            var beginingOfMondayCalendar = Calendar(identifier: .gregorian)
                            beginingOfMondayCalendar.firstWeekday = 2
                            Date._currentCalendar = beginingOfMondayCalendar
                            Date.identifier = .gregorian
                        }
                        afterEach {
                            Date._currentCalendar = nil
                            Date.identifier = nil
                        }
                        it("should return true") {
                            XCTAssertFalse(currentDate.isSameWeek(as: currentDate.add(day: 1)))
                        }
                    }
                }
                context("within this week") {
                    it("firstOfWeek should return true") {
                        XCTAssertTrue(currentDate.isSameWeek(as: currentDate.startDateOfWeekday()))
                    }
                    it("endOfWeek should return true") {
                        let (startDate, interval) = currentDate.date(of: .weekOfYear)
                        let weekend = startDate.addingTimeInterval(interval - 1)
                        XCTAssertTrue(currentDate.isSameWeek(as: weekend))
                    }
                }
                it("when same the week, but difference year should return false") {
                    XCTAssertFalse(currentDate.isSameWeek(as: currentDate.add(year: 1)))
                }
                it("next week should return false") {
                    XCTAssertFalse(currentDate.isSameWeek(as: currentDate.addingTimeInterval(currentDate.date(of: .weekOfYear).interval)))
                }
                it("last week should return false") {
                    XCTAssertFalse(currentDate.isSameWeek(as: currentDate.addingTimeInterval(-(currentDate.date(of: .weekOfYear).interval))))
                }
            }
            context("today is 2015-03-30") {
                let currentDate = Date.date(by: [
                    .year: 2015,
                    .month: 3,
                    .day: 30,
                    ])
                it("same date should return false") {
                    XCTAssertTrue(currentDate.isSameWeek(as: currentDate))
                }
                context("within this week") {
                    it("firstOfWeek should return true") {
                        XCTAssertTrue(currentDate.isSameWeek(as: currentDate.startDateOfWeekday()))
                    }
                    it("endOfWeek should return true") {
                        let (startDate, interval) = currentDate.date(of: .weekOfYear)
                        let weekend = startDate.addingTimeInterval(interval - 1)
                        XCTAssertTrue(currentDate.isSameWeek(as: weekend))
                    }
                }
                it("when same the week, but difference year should return false") {
                    XCTAssertFalse(currentDate.isSameWeek(as: currentDate.add(year: 1)))
                }
                it("next week should return false") {
                    XCTAssertFalse(currentDate.isSameWeek(as: currentDate.addingTimeInterval(currentDate.date(of: .weekOfYear).interval)))
                }
                it("last week should return false") {
                    XCTAssertFalse(currentDate.isSameWeek(as: currentDate.addingTimeInterval(-(currentDate.date(of: .weekOfYear).interval))))
                }
            }
            context("today is 1989-01-07") {
                let currentDate = Date.date(by: [
                    .year: 1989,
                    .month: 1,
                    .day: 7,
                    ])
                beforeEach {
                    var beginingOfMondayCalendar = Calendar(identifier: .japanese)
                    beginingOfMondayCalendar.firstWeekday = 2
                    Date._currentCalendar = beginingOfMondayCalendar
                    Date.identifier = .japanese
                }
                afterEach {
                    Date._currentCalendar = nil
                    Date.identifier = nil
                }
                it("next era of same week should return true") {
                    XCTAssertTrue(currentDate.isSameWeek(as: currentDate.add(day: 1)))
                }
            }
        }
        describe("isThisWeek") {
            let currentDate = Date()
            it("when now should return true") {
                XCTAssertTrue(currentDate.isThisWeek())
            }
            it("when start date of weekday should return true") {
                XCTAssertTrue(currentDate.startDateOfWeekday().isThisWeek())
            }
            it("when end date of weekday should return true") {
                let (startDate, interval) = currentDate.date(of: .weekOfYear)
                let weekend = startDate.addingTimeInterval(interval - 1)
                XCTAssertTrue(weekend.isThisWeek())
            }
            it("when last week should return false") {
                XCTAssertFalse(currentDate.startDateOfWeekday().addingTimeInterval(-1).isThisWeek())
            }
            it("when next week should return false") {
                let (startDate, interval) = currentDate.date(of: .weekOfYear)
                let nextWeek = startDate.addingTimeInterval(interval)
                XCTAssertFalse(nextWeek.isThisWeek())
            }
        }
        describe("isNextWeek") {
            let currentDate = Date().add(weekOfYear: 1)
            it("when next week should return true") {
                XCTAssertTrue(currentDate.isNextWeek())
            }
            it("when start date of weekday should return true") {
                XCTAssertTrue(currentDate.startDateOfWeekday().isNextWeek())
            }
            it("when end date of weekday should return true") {
                let (startDate, interval) = currentDate.date(of: .weekOfYear)
                let weekend = startDate.addingTimeInterval(interval - 1)
                XCTAssertTrue(weekend.isNextWeek())
            }
            it("when last week should return false") {
                XCTAssertFalse(currentDate.startDateOfWeekday().addingTimeInterval(-1).isNextWeek())
            }
            it("when next week should return false") {
                let (startDate, interval) = currentDate.date(of: .weekOfYear)
                let nextWeek = startDate.addingTimeInterval(interval)
                XCTAssertFalse(nextWeek.isNextWeek())
            }
        }
        describe("isLastWeek") {
            let currentDate = Date().add(weekOfYear: -1)
            it("when next week should return true") {
                XCTAssertTrue(currentDate.isLastWeek())
            }
            it("when start date of weekday should return true") {
                XCTAssertTrue(currentDate.startDateOfWeekday().isLastWeek())
            }
            it("when end date of weekday should return true") {
                let (startDate, interval) = currentDate.date(of: .weekOfYear)
                let weekend = startDate.addingTimeInterval(interval - 1)
                XCTAssertTrue(weekend.isLastWeek())
            }
            it("when last week should return false") {
                XCTAssertFalse(currentDate.startDateOfWeekday().addingTimeInterval(-1).isLastWeek())
            }
            it("when next week should return false") {
                let (startDate, interval) = currentDate.date(of: .weekOfYear)
                let nextWeek = startDate.addingTimeInterval(interval)
                XCTAssertFalse(nextWeek.isLastWeek())
            }
        }
        describe("isSameMonthAsDate") {
            context("today is 2010-10-10") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 10,
                    ])
                it("same day should return true") {
                    XCTAssertTrue(currentDate.isSameMonth(as: currentDate))
                }
                it("with in this month at start of month should return true") {
                    XCTAssertTrue(currentDate.isSameMonth(as: currentDate.startDateOfMonth()))
                }
                it("with in this month at end of month should return true") {
                    let (startDate, interval) = currentDate.date(of: .month)
                    let endOfMonth = startDate.addingTimeInterval(interval - 1)
                    XCTAssertTrue(currentDate.isSameMonth(as: endOfMonth))
                }
                it("with in last month at end of month should return false") {
                    XCTAssertFalse(currentDate.isSameMonth(as: currentDate.startDateOfMonth().addingTimeInterval(-1)))
                }
                it("with in next month at start of month should return false") {
                    let (startDate, interval) = currentDate.date(of: .month)
                    let nextMonth = startDate.addingTimeInterval(interval)
                    XCTAssertFalse(currentDate.isSameMonth(as: nextMonth))
                }
                it("next year should return false") {
                    XCTAssertFalse(currentDate.isSameMonth(as: currentDate.add(year: 1)))
                }
            }
            context("today is 1989-01-07") {
                let currentDate = Date.date(by: [
                    .year: 1989,
                    .month: 1,
                    .day: 7,
                    ])
                beforeEach {
                    Date.identifier = .japanese
                }
                afterEach {
                    Date.identifier = nil
                }
                it("next era of same month should return true") {
                    XCTAssertTrue(currentDate.isSameMonth(as: currentDate.add(day: 1)))
                }
            }
            context("today is 2010-02-13") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 2,
                    .day: 13,
                    ])
                beforeEach {
                    Date.identifier = .chinese
                }
                afterEach {
                    Date.identifier = nil
                }
                it("next era of same month should return true") {
                    XCTAssertTrue(currentDate.isSameMonth(as: currentDate.add(day: 1)))
                }
            }
        }
        describe("isThisMonth") {
            let currentDate = Date()
            it("when sameMonth as Date should return true") {
                XCTAssertTrue(currentDate.isThisMonth())
            }
        }
        describe("isSameYearAsDate") {
            context("today is 2010-10-10") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 10,
                    ])
                context("within this year") {
                    it("date at start of year should return true") {
                        XCTAssertTrue(currentDate.isSameYear(as: currentDate.startDateOfYear()))
                    }
                    it("date at end of year should return true") {
                        let (startDate, interval) = currentDate.date(of: .year)
                        let endOfYear = startDate.addingTimeInterval(interval - 1)
                        XCTAssertTrue(currentDate.isSameYear(as: endOfYear))
                    }
                }
                context("without this year") {
                    it("date at last of year should return false") {
                        XCTAssertFalse(currentDate.isSameYear(as: currentDate.startDateOfYear().add(second: -1 - Int(arc4random()))))
                    }
                    it("date at last of year should return false") {
                        let (startDate, interval) = currentDate.date(of: .year)
                        let nextyear = startDate.addingTimeInterval(interval)
                        XCTAssertFalse(currentDate.isSameYear(as: nextyear))
                    }
                }
            }
            context("today is 1988-01-07") {
                let currentDate = Date.date(by: [
                    .year: 1988,
                    .month: 1,
                    .day: 7,
                    ])
                beforeEach {
                    Date.identifier = .japanese
                }
                afterEach {
                    Date.identifier = nil
                }
                it("next era of same year should return true") {
                    XCTAssertTrue(currentDate.isSameYear(as: currentDate.add(day: 1)))
                }
            }
            context("today is 2010-02-13") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 2,
                    .day: 13,
                    ])
                beforeEach {
                    Date.identifier = .chinese
                }
                afterEach {
                    Date.identifier = nil
                }
                it("next era of same year should return true") {
                    XCTAssertTrue(currentDate.isSameYear(as: currentDate.add(day: 1)))
                }
            }
        }
        describe("isThisYear") {
            let currentDate = Date()
            it("within this year should return true") {
                XCTAssertTrue(currentDate.isThisYear())
            }
            it("other year should return true") {
                XCTAssertFalse(currentDate.add(year: 1 + Int(arc4random())).isThisYear())
            }
        }
        describe("isInPast") {
            let currentDate = Date()
            it("when earlier time should return true") {
                XCTAssertFalse(currentDate.add(second: 1).isInPast())
            }
            it("when later time should return false") {
                XCTAssertTrue(currentDate.add(second: -1).isInPast())
            }
        }
        describe("isInFuture") {
            let currentDate = Date()
            it("when future time should return true") {
                XCTAssertTrue(currentDate.add(second: 1).isInFuture())
            }
            it("when past time should return false") {
                XCTAssertFalse(currentDate.add(second: -1).isInFuture())
            }
        }
    }
}


================================================
FILE: SwiftTest/EscortDateRoles.swift
================================================
import XCTest
import Quick
import AZDateBuilder

class EscortDateRolesSpec: QuickSpec {
    override func spec() {
        describe("isTypicallyWorkday") {
            it("when weekday is first should return false") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 10,
                    ])
                XCTAssertFalse(currentDate.isTypicallyWorkday())
            }
            it("when weekday is last should return false") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 16,
                    ])
                XCTAssertFalse(currentDate.isTypicallyWorkday())
            }
            it("when weekday is last should return true") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 11 + Int(arc4random_uniform(5)),
                    ])
                XCTAssertTrue(currentDate.isTypicallyWorkday())
            }
        }
        describe("isTypicallyWeekend") {
            it("when weekday is first should return true") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 10,
                    ])
                XCTAssertTrue(currentDate.isTypicallyWeekend())
            }
            it("when weekday is last should return true") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 16,
                    ])
                XCTAssertTrue(currentDate.isTypicallyWeekend())
            }
            it("when weekday is last should return false") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 11 + Int(arc4random_uniform(5)),
                    ])
                XCTAssertFalse(currentDate.isTypicallyWeekend())
            }
        }
    }
}


================================================
FILE: SwiftTest/EscortDecomposingSpec.swift
================================================
import XCTest
import Quick
import AZDateBuilder

class EscortDecomposingSpec: QuickSpec {
    override func spec() {
        describe("era") {
            context("when 2010-10-10") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 15,
                    ])
                it("gregorian calendar should return 1") {
                    Date.identifier = .gregorian
                    XCTAssertEqual(currentDate.era, 1)
                }
                it("japanese calendar should return 1") {
                    Date.identifier = .japanese
                    XCTAssertEqual(currentDate.era, 235)
                }
            }
            context("when Showa era") {
                let currentDate = Date.date(by: [
                    .year: 1988,
                    .month: 10,
                    .day: 11,
                    ])
                it("japanese calendar should return 63") {
                    Date.identifier = .japanese
                    XCTAssertEqual(currentDate.era, 234)
                }
            }
        }
        describe("year") {
            context("when 2010-10-10") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 15,
                    ])
                it("gregorian calendar should return 2010") {
                    Date.identifier = .gregorian
                    XCTAssertEqual(currentDate.year, 2010)
                }
                it("japanese calendar should return 22") {
                    Date.identifier = .japanese
                    XCTAssertEqual(currentDate.year, 22)
                }
            }
            context("when Showa era") {
                let currentDate = Date.date(by: [
                    .year: 1988,
                    .month: 10,
                    .day: 11,
                    ])
                it("japanese calendar should return 63") {
                    Date.identifier = .japanese
                    XCTAssertEqual(currentDate.year, 63)
                }
            }
        }
        describe("month") {
            it("when 2010-10-11 should retuen 11") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 11,
                    ])
                XCTAssertEqual(currentDate.month, 10)
            }
        }
        describe("day") {
            it("when 2010-10-11 should retuen 11") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 11,
                    ])
                XCTAssertEqual(currentDate.day, 11)
            }
        }
        describe("minute") {
            it("when 01:02:03 should retuen 2") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 11,
                    .hour: 1,
                    .minute: 2,
                    .second: 3,
                    ])
                XCTAssertEqual(currentDate.minute, 2)
                
            }
        }
        describe("second") {
            it("when 01:02:03 should retuen 3") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 11,
                    .hour: 1,
                    .minute: 2,
                    .second: 3,
                    ])
                XCTAssertEqual(currentDate.second, 3)
            }
        }
        describe("weekday") {
            it("when 2010-01-01 should retuen 6") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 1,
                    .day: 1,
                    ])
                XCTAssertEqual(currentDate.weekday, 6)
            }
            it("when 2010-10-11 should retuen 2") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 11,
                    ])
                XCTAssertEqual(currentDate.weekday, 2)
            }
        }
        describe("weekdayOrdinal") {
            it("when 2010-01-01 should retuen 1") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 1,
                    .day: 1,
                    ])
                XCTAssertEqual(currentDate.weekdayOrdinal, 1)
            }
            it("when 2010-10-07 should retuen 1") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 7,
                    ])
                XCTAssertEqual(currentDate.weekdayOrdinal, 1)
            }
            it("when 2010-10-08 should retuen 2") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 8,
                    ])
                XCTAssertEqual(currentDate.weekdayOrdinal, 2)
            }
            it("when 2010-10-14 should retuen 2") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 14,
                    ])
                XCTAssertEqual(currentDate.weekdayOrdinal, 2)
            }
            it("when 2010-10-15 should retuen 3") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 15,
                    ])
                XCTAssertEqual(currentDate.weekdayOrdinal, 3)
            }
        }
        describe("quarter") {
            it("when 2010-01 should retuen 0") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 1,
                    ])
                XCTAssertEqual(currentDate.quarter, 0)
            }
        }
        describe("weekOfMonth") {
            it("when 2010-10-09 should retuen 2") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 9,
                    ])
                XCTAssertEqual(currentDate.weekOfMonth, 2)
            }
            it("when 2010-10-10 should retuen 3") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 10,
                    ])
                XCTAssertEqual(currentDate.weekOfMonth, 3)
            }
            it("when 2010-10-16 should retuen 3") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 16,
                    ])
                XCTAssertEqual(currentDate.weekOfMonth, 3)
            }
            it("when 2010-10-17 should retuen 4") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 17,
                    ])
                XCTAssertEqual(currentDate.weekOfMonth, 4)
            }
            it("when 2010-10-31 should retuen 4") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 31,
                    ])
                XCTAssertEqual(currentDate.weekOfMonth, 6)
            }
        }
        describe("weekOfYear") {
            it("when 2010-10-09 should retuen 41") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 9,
                    ])
                XCTAssertEqual(currentDate.weekOfYear, 41)
            }
            it("when 2010-10-10 should retuen 42") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 10,
                    ])
                XCTAssertEqual(currentDate.weekOfYear, 42)
            }
            it("when 2010-10-16 should retuen 42") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 16,
                    ])
                XCTAssertEqual(currentDate.weekOfYear, 42)
            }
            it("when 2010-10-17 should retuen 43") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 17,
                    ])
                XCTAssertEqual(currentDate.weekOfYear, 43)
            }
            it("when 2010-12-26 should retuen 1") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 12,
                    .day: 26,
                    ])
                XCTAssertEqual(currentDate.weekOfYear, 1)
            }
        }
        describe("yearForWeekOfYear") {
            it("when 2009-12-26 should retuen 2009") {
                let currentDate = Date.date(by: [
                    .year: 2009,
                    .month: 12,
                    .day: 26,
                    ])
                XCTAssertEqual(currentDate.yearForWeekOfYear, 2009)
            }
            it("when 2009-12-27 should retuen 2010") {
                let currentDate = Date.date(by: [
                    .year: 2009,
                    .month: 12,
                    .day: 27,
                    ])
                XCTAssertEqual(currentDate.yearForWeekOfYear, 2010)
            }
            it("when 2010-12-25 should retuen 2010") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 12,
                    .day: 25,
                    ])
                XCTAssertEqual(currentDate.yearForWeekOfYear, 2010)
            }
            it("when 2010-12-26 should retuen 2011") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 12,
                    .day: 26,
                    ])
                XCTAssertEqual(currentDate.yearForWeekOfYear, 2011)
            }
        }
        describe("nanosecond") {
            it("when 01:02:03.059 should retuen 59") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 11,
                    .hour: 1,
                    .minute: 2,
                    .second: 3,
                    .nanosecond: 59,
                    ])
                XCTAssertEqual(currentDate.nanosecond, 59)
            }
        }
    }
}


================================================
FILE: SwiftTest/EscortExtractSpec.swift
================================================
import XCTest
import Quick
import AZDateBuilder

class EscortExtractSpec: QuickSpec {
    override func spec() {
        describe("gregorianYear") {
            context("when 2010-10-10") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 15,
                    ])
                it("gregorian calendar should return 2010") {
                    Date.identifier = .gregorian
                    XCTAssertEqual(currentDate.gregorianYear, 2010)
                }
                it("japanese calendar should return 2010") {
                    Date.identifier = .japanese
                    XCTAssertEqual(currentDate.gregorianYear, 2010)
                }
            }
        }
        describe("nearestHour") {
            it("when 10:00:00 should return 10") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 11,
                    .hour: 10,
                    .minute: 0,
                    .second: 0,
                    ])
                XCTAssertEqual(currentDate.nearestHour, 10)
            }
            it("when 10:29:59 should return 10") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 11,
                    .hour: 10,
                    .minute: 29,
                    .second: 59,
                    ])
                XCTAssertEqual(currentDate.nearestHour, 10)
            }
            it("when 10:30:00 should return 10") {
                let currentDate = Date.date(by: [
                    .year: 2010,
                    .month: 10,
                    .day: 11,
                    .hour: 10,
                    .minute: 30,
                    .second: 00,
                    ])
                XCTAssertEqual(currentDate.nearestHour, 11)
            }
        }
    }
}


================================================
FILE: SwiftTest/EscortRetrievingIntervalsSpec.swift
================================================
import XCTest
import Quick
import AZDateBuilder

class EscortRetrievingIntervalsSpec: QuickSpec {
    override func spec() {
        describe("seconds(after:)") {
            let currentDate = Date.date(by: [
                .year: 2010,
                .month: 10,
                .day: 11,
                .hour: 12,
                .minute: 13,
                .second: 14,
                ])
            it("after 5 seconds should return 5") {
                let anotherDate = currentDate.add(second: 5)
                XCTAssertEqual(currentDate.seconds(after: anotherDate), 5)
            }
            it("after 10 minutes should return 600") {
                let anotherDate = currentDate.add(minute: 10)
                XCTAssertEqual(currentDate.seconds(after: anotherDate), 600)
            }
        }
        describe("minute(after:)") {
            let currentDate = Date.date(by: [
                .year: 2010,
                .month: 10,
                .day: 11,
                .hour: 12,
                .minute: 13,
                .second: 14,
                ])
            it("after 5 miuntes should return 5") {
                let anotherDate = currentDate.add(minute: 5)
                XCTAssertEqual(currentDate.minutes(after: anotherDate), 5)
            }
            it("after 10 hours should return 600") {
                let anotherDate = currentDate.add(hour: 10)
                XCTAssertEqual(currentDate.minutes(after: anotherDate), 600)
            }
        }
        describe("hours(after:)") {
            let currentDate = Date.date(by: [
                .year: 2010,
                .month: 10,
                .day: 11,
                .hour: 12,
                .minute: 13,
                .second: 14,
                ])
            it("after 5 hours should return 5") {
                let anotherDate = currentDate.add(hour: 5)
                XCTAssertEqual(currentDate.hours(after: anotherDate), 5)
            }
            it("after 1 days should return 24") {
                let anotherDate = currentDate.add(day: 1)
                XCTAssertEqual(currentDate.hours(after: anotherDate), 24)
            }
        }
        describe("days(after:)") {
            let currentDate = Date.date(by: [
                .year: 2010,
                .month: 10,
                .day: 11,
                .hour: 12,
                .minute: 13,
                .second: 14,
                ])
            it("after 5 days should return 5") {
                let anotherDate = currentDate.add(day: 5)
                XCTAssertEqual(currentDate.days(after: anotherDate), 5)
            }
            it("after 2 months should return 61") {
                let anotherDate = currentDate.add(month: 2)
                XCTAssertEqual(currentDate.days(after: anotherDate), 61)
            }
        }
        describe("months(after:)") {
            let currentDate = Date.date(by: [
                .year: 2010,
                .month: 10,
                .day: 11,
                .hour: 12,
                .minute: 13,
                .second: 14,
                ])
            it("after 5 months should return 5") {
                let anotherDate = currentDate.add(month: 5)
                XCTAssertEqual(currentDate.months(after: anotherDate), 5)
            }
            it("after 2 years should return 24") {
                let anotherDate = currentDate.add(year: 2)
                XCTAssertEqual(currentDate.months(after: anotherDate), 24)
            }
        }
        describe("years(after:)") {
            let currentDate = Date.date(by: [
                .year: 2010,
                .month: 10,
                .day: 11,
                .hour: 12,
                .minute: 13,
                .second: 14,
                ])
            it("after 5 years should return 5") {
                let anotherDate = currentDate.add(year: 5)
                XCTAssertEqual(currentDate.years(after: anotherDate), 5)
            }
        }
    }
}


================================================
FILE: SwiftTest/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>$(DEVELOPMENT_LANGUAGE)</string>
	<key>CFBundleExecutable</key>
	<string>$(EXECUTABLE_NAME)</string>
	<key>CFBundleIdentifier</key>
	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>$(PRODUCT_NAME)</string>
	<key>CFBundlePackageType</key>
	<string>BNDL</string>
	<key>CFBundleShortVersionString</key>
	<string>1.0</string>
	<key>CFBundleVersion</key>
	<string>1</string>
</dict>
</plist>


================================================
FILE: Test/EscortAdjustingDatesSpec.m
================================================
#import "Kiwi.h"
#import "NSDate+Escort.h"
#import "NSDate+AZDateBuilder.h"
#import "FakeDateUtil.h"
#import "AZNSDateKiwiMatcher.h"

@interface NSDate (EscortMock)
+ (NSCalendar *)AZ_currentCalendar;
@end

SPEC_BEGIN(EscortAdjustingDates)
    registerMatchers(@"AZ");// NSDate Custom Matcher

    describe(@"-dateByAddingYears", ^{
        context(@"when the date is 2010-10-10", ^{
            __block NSDate *currentDate;
            beforeEach(^{
                currentDate = [NSDate AZ_dateByUnit:@{
                    AZ_DateUnit.year : @2010,
                    AZ_DateUnit.month : @10,
                    AZ_DateUnit.day : @10,
                }];
            });
            context(@"adding 0 year", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateByAddingYears:0];
                });
                it(@"should return 2010-10-10", ^{
                    [[subject should] equalToDateIgnoringTime:currentDate];
                });
            });
            context(@"adding 1 year", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateByAddingYears:1];
                });
                it(@"should return 2011-10-10", ^{
                    NSDate *expectDate = [NSDate AZ_dateByUnit:@{
                        AZ_DateUnit.year : @2011,
                        AZ_DateUnit.month : @10,
                        AZ_DateUnit.day : @10,
                    }];
                    [[subject should] equalToDateIgnoringTime:expectDate];
                });
            });
            context(@"adding -1 year", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateByAddingYears:-1];
                });
                it(@"should return 2009-10-10", ^{
                    NSDate *expectDate = [NSDate AZ_dateByUnit:@{
                        AZ_DateUnit.year : @2009,
                        AZ_DateUnit.month : @10,
                        AZ_DateUnit.day : @10,
                    }];
                    [[subject should] equalToDateIgnoringTime:expectDate];
                });
            });
        });
    });

    describe(@"-dateBySubtractingYears", ^{
        context(@"when the date is 2010-10-10", ^{
            __block NSDate *currentDate;
            beforeEach(^{
                currentDate = [NSDate AZ_dateByUnit:@{
                    AZ_DateUnit.year : @2010,
                    AZ_DateUnit.month : @10,
                    AZ_DateUnit.day : @10,
                }];
            });
        });
    });

    describe(@"-dateByAddingMonths", ^{
        context(@"when the date is 2010-10-10", ^{
            __block NSDate *currentDate;
            beforeEach(^{
                currentDate = [NSDate AZ_dateByUnit:@{
                    AZ_DateUnit.year : @2010,
                    AZ_DateUnit.month : @10,
                    AZ_DateUnit.day : @10,
                }];
            });
            context(@"adding 0 month", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateByAddingMonths:0];
                });
                it(@"should return 2010-10-10", ^{
                    [[subject should] equalToDateIgnoringTime:currentDate];
                });
            });
            context(@"adding 1 month", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateByAddingMonths:1];
                });
                it(@"should return 2010-11-10", ^{
                    NSDate *expectDate = [NSDate AZ_dateByUnit:@{
                        AZ_DateUnit.year : @2010,
                        AZ_DateUnit.month : @11,
                        AZ_DateUnit.day : @10,
                    }];
                    [[subject should] equalToDateIgnoringTime:expectDate];
                });
            });
            context(@"adding -1 month", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateByAddingMonths:-1];
                });
                it(@"should return 2010-09-10", ^{
                    NSDate *expectDate = [NSDate AZ_dateByUnit:@{
                        AZ_DateUnit.year : @2010,
                        AZ_DateUnit.month : @9,
                        AZ_DateUnit.day : @10,
                    }];
                    [[subject should] equalToDateIgnoringTime:expectDate];
                });
            });
        });
    });
    describe(@"-dateBySubtractingMonth", ^{
        context(@"when the date is 2010-10-10", ^{
            __block NSDate *currentDate;
            beforeEach(^{
                currentDate = [NSDate AZ_dateByUnit:@{
                    AZ_DateUnit.year : @2010,
                    AZ_DateUnit.month : @10,
                    AZ_DateUnit.day : @10,
                }];
            });
        });
    });

    describe(@"-dateByAddingDays", ^{
        context(@"when the date is 2010-10-10", ^{
            __block NSDate *currentDate;
            beforeEach(^{
                currentDate = [NSDate AZ_dateByUnit:@{
                    AZ_DateUnit.year : @2010,
                    AZ_DateUnit.month : @10,
                    AZ_DateUnit.day : @10,
                }];
            });
            context(@"adding 0 Day", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateByAddingDays:0];
                });
                it(@"should return 2010-10-10", ^{
                    [[subject should] equalToDateIgnoringTime:currentDate];
                });
            });
            context(@"adding 1 Day", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateByAddingDays:1];
                });
                it(@"should return 2010-10-11", ^{
                    NSDate *expectDate = [NSDate AZ_dateByUnit:@{
                        AZ_DateUnit.year : @2010,
                        AZ_DateUnit.month : @10,
                        AZ_DateUnit.day : @11,
                    }];
                    [[subject should] equalToDateIgnoringTime:expectDate];
                });
            });
            context(@"adding -1 Day", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateByAddingDays:-1];
                });
                it(@"should return 2010-10-09", ^{
                    NSDate *expectDate = [NSDate AZ_dateByUnit:@{
                        AZ_DateUnit.year : @2010,
                        AZ_DateUnit.month : @10,
                        AZ_DateUnit.day : @9,
                    }];
                    [[subject should] equalToDateIgnoringTime:expectDate];
                });
            });
        });
    });
    describe(@"-dateBySubtractingDays", ^{
        context(@"when the date is 2010-10-10", ^{
            __block NSDate *currentDate;
            beforeEach(^{
                currentDate = [NSDate AZ_dateByUnit:@{
                    AZ_DateUnit.year : @2010,
                    AZ_DateUnit.month : @10,
                    AZ_DateUnit.day : @10,
                    AZ_DateUnit.hour : @10,
                    AZ_DateUnit.minute : @10,
                    AZ_DateUnit.second : @10,
                }];
                [FakeDateUtil stubCurrentDate:currentDate];
            });
            context(@"before 0 Day", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateBySubtractingDays:0];
                });
                it(@"should return 2010-10-10", ^{
                    [[subject should] equal:currentDate];
                });
            });
            context(@"before 1 Day", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateBySubtractingDays:1];
                });
                it(@"should return 2010-10-09", ^{
                    NSDate *expectDate = [NSDate AZ_dateByUnit:@{
                        AZ_DateUnit.year : @2010,
                        AZ_DateUnit.month : @10,
                        AZ_DateUnit.day : @9,
                    }];
                    [[subject should] equalToDateIgnoringTime:expectDate];
                });
            });
            context(@"before -1 Day", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateBySubtractingDays:-1];
                });
                it(@"should return 2010-10-11", ^{
                    NSDate *expectDate = [NSDate AZ_dateByUnit:@{
                        AZ_DateUnit.year : @2010,
                        AZ_DateUnit.month : @10,
                        AZ_DateUnit.day : @11,
                    }];
                    [[subject should] equalToDateIgnoringTime:expectDate];
                });
            });
        });
    });
    describe(@"-dateByAddingHours", ^{
        context(@"when the date is 2010-10-10 10:10:10", ^{
            __block NSDate *currentDate;
            beforeEach(^{
                currentDate = [NSDate AZ_dateByUnit:@{
                    AZ_DateUnit.year : @2010,
                    AZ_DateUnit.month : @10,
                    AZ_DateUnit.day : @10,
                    AZ_DateUnit.hour : @10,
                    AZ_DateUnit.minute : @10,
                    AZ_DateUnit.second : @10,
                }];
                [FakeDateUtil stubCurrentDate:currentDate];
            });
            context(@"adding 0 hour", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateByAddingHours:0];
                });
                it(@"should return same date", ^{
                    [[subject should] equal:currentDate];
                });
            });
            context(@"adding 1 hour", ^{
                __block NSDate *dateWithDaysBeforeNow;
                beforeEach(^{
                    dateWithDaysBeforeNow = [currentDate dateByAddingHours:1];
                });
                it(@"should return 2010-10-10 10:11:10", ^{
                    NSDate *expectDate = [NSDate AZ_dateByUnit:@{
                        AZ_DateUnit.year : @2010,
                        AZ_DateUnit.month : @10,
                        AZ_DateUnit.day : @10,
                        AZ_DateUnit.hour : @11,
                        AZ_DateUnit.minute : @10,
                        AZ_DateUnit.second : @10,
                    }];
                    [[dateWithDaysBeforeNow should] equal:expectDate];
                });
            });
            context(@"adding 24 hour", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateByAddingHours:24];
                });
                it(@"should return 2010-10-11 10:10:10", ^{
                    NSDate *expectDate = [NSDate AZ_dateByUnit:@{
                        AZ_DateUnit.year : @2010,
                        AZ_DateUnit.month : @10,
                        AZ_DateUnit.day : @11,
                        AZ_DateUnit.hour : @10,
                        AZ_DateUnit.minute : @10,
                        AZ_DateUnit.second : @10,
                    }];
                    [[subject should] equal:expectDate];
                });
            });
            context(@"adding -1 hour", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateByAddingHours:-1];
                });
                it(@"should return 2010-10-10 09:10:10", ^{
                    NSDate *expectDate = [NSDate AZ_dateByUnit:@{
                        AZ_DateUnit.year : @2010,
                        AZ_DateUnit.month : @10,
                        AZ_DateUnit.day : @10,
                        AZ_DateUnit.hour : @9,
                        AZ_DateUnit.minute : @10,
                        AZ_DateUnit.second : @10,
                    }];
                    [[subject should] equal:expectDate];
                });
            });
        });
    });
    describe(@"-dateBySubtractingHours", ^{
        context(@"when the date is 2010-10-10 10:10:10", ^{
            __block NSDate *currentDate;
            beforeEach(^{
                currentDate = [NSDate AZ_dateByUnit:@{
                    AZ_DateUnit.year : @2010,
                    AZ_DateUnit.month : @10,
                    AZ_DateUnit.day : @10,
                    AZ_DateUnit.hour : @10,
                    AZ_DateUnit.minute : @10,
                    AZ_DateUnit.second : @10,
                }];
                [FakeDateUtil stubCurrentDate:currentDate];
            });
            context(@"subtract 0 hour", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateBySubtractingHours:0];
                });
                it(@"should return same date", ^{
                    [[subject should] equal:currentDate];
                });
            });
            context(@"subtract 1 hour", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateBySubtractingHours:1];
                });
                it(@"should return 2010-10-10 10:09:10", ^{
                    NSDate *expectDate = [NSDate AZ_dateByUnit:@{
                        AZ_DateUnit.year : @2010,
                        AZ_DateUnit.month : @10,
                        AZ_DateUnit.day : @10,
                        AZ_DateUnit.hour : @9,
                        AZ_DateUnit.minute : @10,
                        AZ_DateUnit.second : @10,
                    }];
                    [[subject should] equal:expectDate];
                });
            });
            context(@"subtract 24 hour", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateBySubtractingHours:24];
                });
                it(@"should return 2010-10-09 10:10:10", ^{
                    NSDate *expectDate = [NSDate AZ_dateByUnit:@{
                        AZ_DateUnit.year : @2010,
                        AZ_DateUnit.month : @10,
                        AZ_DateUnit.day : @9,
                        AZ_DateUnit.hour : @10,
                        AZ_DateUnit.minute : @10,
                        AZ_DateUnit.second : @10,
                    }];
                    [[subject should] equal:expectDate];
                });
            });
            context(@"subtract -1 hour", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateBySubtractingHours:-1];
                });
                it(@"should return 2010-10-10 11:10:10", ^{
                    NSDate *expectDate = [NSDate AZ_dateByUnit:@{
                        AZ_DateUnit.year : @2010,
                        AZ_DateUnit.month : @10,
                        AZ_DateUnit.day : @10,
                        AZ_DateUnit.hour : @11,
                        AZ_DateUnit.minute : @10,
                        AZ_DateUnit.second : @10,
                    }];
                    [[subject should] equal:expectDate];
                });
            });
        });
    });

    describe(@"-dateByAddingMinutes", ^{
        context(@"when the date is 2010-10-10 10:10:10", ^{
            __block NSDate *currentDate;
            beforeEach(^{
                currentDate = [NSDate AZ_dateByUnit:@{
                    AZ_DateUnit.year : @2010,
                    AZ_DateUnit.month : @10,
                    AZ_DateUnit.day : @10,
                    AZ_DateUnit.hour : @10,
                    AZ_DateUnit.minute : @10,
                    AZ_DateUnit.second : @10,
                }];
                [FakeDateUtil stubCurrentDate:currentDate];
            });
            context(@"adding 0 minute", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateByAddingMinutes:0];
                });
                it(@"should return same date", ^{
                    [[subject should] equal:currentDate];
                });
            });
            context(@"adding 1 minute", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateByAddingMinutes:1];
                });
                it(@"should return 2010-10-10 10:11:10", ^{
                    NSDate *expectDate = [NSDate AZ_dateByUnit:@{
                        AZ_DateUnit.year : @2010,
                        AZ_DateUnit.month : @10,
                        AZ_DateUnit.day : @10,
                        AZ_DateUnit.hour : @10,
                        AZ_DateUnit.minute : @11,
                        AZ_DateUnit.second : @10,
                    }];
                    [[subject should] equal:expectDate];
                });
            });
            context(@"adding 60 minute", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateByAddingMinutes:60];
                });
                it(@"should return 2010-10-10 11:10:10", ^{
                    NSDate *expectDate = [NSDate AZ_dateByUnit:@{
                        AZ_DateUnit.year : @2010,
                        AZ_DateUnit.month : @10,
                        AZ_DateUnit.day : @10,
                        AZ_DateUnit.hour : @11,
                        AZ_DateUnit.minute : @10,
                        AZ_DateUnit.second : @10,
                    }];
                    [[subject should] equal:expectDate];
                });
            });
            context(@"adding -1 minute", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateByAddingMinutes:-1];
                });
                it(@"should return 2010-10-10 10:09:10", ^{
                    NSDate *expectDate = [NSDate AZ_dateByUnit:@{
                        AZ_DateUnit.year : @2010,
                        AZ_DateUnit.month : @10,
                        AZ_DateUnit.day : @10,
                        AZ_DateUnit.hour : @10,
                        AZ_DateUnit.minute : @9,
                        AZ_DateUnit.second : @10,
                    }];
                    [[subject should] equal:expectDate];
                });
            });
        });
    });

    describe(@"-dateBySubtractingMinutes", ^{
        context(@"when the date is 2010-10-10 10:10:10", ^{
            __block NSDate *currentDate;
            beforeEach(^{
                currentDate = [NSDate AZ_dateByUnit:@{
                    AZ_DateUnit.year : @2010,
                    AZ_DateUnit.month : @10,
                    AZ_DateUnit.day : @10,
                    AZ_DateUnit.hour : @10,
                    AZ_DateUnit.minute : @10,
                    AZ_DateUnit.second : @10,
                }];
                [FakeDateUtil stubCurrentDate:currentDate];
            });
            context(@"subtract 0 minute", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateBySubtractingMinutes:0];
                });
                it(@"should return same date", ^{
                    [[subject should] equal:currentDate];
                });
            });
            context(@"subtract 1 minute", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateBySubtractingMinutes:1];
                });
                it(@"should return 2010-10-10 10:09:10", ^{
                    NSDate *expectDate = [NSDate AZ_dateByUnit:@{
                        AZ_DateUnit.year : @2010,
                        AZ_DateUnit.month : @10,
                        AZ_DateUnit.day : @10,
                        AZ_DateUnit.hour : @10,
                        AZ_DateUnit.minute : @9,
                        AZ_DateUnit.second : @10,
                    }];
                    [[subject should] equal:expectDate];
                });
            });
            context(@"subtract 60 minute", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateBySubtractingMinutes:60];
                });
                it(@"should return 2010-10-10 09:10:10", ^{
                    NSDate *expectDate = [NSDate AZ_dateByUnit:@{
                        AZ_DateUnit.year : @2010,
                        AZ_DateUnit.month : @10,
                        AZ_DateUnit.day : @10,
                        AZ_DateUnit.hour : @9,
                        AZ_DateUnit.minute : @10,
                        AZ_DateUnit.second : @10,
                    }];
                    [[subject should] equal:expectDate];
                });
            });
            context(@"subtract -1 minute", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateBySubtractingMinutes:-1];
                });
                it(@"should return 2010-10-10 11:11:10", ^{
                    NSDate *expectDate = [NSDate AZ_dateByUnit:@{
                        AZ_DateUnit.year : @2010,
                        AZ_DateUnit.month : @10,
                        AZ_DateUnit.day : @10,
                        AZ_DateUnit.hour : @10,
                        AZ_DateUnit.minute : @11,
                        AZ_DateUnit.second : @10,
                    }];
                    [[subject should] equal:expectDate];
                });
            });
        });
    });

    describe(@"-dateByAddingSounds", ^{
        context(@"when the date is 2010-10-10 10:10:10", ^{
            __block NSDate *currentDate;
            beforeEach(^{
                currentDate = [NSDate AZ_dateByUnit:@{
                    AZ_DateUnit.year : @2010,
                    AZ_DateUnit.month : @10,
                    AZ_DateUnit.day : @10,
                    AZ_DateUnit.hour : @10,
                    AZ_DateUnit.minute : @10,
                    AZ_DateUnit.second : @10,
                }];
                [FakeDateUtil stubCurrentDate:currentDate];
            });
            context(@"adding 0 second", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateByAddingSeconds:0];
                });
                it(@"should return same date", ^{
                    [[subject should] equal:currentDate];
                });
            });
            context(@"adding 1 second", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateByAddingSeconds:1];
                });
                it(@"should return 2010-10-10 10:10:11", ^{
                    NSDate *expectDate = [NSDate AZ_dateByUnit:@{
                        AZ_DateUnit.year : @2010,
                        AZ_DateUnit.month : @10,
                        AZ_DateUnit.day : @10,
                        AZ_DateUnit.hour : @10,
                        AZ_DateUnit.minute : @10,
                        AZ_DateUnit.second : @11,
                    }];
                    [[subject should] equal:expectDate];
                });
            });
            context(@"adding 60 seconds", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateByAddingSeconds:60];
                });
                it(@"should return 2010-10-10 10:11:10", ^{
                    NSDate *expectDate = [NSDate AZ_dateByUnit:@{
                        AZ_DateUnit.year : @2010,
                        AZ_DateUnit.month : @10,
                        AZ_DateUnit.day : @10,
                        AZ_DateUnit.hour : @10,
                        AZ_DateUnit.minute : @11,
                        AZ_DateUnit.second : @10,
                    }];
                    [[subject should] equal:expectDate];
                });
            });
            context(@"adding -1 second", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateByAddingSeconds:-1];
                });
                it(@"should return 2010-10-10 10:11:10", ^{
                    NSDate *expectDate = [NSDate AZ_dateByUnit:@{
                        AZ_DateUnit.year : @2010,
                        AZ_DateUnit.month : @10,
                        AZ_DateUnit.day : @10,
                        AZ_DateUnit.hour : @10,
                        AZ_DateUnit.minute : @10,
                        AZ_DateUnit.second : @9,
                    }];
                    [[subject should] equal:expectDate];
                });
            });
        });
    });
    describe(@"-dateBySubtractingSeconds", ^{
        context(@"when the date is 2010-10-10 10:10:10", ^{
            __block NSDate *currentDate;
            beforeEach(^{
                currentDate = [NSDate AZ_dateByUnit:@{
                    AZ_DateUnit.year : @2010,
                    AZ_DateUnit.month : @10,
                    AZ_DateUnit.day : @10,
                    AZ_DateUnit.hour : @10,
                    AZ_DateUnit.minute : @10,
                    AZ_DateUnit.second : @10,
                }];
                [FakeDateUtil stubCurrentDate:currentDate];
            });
            context(@"subtract 0 second", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateBySubtractingSeconds:0];
                });
                it(@"should return same date", ^{
                    [[subject should] equal:currentDate];
                });
            });
            context(@"subtract 1 second", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateBySubtractingSeconds:1];
                });
                it(@"should return 2010-10-10 10:10:09", ^{
                    NSDate *expectDate = [NSDate AZ_dateByUnit:@{
                        AZ_DateUnit.year : @2010,
                        AZ_DateUnit.month : @10,
                        AZ_DateUnit.day : @10,
                        AZ_DateUnit.hour : @10,
                        AZ_DateUnit.minute : @10,
                        AZ_DateUnit.second : @9,
                    }];
                    [[subject should] equal:expectDate];
                });
            });
            context(@"subtract 60 seconds", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateBySubtractingSeconds:60];
                });
                it(@"should return 2010-10-10 10:09:10", ^{
                    NSDate *expectDate = [NSDate AZ_dateByUnit:@{
                        AZ_DateUnit.year : @2010,
                        AZ_DateUnit.month : @10,
                        AZ_DateUnit.day : @10,
                        AZ_DateUnit.hour : @10,
                        AZ_DateUnit.minute : @9,
                        AZ_DateUnit.second : @10,
                    }];
                    [[subject should] equal:expectDate];
                });
            });
            context(@"subtract -1 second", ^{
                __block NSDate *subject;
                beforeEach(^{
                    subject = [currentDate dateBySubtractingSeconds:-1];
                });
                it(@"should return 2010-10-10 11:11:10", ^{
                    NSDate *expectDate = [NSDate AZ_dateByUnit:@{
                        AZ_DateUnit.year : @2010,
                        AZ_DateUnit.month : @10,
                        AZ_DateUnit.day : @10,
                        AZ_DateUnit.hour : @10,
                        AZ_DateUnit.minute : @10,
                        AZ_DateUnit.second : @11,
                    }];
                    [[subject should] equal:expectDate];
                });
            });
        });
    });

    describe(@"-dateAtStartOfDay", ^{
        beforeEach(^{
            NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"GMT"];
            [NSTimeZone stub:@selector(defaultTimeZone) andReturn:timeZone];
            [NSTimeZone stub:@selector(localTimeZone) andReturn:timeZone];
        });
        context(@"when the date is 2010-10-10 00:00:00", ^{
            __block NSDate *subject;
            __block NSDate *currentDate;
            beforeEach(^{
                currentDate = [NSDate AZ_dateByUnit:@{
                    AZ_DateUnit.year : @2010,
                    AZ_DateUnit.month : @10,
                    AZ_DateUnit.day : @10,
                    AZ_DateUnit.hour : @0,
                    AZ_DateUnit.minute : @0,
                    AZ_DateUnit.second : @0,
                }];

                subject = [currentDate dateAtStartOfDay];
            });
            it(@"should return same date", ^
Download .txt
gitextract_azev1r4l/

├── .gitignore
├── .ruby-version
├── .swift-version
├── .travis.yml
├── Benchmark/
│   ├── BenchMakeFormReferenceDate.m
│   └── Info.plist
├── Gemfile
├── LICENSE
├── Makefile
├── NSDate-Escort/
│   ├── Date+Escort.swift
│   ├── NSDate+Escort.h
│   └── NSDate+Escort.m
├── NSDate-Escort.podspec
├── NSDate-Escort.xcodeproj/
│   ├── project.pbxproj
│   └── xcshareddata/
│       └── xcschemes/
│           ├── NSDate_Escort.xcscheme
│           ├── NSDate_Escort_iOS.xcscheme
│           └── Test.xcscheme
├── NSDate-Escort.xcworkspace/
│   ├── contents.xcworkspacedata
│   └── xcshareddata/
│       └── IDEWorkspaceChecks.plist
├── NSDate-Escort_Cocoa/
│   ├── Info.plist
│   └── NSDate-Escort.h
├── NSDate_Escort_iOS/
│   ├── Info.plist
│   └── NSDate_Escort_iOS.h
├── Podfile
├── README.md
├── SwiftTest/
│   ├── EscortAdjustingDatesSpec.swift
│   ├── EscortClassSpec.swift
│   ├── EscortComparingSpec.swift
│   ├── EscortDateRoles.swift
│   ├── EscortDecomposingSpec.swift
│   ├── EscortExtractSpec.swift
│   ├── EscortRetrievingIntervalsSpec.swift
│   └── Info.plist
├── Test/
│   ├── EscortAdjustingDatesSpec.m
│   ├── EscortAmountOfSpecs.m
│   ├── EscortCacheSpec.m
│   ├── EscortClassSpec.m
│   ├── EscortComparingSpec.m
│   ├── EscortDateRoles.m
│   ├── EscortDecomposingSpec.m
│   ├── EscortRetrievingIntervalsSpec.m
│   ├── Lib/
│   │   └── FakeDateUtil/
│   │       ├── FakeDateUtil.h
│   │       └── FakeDateUtil.m
│   ├── Matcher/
│   │   ├── AZNSDateKiwiMatcher.h
│   │   └── AZNSDateKiwiMatcher.m
│   ├── Test-Info.plist
│   ├── Test-Prefix.pch
│   └── en.lproj/
│       └── InfoPlist.strings
└── script/
    ├── bin/
    │   └── ios-sim-locale
    └── run-test.sh
Download .txt
SYMBOL INDEX (1 symbols across 1 files)

FILE: Test/Matcher/AZNSDateKiwiMatcher.h
  type KWDateInequalityTypeEqualToDateIgnoringTime (line 9) | typedef NS_ENUM(NSUInteger, KWDateInequalityType){
Condensed preview — 50 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (390K chars).
[
  {
    "path": ".gitignore",
    "chars": 237,
    "preview": "# Xcode\n.DS_Store\n*/build/*\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspecti"
  },
  {
    "path": ".ruby-version",
    "chars": 6,
    "preview": "2.6.3\n"
  },
  {
    "path": ".swift-version",
    "chars": 3,
    "preview": "5.0"
  },
  {
    "path": ".travis.yml",
    "chars": 284,
    "preview": "language: objective-c\nosx_image: xcode10.2\nenv: LC_CTYPE=en_US.UTF-8\nbefore_install:\n#   - sudo easy_install cpp-coveral"
  },
  {
    "path": "Benchmark/BenchMakeFormReferenceDate.m",
    "chars": 4044,
    "preview": "//\n// Created by azu on 2013/06/09.\n// License MIT\n//\n\n\n#import <XCTest/XCTest.h>\n\n@interface BenchMakeFormReferenceDate"
  },
  {
    "path": "Benchmark/Info.plist",
    "chars": 733,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "Gemfile",
    "chars": 116,
    "preview": "source \"https://rubygems.org\"\ngit_source(:github) {|repo_name| \"https://github.com/#{repo_name}\" }\n\ngem \"cocoapods\"\n"
  },
  {
    "path": "LICENSE",
    "chars": 1047,
    "preview": "Copyright (c) 2013 azu\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software an"
  },
  {
    "path": "Makefile",
    "chars": 352,
    "preview": "test-all: test-en test-ja\n\ntest:\n\t./script/run-test.sh\n\ntest-en:\n\tosascript -e 'tell app \"iPhone Simulator\" to quit'\n\t./"
  },
  {
    "path": "NSDate-Escort/Date+Escort.swift",
    "chars": 9919,
    "preview": "import Foundation\n\nextension Date {\n    static var _currentCalendar: Calendar?\n    public static var currentCalendar: Ca"
  },
  {
    "path": "NSDate-Escort/NSDate+Escort.h",
    "chars": 4480,
    "preview": "// LICENSE : MIT\n\n#import <Foundation/Foundation.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface NSDate (Escort)\n\n#pragma mark -"
  },
  {
    "path": "NSDate-Escort/NSDate+Escort.m",
    "chars": 20446,
    "preview": "#import \"NSDate+Escort.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n@implementation NSDate (Escort)\n\nstatic NSString * AZ_DefaultCalenda"
  },
  {
    "path": "NSDate-Escort.podspec",
    "chars": 775,
    "preview": "\nPod::Spec.new do |s|\n  s.name         = \"NSDate-Escort\"\n  s.version      = \"2.1.1\"\n  s.summary      = \"A NSDate utility"
  },
  {
    "path": "NSDate-Escort.xcodeproj/project.pbxproj",
    "chars": 54738,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
  },
  {
    "path": "NSDate-Escort.xcodeproj/xcshareddata/xcschemes/NSDate_Escort.xcscheme",
    "chars": 4613,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1020\"\n   version = \"1.3\">\n   <BuildAction\n      "
  },
  {
    "path": "NSDate-Escort.xcodeproj/xcshareddata/xcschemes/NSDate_Escort_iOS.xcscheme",
    "chars": 2928,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1020\"\n   version = \"1.3\">\n   <BuildAction\n      "
  },
  {
    "path": "NSDate-Escort.xcodeproj/xcshareddata/xcschemes/Test.xcscheme",
    "chars": 4051,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1020\"\n   version = \"1.3\">\n   <BuildAction\n      "
  },
  {
    "path": "NSDate-Escort.xcworkspace/contents.xcworkspacedata",
    "chars": 173,
    "preview": "<?xml version='1.0' encoding='UTF-8'?><Workspace version='1.0'><FileRef location='group:NSDate-Escort.xcodeproj'/><FileR"
  },
  {
    "path": "NSDate-Escort.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "chars": 238,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "NSDate-Escort_Cocoa/Info.plist",
    "chars": 753,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "NSDate-Escort_Cocoa/NSDate-Escort.h",
    "chars": 470,
    "preview": "//\n//  NSDate-Escort.h\n//  NSDate-Escort\n//\n//  Created by akuraru on 2017/04/10.\n//\n//\n\n#import <Cocoa/Cocoa.h>\n\n//! Pr"
  },
  {
    "path": "NSDate_Escort_iOS/Info.plist",
    "chars": 753,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "NSDate_Escort_iOS/NSDate_Escort_iOS.h",
    "chars": 498,
    "preview": "//\n//  NSDate_Escort_iOS.h\n//  NSDate_Escort_iOS\n//\n//  Created by akuraru on 2017/04/10.\n//\n//\n\n#import <UIKit/UIKit.h>"
  },
  {
    "path": "Podfile",
    "chars": 211,
    "preview": "source 'https://github.com/CocoaPods/Specs.git'\nplatform :ios, '11.4'\n\ntarget :Test do\n\tpod 'Kiwi'\n\tpod 'AZDateBuilder'\n"
  },
  {
    "path": "README.md",
    "chars": 6283,
    "preview": "# NSDate-Escort [![Build Status](https://travis-ci.org/azu/NSDate-Escort.png?branch=master)](https://travis-ci.org/azu/N"
  },
  {
    "path": "SwiftTest/EscortAdjustingDatesSpec.swift",
    "chars": 6601,
    "preview": "import XCTest\nimport Quick\nimport AZDateBuilder\n\nclass EscortAdjustingDatesSpec: QuickSpec {\n    override func spec() {\n"
  },
  {
    "path": "SwiftTest/EscortClassSpec.swift",
    "chars": 799,
    "preview": "import XCTest\nimport Quick\nimport AZDateBuilder\n\nclass EscortClassSpec: QuickSpec {\n    override func spec() {\n        d"
  },
  {
    "path": "SwiftTest/EscortComparingSpec.swift",
    "chars": 20895,
    "preview": "import XCTest\nimport Quick\nimport AZDateBuilder\n\nclass EscortComparingSpec: QuickSpec {\n    override func spec() {\n     "
  },
  {
    "path": "SwiftTest/EscortDateRoles.swift",
    "chars": 2127,
    "preview": "import XCTest\nimport Quick\nimport AZDateBuilder\n\nclass EscortDateRolesSpec: QuickSpec {\n    override func spec() {\n     "
  },
  {
    "path": "SwiftTest/EscortDecomposingSpec.swift",
    "chars": 10881,
    "preview": "import XCTest\nimport Quick\nimport AZDateBuilder\n\nclass EscortDecomposingSpec: QuickSpec {\n    override func spec() {\n   "
  },
  {
    "path": "SwiftTest/EscortExtractSpec.swift",
    "chars": 1994,
    "preview": "import XCTest\nimport Quick\nimport AZDateBuilder\n\nclass EscortExtractSpec: QuickSpec {\n    override func spec() {\n       "
  },
  {
    "path": "SwiftTest/EscortRetrievingIntervalsSpec.swift",
    "chars": 4004,
    "preview": "import XCTest\nimport Quick\nimport AZDateBuilder\n\nclass EscortRetrievingIntervalsSpec: QuickSpec {\n    override func spec"
  },
  {
    "path": "SwiftTest/Info.plist",
    "chars": 701,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "Test/EscortAdjustingDatesSpec.m",
    "chars": 52219,
    "preview": "#import \"Kiwi.h\"\n#import \"NSDate+Escort.h\"\n#import \"NSDate+AZDateBuilder.h\"\n#import \"FakeDateUtil.h\"\n#import \"AZNSDateKi"
  },
  {
    "path": "Test/EscortAmountOfSpecs.m",
    "chars": 5676,
    "preview": "#import \"Kiwi.h\"\n#import \"NSDate+AZDateBuilder.h\"\n#import \"NSDate+Escort.h\"\n\n@interface NSDate ()\n+ (NSCalendar *)AZ_cur"
  },
  {
    "path": "Test/EscortCacheSpec.m",
    "chars": 1648,
    "preview": "//\n// Created by azu on 2013/06/29.\n//\n\n\n#import \"Kiwi.h\"\n#import \"NSDate+Escort.h\"\n\n@interface NSDate (EscortMock)\n+ (N"
  },
  {
    "path": "Test/EscortClassSpec.m",
    "chars": 26812,
    "preview": "#import \"Kiwi.h\"\n#import \"NSDate+Escort.h\"\n#import \"AZNSDateKiwiMatcher.h\"\n#import \"NSDate+AZDateBuilder.h\"\n#import \"Fak"
  },
  {
    "path": "Test/EscortComparingSpec.m",
    "chars": 55303,
    "preview": "#import \"Kiwi.h\"\n#import \"NSDate+Escort.h\"\n#import \"FakeDateUtil.h\"\n#import \"NSDate+AZDateBuilder.h\"\n\n@interface NSDate "
  },
  {
    "path": "Test/EscortDateRoles.m",
    "chars": 4521,
    "preview": "#import \"Kiwi.h\"\n#import \"NSDate+Escort.h\"\n#import \"NSDate+AZDateBuilder.h\"\n#import \"FakeDateUtil.h\"\n\n@interface NSDate "
  },
  {
    "path": "Test/EscortDecomposingSpec.m",
    "chars": 26256,
    "preview": "#import \"Kiwi.h\"\n#import \"NSDate+Escort.h\"\n#import \"NSDate+AZDateBuilder.h\"\n\n@interface NSDate ()\n+ (NSCalendar *)AZ_cur"
  },
  {
    "path": "Test/EscortRetrievingIntervalsSpec.m",
    "chars": 26841,
    "preview": "#import \"Kiwi.h\"\n#import \"FakeDateUtil.h\"\n#import \"NSDate+AZDateBuilder.h\"\n#import \"NSDate+Escort.h\"\n\n@interface NSDate "
  },
  {
    "path": "Test/Lib/FakeDateUtil/FakeDateUtil.h",
    "chars": 157,
    "preview": "//\n// Created by azu on 2013/06/09.\n//\n\n\n#import <Foundation/Foundation.h>\n\n\n@interface FakeDateUtil : NSObject\n+ (void)"
  },
  {
    "path": "Test/Lib/FakeDateUtil/FakeDateUtil.m",
    "chars": 426,
    "preview": "//\n// Created by azu on 2013/06/09.\n//\n\n\n#import \"FakeDateUtil.h\"\n#import \"NSObject+KiwiStubAdditions.h\"\n#import \"Kiwi.h"
  },
  {
    "path": "Test/Matcher/AZNSDateKiwiMatcher.h",
    "chars": 416,
    "preview": "//\n// Created by azu on 2013/06/09.\n// License MIT\n\n\n#import <Foundation/Foundation.h>\n#import \"KWMatcher.h\"\n\ntypedef NS"
  },
  {
    "path": "Test/Matcher/AZNSDateKiwiMatcher.m",
    "chars": 2760,
    "preview": "//\n// Created by azu on 2013/06/09.\n//\n\n\n#import \"AZNSDateKiwiMatcher.h\"\n#import \"KWFormatter.h\"\n\n\n@interface AZNSDateKi"
  },
  {
    "path": "Test/Test-Info.plist",
    "chars": 674,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "Test/Test-Prefix.pch",
    "chars": 431,
    "preview": "//\n//  Prefix header\n//\n//  The contents of this file are implicitly included at the beginning of every source file.\n//\n"
  },
  {
    "path": "Test/en.lproj/InfoPlist.strings",
    "chars": 45,
    "preview": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "script/run-test.sh",
    "chars": 206,
    "preview": "#!/bin/sh\n\nxcodebuild test -workspace NSDate-Escort.xcworkspace \\\n-scheme 'Test' \\\n-sdk iphonesimulator \\\n-destination '"
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the azu/NSDate-Escort GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 50 files (361.9 KB), approximately 85.9k tokens, and a symbol index with 1 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!