123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308 |
- //
- // NSDate+Extension.m
- // YZCCalender
- //
- // Created by Jason on 2018/1/17.
- // Copyright © 2018年 jason. All rights reserved.
- //
- #import "NSDate+Extension.h"
- @implementation NSDate (Extension)
- #pragma mark -- 获取日
- + (NSInteger)day:(NSString *)date {
- NSDateFormatter *dateFormatter = [[self class] setDataFormatter];
- NSDate *startDate = [dateFormatter dateFromString:date];
- NSDateComponents *components = [[NSCalendar currentCalendar] components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:startDate];
-
- return components.day;
- }
- #pragma mark -- 获取月
- + (NSInteger)month:(NSString *)date {
- NSDateFormatter *dateFormatter = [[self class] setDataFormatter];
- NSDate *startDate = [dateFormatter dateFromString:date];
- NSDateComponents *components = [[NSCalendar currentCalendar] components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:startDate];
-
- return components.month;
- }
- #pragma mark -- 获取年
- + (NSInteger)year:(NSString *)date {
- NSDateFormatter *dateFormatter = [[self class] setDataFormatter];
- NSDate *startDate = [dateFormatter dateFromString:date];
- NSDateComponents *components = [[NSCalendar currentCalendar] components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:startDate];
-
- return components.year;
- }
- #pragma mark -- 获得当前月份第一天星期几
- + (NSInteger)firstWeekdayInThisMonth:(NSDate *)date {
- NSCalendar *calendar = [NSCalendar currentCalendar];
-
- //设置每周的第一天从周几开始,默认为1,从周日开始
- [calendar setFirstWeekday:1];//1.Sun. 2.Mon. 3.Thes. 4.Wed. 5.Thur. 6.Fri. 7.Sat.
- NSDateComponents *comp = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:date];
- [comp setDay:1];
- NSDate *firstDayOfMonthDate = [calendar dateFromComponents:comp];
- NSUInteger firstWeekday = [calendar ordinalityOfUnit:NSCalendarUnitWeekday inUnit:NSCalendarUnitWeekOfMonth forDate:firstDayOfMonthDate];
- //若设置从周日开始算起则需要减一,若从周一开始算起则不需要减
- return firstWeekday - 1;
- }
- #pragma mark -- 获取当前月共有多少天
- + (NSInteger)totaldaysInMonth:(NSDate *)date {
- NSRange daysInLastMonth = [[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:date];
-
- return daysInLastMonth.length;
- }
- #pragma mark -- 获取日期
- + (NSString *)timeStringWithInterval:(NSTimeInterval)timeInterval {
- NSDateFormatter *dateFormatter = [[self class] setDataFormatter];
- NSDate *date = [NSDate dateWithTimeIntervalSince1970:timeInterval];
- NSString *dateString = [dateFormatter stringFromDate:date];
-
- return dateString;
- }
- #pragma mark -- 设置日期格式
- + (NSDateFormatter *)setDataFormatter {
- NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
-
- [dateFormatter setDateFormat:@"yyyy-MM-dd"];
- [dateFormatter setLocale:[NSLocale currentLocale]];
- return dateFormatter;
- }
- #pragma mark -- 计算两个日期之间相差天数
- + (NSDateComponents *)calcDaysbetweenDate:(NSString *)startDateStr endDateStr:(NSString *)endDateStr {
- NSDateFormatter *dateFormatter = [[self class] setDataFormatter];
- NSDate *startDate = [dateFormatter dateFromString:startDateStr];
- NSDate *endDate = [dateFormatter dateFromString:endDateStr];
-
- //利用NSCalendar比较日期的差异
- NSCalendar *calendar = [NSCalendar currentCalendar];
- /**
- * 要比较的时间单位,常用如下,可以同时传:
- * NSCalendarUnitDay : 天
- * NSCalendarUnitYear : 年
- * NSCalendarUnitMonth : 月
- * NSCalendarUnitHour : 时
- * NSCalendarUnitMinute : 分
- * NSCalendarUnitSecond : 秒
- */
- NSCalendarUnit unit = NSCalendarUnitDay | NSCalendarUnitMonth;
-
- NSDateComponents *delta = [calendar components:unit fromDate:startDate toDate:endDate options:0];
-
- return delta;
- }
- + (NSTimeInterval)timeIntervalFromDateString:(NSString *)dateString {
- static NSDateFormatter *dateFormatter = nil;
-
- if (dateFormatter == nil) {
- dateFormatter = [[NSDateFormatter alloc] init];
- [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
- [dateFormatter setLocale:[NSLocale currentLocale]];
- }
-
- NSDate *date = [dateFormatter dateFromString:dateString];
- NSTimeInterval interval = [date timeIntervalSince1970];
-
- return interval;
- }
- + (BOOL)isToday:(NSString *)date {
- BOOL isToday = NO;
- NSString *today = [NSDate timeStringWithInterval:[NSDate date].timeIntervalSince1970];
- if ([date isEqualToString:today]) {
- isToday = YES;
- }
- return isToday;
- }
- + (BOOL)isEqualBetweenWithDate:(NSString *)date toDate:(NSString *)toDate {
- BOOL isToday = NO;
- if ([toDate isEqualToString:date]) {
- isToday = YES;
- }
- return isToday;
- }
- + (BOOL)isCurrenMonth:(NSString *)date {
- BOOL isCurrenMonth = NO;
- NSString *month = [[NSDate timeStringWithInterval:[NSDate date].timeIntervalSince1970] substringWithRange:NSMakeRange(0, 7)];
-
- if ([date isEqualToString:month]) {
- isCurrenMonth = YES;
- }
- return isCurrenMonth;
- }
- + (BOOL)isCurrenYear:(NSString *)date{
- BOOL isCurrenYear = NO;
- NSString *year = [[NSDate timeStringWithInterval:[NSDate date].timeIntervalSince1970] substringWithRange:NSMakeRange(0, 4)];
-
- if ([date isEqualToString:year]) {
- isCurrenYear = YES;
- }
- return isCurrenYear;
- }
- + (NSString *)getTimeWihtDate:(NSString *)date
- {
- // NSLog(@"日:%@",[date substringWithRange:NSMakeRange(11, 5)]);
- // NSLog(@"月:%@",[date substringWithRange:NSMakeRange(5, 5)]);
- // NSLog(@"年:%@",[date substringWithRange:NSMakeRange(0, 10)]);
- // date = @"2017-11-10 09:11:11";
- if ([[date substringWithRange:NSMakeRange(0, 10)] isEqualToString:[NSDate timeStringWithInterval:[NSDate date].timeIntervalSince1970]]) {
- return [date substringWithRange:NSMakeRange(11, 5)];
- }else if([[date substringWithRange:NSMakeRange(0, 7)] isEqualToString:[[NSDate timeStringWithInterval:[NSDate date].timeIntervalSince1970] substringWithRange:NSMakeRange(0, 7)]]){
- return [date substringWithRange:NSMakeRange(5, 5)];
- }else{
- return [date substringWithRange:NSMakeRange(0, 10)];
- }
- }
- + (NSString *)getTimeStringAutoShort2:(NSString *)date{
- if ([date isKindOfClass:[NSNull class]] || date == nil) {
- return @"";
- }else{
- if (date.length == 0) {
- return @"";
- }
- }
- NSDate * dt = [self getStringDate:date format:@"yyyy-MM-dd HH:mm:ss"];
- NSString * ret = nil;
- NSCalendar * calendar = [NSCalendar currentCalendar];
- // 当前时间
- NSDate * currentDate = [NSDate date];
- NSDateComponents * curComponents = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitWeekday fromDate:currentDate];
- NSInteger currentYear = [curComponents year];
- NSInteger currentMonth = [curComponents month];
- NSInteger currentDay = [curComponents day];
- // 目标判断时间
- NSDateComponents*srcComponents = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitWeekday fromDate:dt];
- NSInteger srcYear = [srcComponents year];
- NSInteger srcMonth = [srcComponents month];
- NSInteger srcDay = [srcComponents day];
- // 要额外显示的时间分钟
- if(currentYear == srcYear) {
- long currentTimestamp = [self getIOSTimeStamp:currentDate];
- long srcTimestamp = [self getIOSTimeStamp:dt];
- // 相差时间(单位:秒)
- long delta = currentTimestamp - srcTimestamp;
- // 当天(月份和日期一致才是)
- if(currentMonth == srcMonth && currentDay == srcDay) {
- // 时间相差60秒以内
- if(delta < 60){
- ret = @"刚刚";
- }else if (delta < 60 * 60){
- ret = [NSString stringWithFormat:@"%ld分钟前",(long)delta/60];
- }else{
- ret = [NSString stringWithFormat:@"%ld小时前",(long)delta/60/60];
- }
- }else{
- ret = [self getTimeString:dt format:@"MM-dd HH:mm"];
- }
- }else{/// 往年 2020-12-21
- ret = [self getTimeString:dt format:@"yyyy-MM-dd"];
- }
- return ret;
- }
- + (NSString *)getTimeStringAutoShort3:(NSString *)date{
- if ([date isKindOfClass:[NSNull class]] || date == nil) {
- return @"";
- }else{
- if (date.length == 0) {
- return @"";
- }
- }
- NSDate * dt = [self getStringDate:date format:@"yyyy-MM-dd HH:mm:ss"];
- NSString * ret = [self getTimeString:dt format:@"yyyy-MM-dd"];
- return ret;
- }
- + (NSString *)getTimeString:(NSDate *)dt format:(NSString *)fmt{
- NSDateFormatter* format = [[NSDateFormatter alloc] init];
- [format setDateFormat:fmt];
- return [format stringFromDate:[NSDate dateWithTimeIntervalSince1970:[dt timeIntervalSince1970]]];
- }
- + (NSDate *)getStringDate:(NSString *)date format:(NSString *)fmt{
- NSDateFormatter* format = [[NSDateFormatter alloc] init];
- [format setDateFormat:fmt];
- return [format dateFromString:date];
- }
- + (long)getIOSTimeStamp:(NSDate*)dat{
- long a = [dat timeIntervalSince1970];
- return a;
- }
- + (long)getIOSTimeStamp_l:(NSDate*)dat{
- return[[NSNumber numberWithDouble:[self getIOSTimeStamp:dat]] longValue];
- }
- + (NSString *)getCHtimeWihtDate:(NSString *)date
- {
- NSDate * dt = [self getStringDate:date format:@"yyyy-MM-dd HH:mm:ss"];
- NSString * ret = nil;
- NSCalendar * calendar = [NSCalendar currentCalendar];
- // 当前时间
- NSDate * currentDate = [NSDate date];
- NSDateComponents * curComponents = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitWeekday fromDate:currentDate];
- NSInteger currentYear = [curComponents year];
- // 目标判断时间
- NSDateComponents*srcComponents = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitWeekday fromDate:dt];
- NSInteger srcYear = [srcComponents year];
- // 要额外显示的时间分钟
- // 当年
- if(currentYear == srcYear) {
- ret = [self getTimeString:dt format:@"MM-dd HH:mm"];
- }else{/// 往年 2020-12-21
- ret = [self getTimeString:dt format:@"yyyy-MM-dd HH:mm"];
- }
- return ret;
- }
- + (NSString *)getDayWihtDate:(NSString *)date
- {
- NSDate * dt = [self getStringDate:date format:@"yyyy-MM-dd HH:mm:ss"];
- NSString * ret = [self getTimeString:dt format:@"MM-dd"];
- return ret;
- }
- + (NSString *)getMonthAndDayWihtDate:(NSString *)date
- {
- NSDate * dt = [self getStringDate:date format:@"yyyy-MM-dd HH:mm:ss"];
- NSString * ret = nil;
- NSCalendar * calendar = [NSCalendar currentCalendar];
- // 当前时间
- NSDate * currentDate = [NSDate date];
- NSDateComponents * curComponents = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitWeekday fromDate:currentDate];
- NSInteger currentYear = [curComponents year];
- NSInteger currentMonth = [curComponents month];
- NSInteger currentDay = [curComponents day];
- // 目标判断时间
- NSDateComponents*srcComponents = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitWeekday fromDate:dt];
- NSInteger srcYear = [srcComponents year];
- NSInteger srcMonth = [srcComponents month];
- NSInteger srcDay = [srcComponents day];
- // 要额外显示的时间分钟
- if(currentYear == srcYear) {
- long currentTimestamp = [self getIOSTimeStamp:currentDate];
- long srcTimestamp = [self getIOSTimeStamp:dt];
- // 相差时间(单位:秒)
- long delta = currentTimestamp - srcTimestamp;
- // 当天(月份和日期一致才是)
- if(currentMonth == srcMonth && currentDay == srcDay) {
- // 时间相差60秒以内
- ret = @"今天";
- }else if(delta > 60 * 60 * 24 && delta < 60 * 60 * 48) {
- ret = @"昨天";
- }else{
- ret = [self getTimeString:dt format:@"MM-dd"];
- }
- }else{/// 往年 2020-12-21
- ret = [self getTimeString:dt format:@"MM-dd"];
- }
- return ret;
- }
- @end
|