시간 계산 NSDate/NSCalendar/NSTimeZone 실전

5947 단어

개술


iOS에서 시간을 얻는 대상은 NSDate라고 하는데 보통 [NSDate date]을 사용하여 시간 대상을 편리하게 초기화할 수 있다. 그러나 이 초기화 시간 대상은 GMT시간, 그린wich Mean Time(GMT) 즉 그리니치 시간(세계'제로'시간대)을 생성한다. 즉, 현지 시간대(+8시대 베이징)라면 이 시간보다 8시간을 더 걸어야 한다.
1、그럼 현재 핸드폰에 뜨고 있는 시간을 얻으려면 어떻게 해야 하나요?NSTimeZone을 통해
+ (NSDate *)systemDate {
    NSDate *utcDate = [NSDate date];
    NSTimeZone *zone = [NSTimeZone systemTimeZone];
    NSTimeInterval timeInterval = [zone secondsFromGMTForDate: utcDate];
    NSDate *sysDate = [date dateByAddingTimeInterval: timeInterval];
    return sysDate;
}

2. 핸드폰의 현재 표시 시간의 문자열만 가져오면 NSDateFormatter를 통해 충분합니다
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
formatter.dateFormat = @"yyyy-MM-dd hh:mm:ss";
NSString *sysDate = [formatter stringFromDate: [NSDate date]];

3. 제2조의 결과에 따라 서버에 시간 파라미터를 @{@"startTime":startTime, @"endTime":endTime};의 형식으로 시작 시간과 끝 시간을 전달하면 이렇게 할 수 있다.
// num  
NSDate *startDate = [[NSDate date] dateByAddingTimeInterval:- 24 * 3600 * num];
NSDate *endDate = [[NSDate date] dateByAddingTimeInterval: 1];
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
formatter.dateFormat = @"yyyy-MM-dd hh:mm:ss";
NSString *startString = [formatter stringFromDate: startDate];
NSString *endString = [formatter stringFromDate: endDate];
NSArray *arr = @[startString, endString];

4、하지만 서버에서 UTC를 받은 시간 문자열 그룹이 모두 로컬 시간으로 바뀌려면 NSTimeZone이 필요합니다.
+ (NSString *)getLocalDateFromUTCDate:(NSString *)utcStr formatter:(NSDateFormatter *)dateFormatter {
    // NSDateFormatter 
    dateFormatter.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
    NSDate *utcDate = [dateFormatter dateFromString: utcStr];
    dateFormatter.timeZone = [NSTimeZone localTimeZone];
    NSString *dateString = [dateFormatter stringFromDate:utcDate];
    return dateString;
}

5、반대로 로컬 시간 문자열을 UTC 시간 문자열로 바꾸려면 (By the way) 서버에 업로드하는 시간은 UTC 시간이다. 그러면 핸드폰 시스템에서 어떤 시간대를 선택하든 업로드하는 시간은 시간대이다.
+ (NSString *)getUTCStrFormateLocalStr:(NSString *)localStr formatter:(NSDateFormatter *)dateFormatter {
    // localStr  
    dateFormatter.timeZone = [NSTimeZone systemTimeZone];
    NSDate *localDate = [dateFormatter dateFromString: localStr];
    dateFormatter.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
    NSString *dateString = [dateFormatter stringFromDate: localDate];
    return dateString;
}

6、현재 핸드폰 시스템의 시간num일 이전 시간이 필요할 때
+ (NSDate *)passedDateWithCount:(NSInteger)num
{
    NSDate *date = [[NSDate systemDate] dateByAddingTimeInterval: - 24 * 3600 * num];
    return date;
}

7、이달의 첫날과 마지막 날을 얻는다
+ (NSArray *)getMonthFirstAndLastDay:(NSDate *)date
{
    double interval = 0;
    NSDate *firstDate = nil;
    NSDate *lastDate = nil;
    NSCalendar *calendar = [NSCalendar currentCalendar];
    
    BOOL OK = [calendar rangeOfUnit:NSCalendarUnitMonth startDate:& firstDate interval:&interval forDate:date];
    
    if (OK) {
        lastDate = [firstDate dateByAddingTimeInterval: interval];
    }else {
        return @[@"",@""];
    }
    return @[firstDate, lastDate];
}

8. 현재 시간이 얼마나 지났는지, 모멘트, 상태 아래의 시간 알림 문자를 보내는 것과 유사하게 자주 사용하는데 이 방법의 호출자 대상은 UTC의 NSDate 대상이다.
- (NSString *)coverDateBeforeNow:(NSDate *)pastDate
{
    if (self == nil) {
        return @" ";
    }
    NSTimeZone *zone = [NSTimeZone systemTimeZone];
    NSTimeInterval time = [zone secondsFromGMTForDate: pastDate];
    NSDate *sysDate = [pastDate dateByAddingTimeInterval: time];
    NSTimeInterval timeInterval = [sysDate timeIntervalSinceNow];
    timeInterval = - timeInterval;
    long temp = 0;
    NSString *result = nil;
    if (timeInterval < 60) {
        result = [NSString stringWithFormat:@" "];
    }
    else if((temp = timeInterval/60) <60){
        result = [NSString stringWithFormat:@"%ld ",temp];
    }
    
    else if((temp = temp/60) <24){
        result = [NSString stringWithFormat:@"%ld ",temp];
    }
    
    else if((temp = temp/24) <30){
        result = [NSString stringWithFormat:@"%ld ",temp];
    }
    
    else if((temp = temp/30) <12){
        result = [NSString stringWithFormat:@"%ld ",temp];
    }
    else{
        temp = temp/12;
        result = [NSString stringWithFormat:@"%ld ",temp];
    }
    
    return  result;
}

9. 주어진 NSDate에 따라 이 날짜가 있는 달의 첫날과 마지막 날의 Date를 계산한다
+ (NSArray *)getMonthFirstAndLastDay:(NSDate *)date
{
    double interval = 0;
    NSDate *firstDate = nil;
    NSDate *lastDate = nil;
    NSCalendar *calendar = [NSCalendar currentCalendar];
    
    BOOL OK = [calendar rangeOfUnit:NSCalendarUnitMonth startDate:& firstDate interval:&interval forDate:date];
    
    if (OK) {
        lastDate = [firstDate dateByAddingTimeInterval:interval];
    }else {
        return @[@"",@""];
    }
    return @[firstDate, lastDate];
}

10、주어진 NSDate에 따라 이 날짜가 무슨 요일인지 계산한다
+ (NSString*)weekdayStringFromDate:(NSDate*)inputDate
{
    
    NSArray *weekdays = [NSArray arrayWithObjects: [NSNull null], @"0", @"1", @"2", @"3", @"4", @"5", @"6", nil];
    
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    
    NSTimeZone *timeZone = [[NSTimeZone alloc] initWithName:@"Asia/Shanghai"];
    
    [calendar setTimeZone: timeZone];
    
    NSCalendarUnit calendarUnit = NSCalendarUnitWeekday;
    
    NSDateComponents *theComponents = [calendar components:calendarUnit fromDate:inputDate];
    
    return [weekdays objectAtIndex:theComponents.weekday];
    
}

좋은 웹페이지 즐겨찾기