NSDate+BRPickerView.m 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. //
  2. // NSDate+BRPickerView.m
  3. // BRPickerViewDemo
  4. //
  5. // Created by renbo on 2018/3/15.
  6. // Copyright © 2018 irenb. All rights reserved.
  7. //
  8. // 最新代码下载地址:https://github.com/91renb/BRPickerView
  9. #import "NSDate+BRPickerView.h"
  10. #import "BRPickerViewMacro.h"
  11. BRSYNTH_DUMMY_CLASS(NSDate_BRPickerView)
  12. static const NSCalendarUnit unitFlags = (NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekOfMonth | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitWeekday | NSCalendarUnitWeekdayOrdinal);
  13. @implementation NSDate (BRPickerView)
  14. #pragma mark - 获取日历单例对象
  15. + (NSCalendar *)br_calendar {
  16. static NSCalendar *sharedCalendar = nil;
  17. if (!sharedCalendar) {
  18. // 创建日历对象,指定日历的算法(公历/阳历)
  19. sharedCalendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
  20. // NSCalendar 设置时区
  21. //sharedCalendar.timeZone = [NSTimeZone timeZoneWithName:@"America/Chicago"];
  22. }
  23. return sharedCalendar;
  24. }
  25. #pragma mark - NSDate 转 NSDateComponents
  26. + (NSDateComponents *)br_componentsFromDate:(NSDate *)date {
  27. // 通过日历类 NSCalendar 进行转换
  28. NSCalendar *calendar = [self br_calendar];
  29. // NSDateComponents 可以获得日期的详细信息,即日期的组成
  30. return [calendar components:unitFlags fromDate:date];
  31. }
  32. #pragma mark - NSDateComponents 转 NSDate
  33. + (NSDate *)br_dateFromComponents:(NSDateComponents *)components {
  34. // 通过日历类 NSCalendar 进行转换
  35. NSCalendar *calendar = [self br_calendar];
  36. return [calendar dateFromComponents:components];
  37. }
  38. #pragma mark - 获取指定日期的年份
  39. - (NSInteger)br_year {
  40. return [NSDate br_componentsFromDate:self].year;
  41. }
  42. #pragma mark - 获取指定日期的月份
  43. - (NSInteger)br_month {
  44. return [NSDate br_componentsFromDate:self].month;
  45. }
  46. #pragma mark - 获取指定日期的天
  47. - (NSInteger)br_day {
  48. return [NSDate br_componentsFromDate:self].day;
  49. }
  50. #pragma mark - 获取指定日期的小时
  51. - (NSInteger)br_hour {
  52. return [NSDate br_componentsFromDate:self].hour;
  53. }
  54. #pragma mark - 获取指定日期的分钟
  55. - (NSInteger)br_minute {
  56. return [NSDate br_componentsFromDate:self].minute;
  57. }
  58. #pragma mark - 获取指定日期的秒
  59. - (NSInteger)br_second {
  60. return [NSDate br_componentsFromDate:self].second;
  61. }
  62. #pragma mark - 获取指定日期的星期
  63. - (NSInteger)br_weekday {
  64. return [NSDate br_componentsFromDate:self].weekday;
  65. }
  66. #pragma mark - 获取指定日期的星期
  67. - (NSString *)br_weekdayString {
  68. switch (self.br_weekday - 1) {
  69. case 0:
  70. {
  71. return @"周日";
  72. }
  73. break;
  74. case 1:
  75. {
  76. return @"周一";
  77. }
  78. break;
  79. case 2:
  80. {
  81. return @"周二";
  82. }
  83. break;
  84. case 3:
  85. {
  86. return @"周三";
  87. }
  88. break;
  89. case 4:
  90. {
  91. return @"周四";
  92. }
  93. break;
  94. case 5:
  95. {
  96. return @"周五";
  97. }
  98. break;
  99. case 6:
  100. {
  101. return @"周六";
  102. }
  103. break;
  104. default:
  105. break;
  106. }
  107. return @"";
  108. }
  109. #pragma mark - 创建date(通过 NSCalendar 类来创建日期)
  110. + (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute second:(NSInteger)second {
  111. NSDateComponents *components = [self br_componentsFromDate:[NSDate date]];
  112. if (year > 0) {
  113. // 初始化日期组件
  114. components = [[NSDateComponents alloc]init];
  115. components.year = year;
  116. }
  117. if (month > 0) {
  118. components.month = month;
  119. }
  120. if (day > 0) {
  121. components.day = day;
  122. }
  123. if (hour >= 0) {
  124. components.hour = hour;
  125. }
  126. if (minute >= 0) {
  127. components.minute = minute;
  128. }
  129. if (second >= 0) {
  130. components.second = second;
  131. }
  132. return [self br_dateFromComponents:components];
  133. }
  134. + (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute {
  135. return [self br_setYear:year month:month day:day hour:hour minute:minute second:0];
  136. }
  137. + (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour {
  138. return [self br_setYear:year month:month day:day hour:hour minute:0 second:0];
  139. }
  140. + (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day {
  141. return [self br_setYear:year month:month day:day hour:0 minute:0 second:0];
  142. }
  143. + (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month {
  144. return [self br_setYear:year month:month day:0 hour:0 minute:0 second:0];
  145. }
  146. + (NSDate *)br_setYear:(NSInteger)year {
  147. return [self br_setYear:year month:0 day:0 hour:0 minute:0 second:0];
  148. }
  149. + (NSDate *)br_setMonth:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute {
  150. return [self br_setYear:0 month:month day:day hour:hour minute:minute second:0];
  151. }
  152. + (NSDate *)br_setMonth:(NSInteger)month day:(NSInteger)day {
  153. return [self br_setYear:0 month:month day:day hour:0 minute:0 second:0];
  154. }
  155. + (NSDate *)br_setHour:(NSInteger)hour minute:(NSInteger)minute second:(NSInteger)second {
  156. return [self br_setYear:0 month:0 day:0 hour:hour minute:minute second:second];
  157. }
  158. + (NSDate *)br_setHour:(NSInteger)hour minute:(NSInteger)minute {
  159. return [self br_setYear:0 month:0 day:0 hour:hour minute:minute second:0];
  160. }
  161. + (NSDate *)br_setMinute:(NSInteger)minute second:(NSInteger)second {
  162. return [self br_setYear:0 month:0 day:0 hour:0 minute:minute second:second];
  163. }
  164. #pragma mark - 获取某个月的天数(通过年月求每月天数)
  165. + (NSUInteger)br_getDaysInYear:(NSInteger)year month:(NSInteger)month {
  166. BOOL isLeapYear = year % 4 == 0 ? (year % 100 == 0 ? (year % 400 == 0 ? YES : NO) : YES) : NO;
  167. switch (month) {
  168. case 1:
  169. case 3:
  170. case 5:
  171. case 7:
  172. case 8:
  173. case 10:
  174. case 12:
  175. {
  176. return 31;
  177. }
  178. case 4:
  179. case 6:
  180. case 9:
  181. case 11:
  182. {
  183. return 30;
  184. }
  185. case 2:
  186. {
  187. if (isLeapYear) {
  188. return 29;
  189. } else {
  190. return 28;
  191. }
  192. }
  193. default:
  194. break;
  195. }
  196. return 0;
  197. }
  198. #pragma mark - 获取 日期加上/减去某天数后的新日期
  199. - (NSDate *)br_getNewDateToDays:(NSTimeInterval)days {
  200. // days 为正数时,表示几天之后的日期;负数表示几天之前的日期
  201. return [self dateByAddingTimeInterval:60 * 60 * 24 * days];
  202. }
  203. #pragma mark - NSDate 转 NSString
  204. + (NSString *)br_stringFromDate:(NSDate *)date dateFormat:(NSString *)dateFormat {
  205. return [self br_stringFromDate:date dateFormat:dateFormat timeZone:nil language:nil];
  206. }
  207. #pragma mark - NSDate 转 NSString
  208. + (NSString *)br_stringFromDate:(NSDate *)date
  209. dateFormat:(NSString *)dateFormat
  210. timeZone:(NSTimeZone *)timeZone
  211. language:(NSString *)language {
  212. NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
  213. // 设置日期格式
  214. dateFormatter.dateFormat = dateFormat;
  215. // NSDateFormatter 设置时区 ,不设置默认为系统时区
  216. if (timeZone) {
  217. dateFormatter.timeZone = timeZone;
  218. }
  219. if (!language) {
  220. language = [NSLocale preferredLanguages].firstObject;
  221. }
  222. dateFormatter.locale = [[NSLocale alloc]initWithLocaleIdentifier:language];
  223. NSString *dateString = [dateFormatter stringFromDate:date];
  224. return dateString;
  225. }
  226. #pragma mark - NSString 转 NSDate
  227. + (NSDate *)br_dateFromString:(NSString *)dateString dateFormat:(NSString *)dateFormat {
  228. return [self br_dateFromString:dateString dateFormat:dateFormat timeZone:nil language:nil];
  229. }
  230. #pragma mark - NSString 转 NSDate
  231. + (NSDate *)br_dateFromString:(NSString *)dateString
  232. dateFormat:(NSString *)dateFormat
  233. timeZone:(NSTimeZone *)timeZone
  234. language:(NSString *)language {
  235. NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
  236. // 设置日期格式
  237. dateFormatter.dateFormat = dateFormat;
  238. // 设置时区
  239. if (!timeZone) {
  240. timeZone = [self currentTimeZone];
  241. }
  242. if (!language) {
  243. language = [NSLocale preferredLanguages].firstObject;
  244. }
  245. dateFormatter.timeZone = timeZone;
  246. dateFormatter.locale = [[NSLocale alloc]initWithLocaleIdentifier:language];
  247. // 如果当前时间不存在,就获取距离最近的整点时间
  248. dateFormatter.lenient = YES;
  249. return [dateFormatter dateFromString:dateString];
  250. }
  251. #pragma mark - 获取当前时区(不使用夏时制)
  252. + (NSTimeZone *)currentTimeZone {
  253. // 当前时区
  254. NSTimeZone *localTimeZone = [NSTimeZone localTimeZone];
  255. // 当前时区相对于GMT(零时区)的偏移秒数
  256. NSInteger interval = [localTimeZone secondsFromGMTForDate:[NSDate date]];
  257. // 当前时区(不使用夏时制):由偏移量获得对应的NSTimeZone对象
  258. // 注意:一些夏令时时间 NSString 转 NSDate 时,默认会导致 NSDateFormatter 格式化失败,返回 null
  259. return [NSTimeZone timeZoneForSecondsFromGMT:interval];
  260. }
  261. #pragma mark - NSDate 转 NSString(已弃用)
  262. + (NSString *)br_getDateString:(NSDate *)date format:(NSString *)format {
  263. return [self br_stringFromDate:date dateFormat:format];
  264. }
  265. #pragma mark - NSString 转 NSDate(已弃用)
  266. + (NSDate *)br_getDate:(NSString *)dateString format:(NSString *)format {
  267. return [self br_dateFromString:dateString dateFormat:format];
  268. }
  269. @end