123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309 |
- //
- // 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 | NSCalendarUnitWeekOfMonth | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitWeekday | NSCalendarUnitWeekdayOrdinal);
- @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 - 获取指定日期的星期
- - (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 @"";
- }
- #pragma mark - 创建date(通过 NSCalendar 类来创建日期)
- + (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute second:(NSInteger)second {
- 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;
- }
-
- 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];
- }
- #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 - 获取 日期加上/减去某天数后的新日期
- - (NSDate *)br_getNewDateToDays:(NSTimeInterval)days {
- // days 为正数时,表示几天之后的日期;负数表示几天之前的日期
- return [self dateByAddingTimeInterval:60 * 60 * 24 * days];
- }
- #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
|