cdts/xdts-ios 3/TreeHole/Code/Gategory/BRPickerView/DatePickerView/NSDate+BRPickerView.m

401 lines
13 KiB
Mathematica
Raw Permalink Normal View History

2023-07-27 09:20:00 +08:00
//
// NSDate+BRPickerView.m
// BRPickerViewDemo
//
// Created by renbo on 2018/3/15.
// Copyright © 2018 irenb. All rights reserved.
//
// https://github.com/91renb/BRPickerView
#import "NSDate+BRPickerView.h"
#import "BRPickerViewMacro.h"
BRSYNTH_DUMMY_CLASS(NSDate_BRPickerView)
static const NSCalendarUnit unitFlags = (NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekOfYear | NSCalendarUnitWeekOfMonth | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitWeekday | NSCalendarUnitWeekdayOrdinal | NSCalendarUnitQuarter);
@implementation NSDate (BRPickerView)
#pragma mark -
+ (NSCalendar *)br_calendar {
static NSCalendar *sharedCalendar = nil;
if (!sharedCalendar) {
// /
sharedCalendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
// NSCalendar
//sharedCalendar.timeZone = [NSTimeZone timeZoneWithName:@"America/Chicago"];
}
return sharedCalendar;
}
#pragma mark - NSDate NSDateComponents
+ (NSDateComponents *)br_componentsFromDate:(NSDate *)date {
// NSCalendar
NSCalendar *calendar = [self br_calendar];
// NSDateComponents
return [calendar components:unitFlags fromDate:date];
}
#pragma mark - NSDateComponents NSDate
+ (NSDate *)br_dateFromComponents:(NSDateComponents *)components {
// NSCalendar
NSCalendar *calendar = [self br_calendar];
return [calendar dateFromComponents:components];
}
#pragma mark -
- (NSInteger)br_year {
return [NSDate br_componentsFromDate:self].year;
}
#pragma mark -
- (NSInteger)br_month {
return [NSDate br_componentsFromDate:self].month;
}
#pragma mark -
- (NSInteger)br_day {
return [NSDate br_componentsFromDate:self].day;
}
#pragma mark -
- (NSInteger)br_hour {
return [NSDate br_componentsFromDate:self].hour;
}
#pragma mark -
- (NSInteger)br_minute {
return [NSDate br_componentsFromDate:self].minute;
}
#pragma mark -
- (NSInteger)br_second {
return [NSDate br_componentsFromDate:self].second;
}
#pragma mark -
- (NSInteger)br_weekday {
return [NSDate br_componentsFromDate:self].weekday;
}
#pragma mark -
- (NSInteger)br_monthWeek {
return [NSDate br_componentsFromDate:self].weekOfMonth;
}
#pragma mark -
- (NSInteger)br_yearWeek {
return [NSDate br_componentsFromDate:self].weekOfYear;
}
#pragma mark -
- (NSInteger)br_quarter {
// [NSDate br_componentsFromDate:self].quarter; // 0?
NSInteger quarter = 1;
NSInteger month = self.br_month;
if (month > 3) quarter = 2;
if (month > 6) quarter = 3;
if (month > 9) quarter = 4;
return quarter;
}
#pragma mark -
- (NSString *)br_weekdayString {
switch (self.br_weekday - 1) {
case 0:
{
return @"周日";
}
break;
case 1:
{
return @"周一";
}
break;
case 2:
{
return @"周二";
}
break;
case 3:
{
return @"周三";
}
break;
case 4:
{
return @"周四";
}
break;
case 5:
{
return @"周五";
}
break;
case 6:
{
return @"周六";
}
break;
default:
break;
}
return @"";
}
/// ---------------- date ----------------
#pragma mark - NSDateComponents NSDate
+ (nullable NSDate *)br_setDateFromComponents:(NSDateComponents *)components timeZone:(NSTimeZone *)timeZone {
// /
NSCalendar *calendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
if (timeZone) {
// NSCalendar
calendar.timeZone = timeZone;
}
return [calendar dateFromComponents:components];
}
#pragma mark - date NSCalendar
+ (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute second:(NSInteger)second {
return [self br_setYear:year month:month day:day hour:hour minute:minute second:second weekOfMonth:0 weekOfYear:0 quarter:0];
}
+ (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day
hour:(NSInteger)hour minute:(NSInteger)minute second:(NSInteger)second
weekOfMonth:(NSInteger)weekOfMonth weekOfYear:(NSInteger)weekOfYear quarter:(NSInteger)quarter {
NSDateComponents *components = [self br_componentsFromDate:[NSDate date]];
if (year > 0) {
//
components = [[NSDateComponents alloc]init];
components.year = year;
}
if (month > 0) {
components.month = month;
}
if (day > 0) {
components.day = day;
}
if (hour >= 0) {
components.hour = hour;
}
if (minute >= 0) {
components.minute = minute;
}
if (second >= 0) {
components.second = second;
}
if (weekOfMonth > 0) {
components.weekOfMonth = weekOfMonth;
}
if (weekOfYear > 0) {
components.weekOfYear = weekOfYear;
}
if (quarter > 0) {
components.quarter = quarter;
}
return [self br_dateFromComponents:components];
}
+ (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute {
return [self br_setYear:year month:month day:day hour:hour minute:minute second:0];
}
+ (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour {
return [self br_setYear:year month:month day:day hour:hour minute:0 second:0];
}
+ (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day {
return [self br_setYear:year month:month day:day hour:0 minute:0 second:0];
}
+ (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month {
return [self br_setYear:year month:month day:0 hour:0 minute:0 second:0];
}
+ (NSDate *)br_setYear:(NSInteger)year {
return [self br_setYear:year month:0 day:0 hour:0 minute:0 second:0];
}
+ (NSDate *)br_setMonth:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute {
return [self br_setYear:0 month:month day:day hour:hour minute:minute second:0];
}
+ (NSDate *)br_setMonth:(NSInteger)month day:(NSInteger)day {
return [self br_setYear:0 month:month day:day hour:0 minute:0 second:0];
}
+ (NSDate *)br_setHour:(NSInteger)hour minute:(NSInteger)minute second:(NSInteger)second {
return [self br_setYear:0 month:0 day:0 hour:hour minute:minute second:second];
}
+ (NSDate *)br_setHour:(NSInteger)hour minute:(NSInteger)minute {
return [self br_setYear:0 month:0 day:0 hour:hour minute:minute second:0];
}
+ (NSDate *)br_setMinute:(NSInteger)minute second:(NSInteger)second {
return [self br_setYear:0 month:0 day:0 hour:0 minute:minute second:second];
}
+ (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month weekOfMonth:(NSInteger)weekOfMonth {
return [self br_setYear:year month:month day:0 hour:0 minute:0 second:0 weekOfMonth:weekOfMonth weekOfYear:0 quarter:0];
}
+ (NSDate *)br_setYear:(NSInteger)year weekOfYear:(NSInteger)weekOfYear {
return [self br_setYear:year month:0 day:0 hour:0 minute:0 second:0 weekOfMonth:0 weekOfYear:weekOfYear quarter:0];
}
+ (NSDate *)br_setYear:(NSInteger)year quarter:(NSInteger)quarter {
return [self br_setYear:year month:0 day:0 hour:0 minute:0 second:0 weekOfMonth:0 weekOfYear:0 quarter:quarter];
}
#pragma mark -
+ (NSUInteger)br_getDaysInYear:(NSInteger)year month:(NSInteger)month {
BOOL isLeapYear = year % 4 == 0 ? (year % 100 == 0 ? (year % 400 == 0 ? YES : NO) : YES) : NO;
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
{
return 31;
}
case 4:
case 6:
case 9:
case 11:
{
return 30;
}
case 2:
{
if (isLeapYear) {
return 29;
} else {
return 28;
}
}
default:
break;
}
return 0;
}
#pragma mark -
+ (NSUInteger)br_getWeeksOfMonthInYear:(NSInteger)year month:(NSInteger)month {
NSUInteger lastDayOfMonth = [self br_getDaysInYear:year month:month];
NSDate *endDate = [self br_setYear:year month:month day:lastDayOfMonth];
return endDate.br_monthWeek;
}
#pragma mark -
+ (NSUInteger)br_getWeeksOfYearInYear:(NSInteger)year {
NSDate *endDate = [self br_setYear:year month:12 day:31];
NSInteger weeks = endDate.br_yearWeek;
if (weeks == 1) weeks = 52;
return weeks;
}
#pragma mark -
+ (NSUInteger)br_getQuartersInYear:(NSInteger)year {
NSDate *endDate = [self br_setYear:year month:12 day:31];
return endDate.br_quarter;
}
#pragma mark - /
- (NSDate *)br_getNewDateToDays:(NSTimeInterval)days {
// days
return [self dateByAddingTimeInterval:60 * 60 * 24 * days];
}
#pragma mark - /
- (nullable NSDate *)br_getNewDateToMonths:(NSTimeInterval)months {
// months
NSDateComponents *components = [[NSDateComponents alloc] init];
[components setMonth:months];
NSCalendar *calender = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
return [calender dateByAddingComponents:components toDate:self options:0];
}
#pragma mark - NSDate NSString
+ (NSString *)br_stringFromDate:(NSDate *)date dateFormat:(NSString *)dateFormat {
return [self br_stringFromDate:date dateFormat:dateFormat timeZone:nil language:nil];
}
#pragma mark - NSDate NSString
+ (NSString *)br_stringFromDate:(NSDate *)date
dateFormat:(NSString *)dateFormat
timeZone:(NSTimeZone *)timeZone
language:(NSString *)language {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
//
dateFormatter.dateFormat = dateFormat;
// NSDateFormatter
if (timeZone) {
dateFormatter.timeZone = timeZone;
}
if (!language) {
language = [NSLocale preferredLanguages].firstObject;
}
dateFormatter.locale = [[NSLocale alloc]initWithLocaleIdentifier:language];
NSString *dateString = [dateFormatter stringFromDate:date];
return dateString;
}
#pragma mark - NSString NSDate
+ (NSDate *)br_dateFromString:(NSString *)dateString dateFormat:(NSString *)dateFormat {
return [self br_dateFromString:dateString dateFormat:dateFormat timeZone:nil language:nil];
}
#pragma mark - NSString NSDate
+ (NSDate *)br_dateFromString:(NSString *)dateString
dateFormat:(NSString *)dateFormat
timeZone:(NSTimeZone *)timeZone
language:(NSString *)language {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
//
dateFormatter.dateFormat = dateFormat;
//
if (!timeZone) {
timeZone = [self currentTimeZone];
}
if (!language) {
language = [NSLocale preferredLanguages].firstObject;
}
dateFormatter.timeZone = timeZone;
dateFormatter.locale = [[NSLocale alloc]initWithLocaleIdentifier:language];
//
dateFormatter.lenient = YES;
return [dateFormatter dateFromString:dateString];
}
#pragma mark - (使)
+ (NSTimeZone *)currentTimeZone {
//
NSTimeZone *localTimeZone = [NSTimeZone localTimeZone];
// GMT()
NSInteger interval = [localTimeZone secondsFromGMTForDate:[NSDate date]];
// (使)NSTimeZone
// NSString NSDate NSDateFormatter null
return [NSTimeZone timeZoneForSecondsFromGMT:interval];
}
#pragma mark - NSDate NSString
+ (NSString *)br_getDateString:(NSDate *)date format:(NSString *)format {
return [self br_stringFromDate:date dateFormat:format];
}
#pragma mark - NSString NSDate
+ (NSDate *)br_getDate:(NSString *)dateString format:(NSString *)format {
return [self br_dateFromString:dateString dateFormat:format];
}
@end