NSDate+Extension.m 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734
  1. //
  2. // NSDate+Extension.m
  3. // iOS-Categories (https://github.com/shaojiankui/iOS-Categories)
  4. //
  5. // Created by Jakey on 15/4/25.
  6. // Copyright (c) 2015年 www.skyfox.org. All rights reserved.
  7. // https://github.com/632840804/HYBNSDateExtension
  8. #import "NSDate+Extension.h"
  9. @implementation NSDate (Extension)
  10. // 计算截止时间
  11. + (NSString *)countDate:(NSDate *)beginDate endDate:(NSDate *)endDate {
  12. double intervalTime = [endDate timeIntervalSinceReferenceDate] - [beginDate timeIntervalSinceReferenceDate];
  13. if (intervalTime <= 0) {
  14. return @"已截止";
  15. }
  16. // 2.创建日历
  17. NSCalendar *calendar = [NSCalendar currentCalendar];
  18. NSCalendarUnit type = NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
  19. // 3.利用日历对象比较两个时间的差值
  20. NSDateComponents *cmps = [calendar components:type fromDate:beginDate toDate:endDate options:0];
  21. NSString *countStr = [NSString stringWithFormat:@"%02ld小时%02ld分",cmps.hour,cmps.minute];
  22. if (cmps.day > 0) {
  23. countStr = [NSString stringWithFormat:@"%ld天%@",cmps.day, countStr];
  24. }
  25. return countStr;
  26. }
  27. + (NSString *)countSecondDate:(NSDate *)beginDate endDate:(NSDate *)endDate {
  28. // 2.创建日历
  29. NSCalendar *calendar = [NSCalendar currentCalendar];
  30. NSCalendarUnit type = NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
  31. // 3.利用日历对象比较两个时间的差值
  32. NSDateComponents *cmps = [calendar components:type fromDate:beginDate toDate:endDate options:0];
  33. // NSString *countStr = [NSString stringWithFormat:@"%02ld小时%02ld分",cmps.hour,cmps.minute];
  34. NSString *countStr = nil;
  35. if (cmps.day == 0 && cmps.hour == 0 && cmps.minute == 0) {
  36. countStr = [NSString stringWithFormat:@"%ld秒前",cmps.second];
  37. }
  38. else if (cmps.day == 0 && cmps.hour == 0) {
  39. countStr = [NSString stringWithFormat:@"%ld分前",cmps.minute];
  40. }
  41. else if (cmps.day == 0){
  42. countStr = [NSString stringWithFormat:@"%ld小时前",cmps.hour];
  43. }
  44. else {
  45. countStr = [NSString stringWithFormat:@"%ld天前",cmps.day];
  46. }
  47. return countStr;
  48. }
  49. - (NSUInteger)day {
  50. return [NSDate day:self];
  51. }
  52. - (NSUInteger)month {
  53. return [NSDate month:self];
  54. }
  55. - (NSUInteger)year {
  56. return [NSDate year:self];
  57. }
  58. - (NSUInteger)hour {
  59. return [NSDate hour:self];
  60. }
  61. - (NSUInteger)minute {
  62. return [NSDate minute:self];
  63. }
  64. - (NSUInteger)second {
  65. return [NSDate second:self];
  66. }
  67. + (NSUInteger)day:(NSDate *)date {
  68. NSCalendar *calendar = [NSCalendar currentCalendar];
  69. #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0
  70. // NSDayCalendarUnit
  71. NSDateComponents *dayComponents = [calendar components:(NSCalendarUnitDay) fromDate:date];
  72. #else
  73. NSDateComponents *dayComponents = [calendar components:(NSDayCalendarUnit) fromDate:date];
  74. #endif
  75. return [dayComponents day];
  76. }
  77. + (NSUInteger)month:(NSDate *)date {
  78. NSCalendar *calendar = [NSCalendar currentCalendar];
  79. #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0
  80. // NSDayCalendarUnit
  81. NSDateComponents *dayComponents = [calendar components:(NSCalendarUnitMonth) fromDate:date];
  82. #else
  83. NSDateComponents *dayComponents = [calendar components:(NSMonthCalendarUnit) fromDate:date];
  84. #endif
  85. return [dayComponents month];
  86. }
  87. + (NSUInteger)year:(NSDate *)date {
  88. NSCalendar *calendar = [NSCalendar currentCalendar];
  89. #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0
  90. // NSDayCalendarUnit
  91. NSDateComponents *dayComponents = [calendar components:(NSCalendarUnitYear) fromDate:date];
  92. #else
  93. NSDateComponents *dayComponents = [calendar components:(NSYearCalendarUnit) fromDate:date];
  94. #endif
  95. return [dayComponents year];
  96. }
  97. + (NSUInteger)hour:(NSDate *)date {
  98. NSCalendar *calendar = [NSCalendar currentCalendar];
  99. #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0
  100. // NSDayCalendarUnit
  101. NSDateComponents *dayComponents = [calendar components:(NSCalendarUnitHour) fromDate:date];
  102. #else
  103. NSDateComponents *dayComponents = [calendar components:(NSHourCalendarUnit) fromDate:date];
  104. #endif
  105. return [dayComponents hour];
  106. }
  107. + (NSUInteger)minute:(NSDate *)date {
  108. NSCalendar *calendar = [NSCalendar currentCalendar];
  109. #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0
  110. // NSDayCalendarUnit
  111. NSDateComponents *dayComponents = [calendar components:(NSCalendarUnitMinute) fromDate:date];
  112. #else
  113. NSDateComponents *dayComponents = [calendar components:(NSMinuteCalendarUnit) fromDate:date];
  114. #endif
  115. return [dayComponents minute];
  116. }
  117. + (NSUInteger)second:(NSDate *)date {
  118. NSCalendar *calendar = [NSCalendar currentCalendar];
  119. #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0
  120. // NSDayCalendarUnit
  121. NSDateComponents *dayComponents = [calendar components:(NSCalendarUnitSecond) fromDate:date];
  122. #else
  123. NSDateComponents *dayComponents = [calendar components:(NSSecondCalendarUnit) fromDate:date];
  124. #endif
  125. return [dayComponents second];
  126. }
  127. - (NSUInteger)daysInYear {
  128. return [NSDate daysInYear:self];
  129. }
  130. + (NSUInteger)daysInYear:(NSDate *)date {
  131. return [self isLeapYear:date] ? 366 : 365;
  132. }
  133. - (BOOL)isLeapYear {
  134. return [NSDate isLeapYear:self];
  135. }
  136. + (BOOL)isLeapYear:(NSDate *)date {
  137. NSUInteger year = [date year];
  138. if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
  139. return YES;
  140. }
  141. return NO;
  142. }
  143. - (NSString *)formatYMD {
  144. return [NSDate formatYMD:self];
  145. }
  146. + (NSString *)formatYMD:(NSDate *)date {
  147. return [NSString stringWithFormat:@"%lu-%02lu-%02lu",[date year],[date month], [date day]];
  148. }
  149. - (NSString *)formatYMDHMS {
  150. return [NSDate formatYMDHMS:self];
  151. }
  152. + (NSString *)formatYMDHMS:(NSDate *)date {
  153. return [NSString stringWithFormat:@"%lu-%02lu-%02lu %02lu-%02lu-%02lu",[date year],[date month], [date day], [date hour], [date minute], [date second]];
  154. }
  155. - (NSUInteger)weeksOfMonth {
  156. return [NSDate weeksOfMonth:self];
  157. }
  158. + (NSUInteger)weeksOfMonth:(NSDate *)date {
  159. return [[date lastdayOfMonth] weekOfYear] - [[date begindayOfMonth] weekOfYear] + 1;
  160. }
  161. - (NSUInteger)weekOfYear {
  162. return [NSDate weekOfYear:self];
  163. }
  164. + (NSUInteger)weekOfYear:(NSDate *)date {
  165. NSUInteger i;
  166. NSUInteger year = [date year];
  167. NSDate *lastdate = [date lastdayOfMonth];
  168. for (i = 1;[[lastdate dateAfterDay:-7 * i] year] == year; i++) {
  169. }
  170. return i;
  171. }
  172. - (NSDate *)dateAfterDay:(NSUInteger)day {
  173. return [NSDate dateAfterDate:self day:day];
  174. }
  175. + (NSDate *)dateAfterDate:(NSDate *)date day:(NSInteger)day {
  176. NSCalendar *calendar = [NSCalendar currentCalendar];
  177. NSDateComponents *componentsToAdd = [[NSDateComponents alloc] init];
  178. [componentsToAdd setDay:day];
  179. NSDate *dateAfterDay = [calendar dateByAddingComponents:componentsToAdd toDate:date options:0];
  180. return dateAfterDay;
  181. }
  182. - (NSDate *)dateAfterMonth:(NSUInteger)month {
  183. return [NSDate dateAfterDate:self month:month];
  184. }
  185. + (NSDate *)dateAfterDate:(NSDate *)date month:(NSInteger)month {
  186. NSCalendar *calendar = [NSCalendar currentCalendar];
  187. NSDateComponents *componentsToAdd = [[NSDateComponents alloc] init];
  188. [componentsToAdd setMonth:month];
  189. NSDate *dateAfterMonth = [calendar dateByAddingComponents:componentsToAdd toDate:date options:0];
  190. return dateAfterMonth;
  191. }
  192. - (NSDate *)begindayOfMonth {
  193. return [NSDate begindayOfMonth:self];
  194. }
  195. + (NSDate *)begindayOfMonth:(NSDate *)date {
  196. return [self dateAfterDate:date day:-[date day] + 1];
  197. }
  198. - (NSDate *)lastdayOfMonth {
  199. return [NSDate lastdayOfMonth:self];
  200. }
  201. + (NSDate *)lastdayOfMonth:(NSDate *)date {
  202. NSDate *lastDate = [self begindayOfMonth:date];
  203. return [[lastDate dateAfterMonth:1] dateAfterDay:-1];
  204. }
  205. - (NSUInteger)daysAgo {
  206. return [NSDate daysAgo:self];
  207. }
  208. + (NSUInteger)daysAgo:(NSDate *)date {
  209. NSCalendar *calendar = [NSCalendar currentCalendar];
  210. #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0
  211. NSDateComponents *components = [calendar components:(NSCalendarUnitDay)
  212. fromDate:date
  213. toDate:[NSDate date]
  214. options:0];
  215. #else
  216. NSDateComponents *components = [calendar components:(NSDayCalendarUnit)
  217. fromDate:date
  218. toDate:[NSDate date]
  219. options:0];
  220. #endif
  221. return [components day];
  222. }
  223. - (NSInteger)weekday {
  224. return [NSDate weekday:self];
  225. }
  226. + (NSInteger)weekday:(NSDate *)date {
  227. NSCalendar *gregorian = [[NSCalendar alloc]
  228. initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
  229. NSDateComponents *comps = [gregorian components:(NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear | NSCalendarUnitWeekday) fromDate:date];
  230. NSInteger weekday = [comps weekday];
  231. return weekday;
  232. }
  233. - (NSString *)dayFromWeekday {
  234. return [NSDate dayFromWeekday:self];
  235. }
  236. + (NSString *)dayFromWeekday:(NSDate *)date {
  237. switch([date weekday]) {
  238. case 1:
  239. return @"星期天";
  240. break;
  241. case 2:
  242. return @"星期一";
  243. break;
  244. case 3:
  245. return @"星期二";
  246. break;
  247. case 4:
  248. return @"星期三";
  249. break;
  250. case 5:
  251. return @"星期四";
  252. break;
  253. case 6:
  254. return @"星期五";
  255. break;
  256. case 7:
  257. return @"星期六";
  258. break;
  259. default:
  260. break;
  261. }
  262. return @"";
  263. }
  264. + (NSString *)shortDayFromWeekday:(NSDate *)date {
  265. switch([date weekday]) {
  266. case 1:
  267. return @"周日";
  268. break;
  269. case 2:
  270. return @"周一";
  271. break;
  272. case 3:
  273. return @"周二";
  274. break;
  275. case 4:
  276. return @"周三";
  277. break;
  278. case 5:
  279. return @"周四";
  280. break;
  281. case 6:
  282. return @"周五";
  283. break;
  284. case 7:
  285. return @"周六";
  286. break;
  287. default:
  288. break;
  289. }
  290. return @"";
  291. }
  292. - (BOOL)isSameDay:(NSDate *)anotherDate {
  293. NSCalendar *calendar = [NSCalendar currentCalendar];
  294. NSDateComponents *components1 = [calendar components:(NSCalendarUnitYear
  295. | NSCalendarUnitMonth
  296. | NSCalendarUnitDay)
  297. fromDate:self];
  298. NSDateComponents *components2 = [calendar components:(NSCalendarUnitYear
  299. | NSCalendarUnitMonth
  300. | NSCalendarUnitDay)
  301. fromDate:anotherDate];
  302. return ([components1 year] == [components2 year]
  303. && [components1 month] == [components2 month]
  304. && [components1 day] == [components2 day]);
  305. }
  306. - (BOOL)isSameYear:(NSDate *)anotherDate {
  307. NSCalendar *calendar = [NSCalendar currentCalendar];
  308. NSDateComponents *components1 = [calendar components:(NSCalendarUnitYear
  309. | NSCalendarUnitMonth
  310. | NSCalendarUnitDay)
  311. fromDate:self];
  312. NSDateComponents *components2 = [calendar components:(NSCalendarUnitYear
  313. | NSCalendarUnitMonth
  314. | NSCalendarUnitDay)
  315. fromDate:anotherDate];
  316. return ([components1 year] == [components2 year]);
  317. }
  318. - (BOOL)isToday {
  319. return [self isSameDay:[NSDate date]];
  320. }
  321. /// 是否今年
  322. - (BOOL)isCurrentYear {
  323. return [self isSameYear:[NSDate date]];
  324. }
  325. - (NSDate *)dateByAddingDays:(NSUInteger)days {
  326. NSDateComponents *c = [[NSDateComponents alloc] init];
  327. c.day = days;
  328. return [[NSCalendar currentCalendar] dateByAddingComponents:c toDate:self options:0];
  329. }
  330. /**
  331. * Get the month as a localized string from the given month number
  332. *
  333. * @param month The month to be converted in string
  334. * [1 - January]
  335. * [2 - February]
  336. * [3 - March]
  337. * [4 - April]
  338. * [5 - May]
  339. * [6 - June]
  340. * [7 - July]
  341. * [8 - August]
  342. * [9 - September]
  343. * [10 - October]
  344. * [11 - November]
  345. * [12 - December]
  346. *
  347. * @return Return the given month as a localized string
  348. */
  349. + (NSString *)monthWithMonthNumber:(NSInteger)month {
  350. switch(month) {
  351. case 1:
  352. return @"January";
  353. break;
  354. case 2:
  355. return @"February";
  356. break;
  357. case 3:
  358. return @"March";
  359. break;
  360. case 4:
  361. return @"April";
  362. break;
  363. case 5:
  364. return @"May";
  365. break;
  366. case 6:
  367. return @"June";
  368. break;
  369. case 7:
  370. return @"July";
  371. break;
  372. case 8:
  373. return @"August";
  374. break;
  375. case 9:
  376. return @"September";
  377. break;
  378. case 10:
  379. return @"October";
  380. break;
  381. case 11:
  382. return @"November";
  383. break;
  384. case 12:
  385. return @"December";
  386. break;
  387. default:
  388. break;
  389. }
  390. return @"";
  391. }
  392. + (NSString *)stringWithDate:(NSDate *)date format:(NSString *)format {
  393. return [date stringWithFormat:format];
  394. }
  395. - (NSString *)stringWithFormat:(NSString *)format {
  396. NSDateFormatter *outputFormatter = [NSObject getDateformatter];
  397. [outputFormatter setDateFormat:format];
  398. NSString *retStr = [outputFormatter stringFromDate:self];
  399. return retStr;
  400. }
  401. + (NSDate *)dateWithString:(NSString *)string dateFormat:(NSString *)format {
  402. NSDateFormatter *inputFormatter = [NSObject getDateformatter];
  403. [inputFormatter setDateFormat:format];
  404. NSDate *date = [inputFormatter dateFromString:string];
  405. return date;
  406. }
  407. - (NSUInteger)daysInMonth:(NSUInteger)month {
  408. return [NSDate daysInMonth:self month:month];
  409. }
  410. + (NSUInteger)daysInMonth:(NSDate *)date month:(NSUInteger)month {
  411. switch (month) {
  412. case 1: case 3: case 5: case 7: case 8: case 10: case 12:
  413. return 31;
  414. case 2:
  415. return [date isLeapYear] ? 29 : 28;
  416. }
  417. return 30;
  418. }
  419. - (NSUInteger)daysInMonth {
  420. return [NSDate daysInMonth:self];
  421. }
  422. + (NSUInteger)daysInMonth:(NSDate *)date {
  423. return [self daysInMonth:date month:[date month]];
  424. }
  425. - (NSString *)timeInfo {
  426. return [NSDate timeInfoWithDate:self];
  427. }
  428. + (NSString *)timeInfoWithDate:(NSDate *)date {
  429. return [self timeInfoWithDateString:[self stringWithDate:date format:[self ymdHmsFormat]]];
  430. }
  431. + (NSString *)timeInfoWithDateString:(NSString *)dateString {
  432. NSDate *date = [self dateWithString:dateString dateFormat:[self ymdHmsFormat]];
  433. NSDate *curDate = [NSDate date];
  434. NSTimeInterval time = -[date timeIntervalSinceDate:curDate];
  435. int month = (int)([curDate month] - [date month]);
  436. int year = (int)([curDate year] - [date year]);
  437. int day = (int)([curDate day] - [date day]);
  438. NSTimeInterval retTime = 1.0;
  439. if (time < 3600) { // 小于一小时
  440. retTime = time / 60;
  441. retTime = retTime <= 0.0 ? 1.0 : retTime;
  442. return [NSString stringWithFormat:@"%.0f分钟前", retTime];
  443. } else if (time < 3600 * 24) { // 小于一天,也就是今天
  444. retTime = time / 3600;
  445. retTime = retTime <= 0.0 ? 1.0 : retTime;
  446. return [NSString stringWithFormat:@"%.0f小时前", retTime];
  447. } else if (time < 3600 * 24 * 2) {
  448. return @"昨天";
  449. }
  450. // 第一个条件是同年,且相隔时间在一个月内
  451. // 第二个条件是隔年,对于隔年,只能是去年12月与今年1月这种情况
  452. else if ((abs(year) == 0 && abs(month) <= 1)
  453. || (abs(year) == 1 && [curDate month] == 1 && [date month] == 12)) {
  454. int retDay = 0;
  455. if (year == 0) { // 同年
  456. if (month == 0) { // 同月
  457. retDay = day;
  458. }
  459. }
  460. if (retDay <= 0) {
  461. // 获取发布日期中,该月有多少天
  462. int totalDays = (int)[self daysInMonth:date month:[date month]];
  463. // 当前天数 + (发布日期月中的总天数-发布日期月中发布日,即等于距离今天的天数)
  464. retDay = (int)[curDate day] + (totalDays - (int)[date day]);
  465. }
  466. return [NSString stringWithFormat:@"%d天前", (abs)(retDay)];
  467. } else {
  468. if (abs(year) <= 1) {
  469. if (year == 0) { // 同年
  470. return [NSString stringWithFormat:@"%d个月前", abs(month)];
  471. }
  472. // 隔年
  473. int month = (int)[curDate month];
  474. int preMonth = (int)[date month];
  475. if (month == 12 && preMonth == 12) {// 隔年,但同月,就作为满一年来计算
  476. return @"1年前";
  477. }
  478. return [NSString stringWithFormat:@"%d个月前", (abs)(12 - preMonth + month)];
  479. }
  480. return [NSString stringWithFormat:@"%d年前", abs(year)];
  481. }
  482. return @"1小时前";
  483. }
  484. - (NSString *)ymdFormat {
  485. return [NSDate ymdFormat];
  486. }
  487. - (NSString *)hmsFormat {
  488. return [NSDate hmsFormat];
  489. }
  490. - (NSString *)ymdHmsFormat {
  491. return [NSDate ymdHmsFormat];
  492. }
  493. + (NSString *)ymdFormat {
  494. return @"yyyy-MM-dd";
  495. }
  496. + (NSString *)hmsFormat {
  497. return @"HH:mm:ss";
  498. }
  499. + (NSString *)ymdHmsFormat {
  500. return [NSString stringWithFormat:@"%@ %@", [self ymdFormat], [self hmsFormat]];
  501. }
  502. - (NSDate *)offsetYears:(int)numYears {
  503. return [NSDate offsetYears:numYears fromDate:self];
  504. }
  505. + (NSDate *)offsetYears:(int)numYears fromDate:(NSDate *)fromDate {
  506. if (fromDate == nil) {
  507. return nil;
  508. }
  509. #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0
  510. // NSDayCalendarUnit
  511. NSCalendar *gregorian = [[NSCalendar alloc]
  512. initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
  513. #else
  514. NSCalendar *gregorian = [[NSCalendar alloc]
  515. initWithCalendarIdentifier:NSGregorianCalendar];
  516. #endif
  517. NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
  518. [offsetComponents setYear:numYears];
  519. return [gregorian dateByAddingComponents:offsetComponents
  520. toDate:fromDate
  521. options:0];
  522. }
  523. - (NSDate *)offsetMonths:(int)numMonths {
  524. return [NSDate offsetMonths:numMonths fromDate:self];
  525. }
  526. + (NSDate *)offsetMonths:(int)numMonths fromDate:(NSDate *)fromDate {
  527. if (fromDate == nil) {
  528. return nil;
  529. }
  530. #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0
  531. // NSDayCalendarUnit
  532. NSCalendar *gregorian = [[NSCalendar alloc]
  533. initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
  534. #else
  535. NSCalendar *gregorian = [[NSCalendar alloc]
  536. initWithCalendarIdentifier:NSGregorianCalendar];
  537. #endif
  538. NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
  539. [offsetComponents setMonth:numMonths];
  540. return [gregorian dateByAddingComponents:offsetComponents
  541. toDate:fromDate
  542. options:0];
  543. }
  544. - (NSDate *)offsetDays:(int)numDays {
  545. return [NSDate offsetDays:numDays fromDate:self];
  546. }
  547. + (NSDate *)offsetDays:(int)numDays fromDate:(NSDate *)fromDate {
  548. if (fromDate == nil) {
  549. return nil;
  550. }
  551. #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0
  552. // NSDayCalendarUnit
  553. NSCalendar *gregorian = [[NSCalendar alloc]
  554. initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
  555. #else
  556. NSCalendar *gregorian = [[NSCalendar alloc]
  557. initWithCalendarIdentifier:NSGregorianCalendar];
  558. #endif
  559. NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
  560. [offsetComponents setDay:numDays];
  561. return [gregorian dateByAddingComponents:offsetComponents
  562. toDate:fromDate
  563. options:0];
  564. }
  565. - (NSDate *)offsetHours:(int)hours {
  566. return [NSDate offsetHours:hours fromDate:self];
  567. }
  568. + (NSDate *)offsetHours:(int)numHours fromDate:(NSDate *)fromDate {
  569. if (fromDate == nil) {
  570. return nil;
  571. }
  572. #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0
  573. // NSDayCalendarUnit
  574. NSCalendar *gregorian = [[NSCalendar alloc]
  575. initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
  576. #else
  577. NSCalendar *gregorian = [[NSCalendar alloc]
  578. initWithCalendarIdentifier:NSGregorianCalendar];
  579. #endif
  580. NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
  581. [offsetComponents setHour:numHours];
  582. return [gregorian dateByAddingComponents:offsetComponents
  583. toDate:fromDate
  584. options:0];
  585. }
  586. // get current timestamp sice 1970
  587. + (NSString *)getCurrentTimestamp {
  588. // 以下这个结果是10位数,interval得出的数会有6位小数,应该是精确到微秒
  589. NSTimeInterval interval = [[NSDate date] timeIntervalSince1970] *1000000;
  590. NSString *time = [[NSString stringWithFormat:@"%f",interval] replaceAll:@"." WithString:@"-"];
  591. NSString *timestamp = time;
  592. return timestamp;
  593. }
  594. // get current timestamp sice 1970 base64
  595. + (NSString *)getCurrentTimestampFor64 {
  596. // 以下这个结果是10位数,interval得出的数会有6位小数,应该是精确到微秒
  597. NSTimeInterval interval = [[NSDate date] timeIntervalSince1970] *1000000;
  598. NSString *time = [[NSString stringWithFormat:@"%f",interval] replaceAll:@"." WithString:@""];
  599. NSString *timestamp = time;
  600. return [timestamp ks_base64EncodedString];
  601. }
  602. @end