美文网首页兴趣iOS
完整的时间计算

完整的时间计算

作者: 沧海的风 | 来源:发表于2016-11-30 14:42 被阅读31次

    做App避免不了要和时间打交道,关于时间的处理,里面有不少门道,远不是一行API调用,获取当前系统时间这么简单。我们需要了解与时间相关的各种API之间的差别,再因场景而异去设计相应的机制。

    • 当前时间是否在fromHour和toHour之间
      * @brief 判断当前时间是否在fromHour和toHour之间。如, fromHour=8,toHour=23时,即为判断当前时间是否在8:00-23:00之间
      - (BOOL)isBetweenFromHour:(NSInteger)fromHour toHour:(NSInteger)toHour
      {
      NSDate *fromData = [self getCustomDateWithHour:fromHour];
      NSDate *toData = [self getCustomDateWithHour:toHour];

          NSDate *currentDate = [NSDate date];
      
          if ([currentDate compare:fromData] == NSOrderedDescending && [currentDate compare:toData] == NSOrderedAscending)
          {
              NSLog(@"该时间在 %ld:00-%ld:00 之间!", (long)fromHour, (long)toHour);
              return YES;
          }
          return NO;
      }
      
    • 生成当天的某个点
      * @brief 生成当天的某个点(返回的是伦敦时间,可直接与当前时 间[NSDate date]比较)
      * @param hour 如hour为“8”,就是上午8:00(本地时间)
      - (NSDate *)getCustomDateWithHour:(NSInteger)hour
      {
      //获取当前时间
      NSDate *currentDate = [NSDate date];
      NSCalendar *currentCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
      NSDateComponents *currentComps = [[NSDateComponents alloc] init];

          NSInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
      
          currentComps = [currentCalendar components:unitFlags fromDate:currentDate];
      
          //设置当天的某个点
          NSDateComponents *resultComps = [[NSDateComponents alloc] init];
          [resultComps setYear:[currentComps year]];
          [resultComps setMonth:[currentComps month]];
          [resultComps setDay:[currentComps day]];
          [resultComps setHour:hour];
      
          NSCalendar *resultCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
          return [resultCalendar dateFromComponents:resultComps];
      

    }

    • 字符串转时间
      * @param dateString 时间字符串
      * @param format 字符串格式 yyyy-MM-dd HH:mm:ss
      + (NSDate *)stringToDate:(NSString *)dateString format:(NSString *)format {
      NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
      [dateFormatter setDateFormat: format];
      NSDate *destDate= [dateFormatter dateFromString:dateString];
      return destDate;
      }

    • 时间转字符串
      + (NSString *)dateToString:(NSDate *)date format:(NSString )format {
      NSDateFormatter
      dateFormat = [[NSDateFormatter alloc] init];
      [dateFormat setDateFormat:format];
      NSString *dateString = [dateFormat stringFromDate:date];
      return dateString;
      }

    • 时间差
      + (NSTimeInterval)timeIntervalBetween:(NSDate *)beginDate and:(NSDate *)endDate
      {
      NSTimeInterval begin = [beginDate timeIntervalSince1970];
      NSTimeInterval end = [endDate timeIntervalSince1970];
      NSTimeInterval sub = end - begin;
      return sub;
      }

    • 生成时间戳 (时间戳:从1970年1月1号 00:00:00开始走过的毫秒数)
      +(NSString *)createTimestamp
      {
      NSDate *datenow=[NSDate date];
      NSTimeZone *zone = [NSTimeZone systemTimeZone];
      NSInteger interval = [zone secondsFromGMTForDate:datenow];
      NSDate *localeDate = [datenow dateByAddingTimeInterval: interval];
      return [NSString stringWithFormat:@"%ld",(long)[localeDate timeIntervalSince1970]];
      }

    • 时间转时间戳
      + (NSString *)parseParamDate:(NSDate *)date
      {
      NSTimeInterval time = [date timeIntervalSince1970] * 1000;
      return [NSString stringWithFormat:@"\/Date(%lld+0800)\/", (long long)time];
      }

    • 时间戳转时间
      + (NSDate *)getDate:(NSString *)jsonValue
      {
      NSRange range = [jsonValue rangeOfString:@"\d{13}" options:NSRegularExpressionSearch];
      if (range.location == NSNotFound) {
      return nil;
      }
      NSString *value = [jsonValue substringWithRange:range];
      NSDate *result = [NSDate dateWithTimeIntervalSince1970:[value doubleValue]/1000];
      return result;
      }

    • 将本地日期字符串转为UTC日期字符串
      //本地日期格式:2013-08-03 12:53:51
      //可自行指定输入输出格式
      -(NSString *)getUTCFormateLocalDate:(NSString *)localDate
      {
      NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
      //输入格式
      [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

          NSDate *dateFormatted = [dateFormatter dateFromString:localDate];  
          NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"UTC"];  
          [dateFormatter setTimeZone:timeZone];  
          //输出格式  
          [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];  
          NSString *dateString = [dateFormatter stringFromDate:dateFormatted];  
          return dateString;  
      }  
      
    • 将UTC日期字符串转为本地时间字符串
      //输入的UTC日期格式2013-08-03T04:53:51+0000
      -(NSString *)getLocalDateFormateUTCDate:(NSString *)utcDate
      {
      NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
      //输入格式
      [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];
      NSTimeZone *localTimeZone = [NSTimeZone localTimeZone];
      [dateFormatter setTimeZone:localTimeZone];

         NSDate *dateFormatted = [dateFormatter dateFromString:utcDate];  
         //输出格式  
         [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];  
         NSString *dateString = [dateFormatter stringFromDate:dateFormatted];  
         return dateString;  
      }  
      

    时间描述

      #import <Foundation/Foundation.h>
    
      @interface NSDate (CZH)
      /// 日期描述字符串
      /// 格式如下
      ///     -   刚刚(一分钟内)
      ///     -   X分钟前(一小时内)
      ///     -   X小时前(当天)
      ///     -   昨天 HH:mm(昨天)
      ///     -   MM-dd HH:mm(一年内)
      ///     -   yyyy-MM-dd HH:mm(更早期)
      - (NSString *)czh_dateDescription;
    
      @end
    
    
    
      #import "NSDate+CZH.h"
    
      @implementation NSDate (CZH)
      - (NSString *)czh_dateDescription
      {
    
          // 1. 获取当前日历
          NSCalendar *calendar = [NSCalendar currentCalendar];
    
         // 2. 判断是否是今天
          if ([calendar isDateInToday:self]) {
              NSInteger interval = ABS((NSInteger)[self timeIntervalSinceNow]);
              if (interval < 60) {
                  return @"刚刚";
              }
              interval /= 60;
              if (interval < 60) {
                  return [NSString stringWithFormat:@"%zd 分钟前", interval];
              }
              return [NSString stringWithFormat:@"%zd 小时前", interval / 60];
          }
    
          // 3. 昨天
          NSMutableString *formatString = [NSMutableString stringWithString:@" HH:mm"];
          if ([calendar isDateInYesterday:self]) {
              [formatString insertString:@"昨天" atIndex:0];
          } else {
              [formatString insertString:@"MM-dd" atIndex:0];
        
              // 4. 是否当年
              NSDateComponents *components = [calendar components:NSCalendarUnitYear fromDate:self toDate:[NSDate date] options:0];
              if (components.year != 0) {
                  [formatString insertString:@"yyyy-" atIndex:0];
              }
          }
    
          // 5. 转换格式字符串
          NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
          fmt.locale = [NSLocale localeWithLocaleIdentifier:@"en"];
          fmt.dateFormat = formatString;
    
          return [fmt stringFromDate:self];
      }
      @end

    相关文章

      网友评论

        本文标题:完整的时间计算

        本文链接:https://www.haomeiwen.com/subject/adktmttx.html