iOS 카운트다운, date 일부 구덩이

5664 단어
요 며칠 동안 만든 물건은 달력류와 시간류, 각종 조작과 관련된다.코드가 엉망진창이야.
코드에서 훑는 시간은 기본적으로 그린 시간을 기준으로 합니다.

1 현재 시간대 가져오기


1.1 현재 시간 유형이 NSDate인
현재 시간대 가져오기 현재 시간대와 그린 시간대 판단 현재 시간대 가져오기
//        
+(NSDate *)getCurrentLocaleDate:(NSDate *)ADate {
    
    NSTimeZone *timeZone = [NSTimeZone systemTimeZone];
    NSTimeInterval interval = [timeZone secondsFromGMTForDate:ADate];
    NSDate *nowDate = [ADate dateByAddingTimeInterval:interval];
    return nowDate;
}

1.1 현재 시간 유형이 NSString인
NSDateFormatter 클래스가 제공됩니다. 이 format의 형식은 다음과 같습니다.
이것은 너무 중요해서 나는 이전에 대소문자를 구분하지 못한다고 생각했다.바보같이 오랫동안 고친 BUG 여러분 꼭 기억해 주세요. 낙서하면 안 돼요.낙서를 하면 전환에 문제가 생길 수 있다.
G:     ,  AD  
yy:    2 
yyyy:    
MM:  ,   1-12
MMM:  ,         ,  Jan
MMMM:  ,         ,  Janualy
dd:  ,2    , 02
d:  ,1-2   ,  2
EEE:      , Sun
EEEE:      , Sunday
aa:    ,AM/PM
H:  ,24   ,0-23
K: ,12   ,0-11
m:  ,1-2 
mm:  ,2 
s:  ,1-2 
ss:  ,2 
S:   
//        string
+(NSString *) getCurrentLocaleString:(NSDate *) Adate {
    NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];
    outputFormatter.locale = [NSLocale currentLocale];
    [outputFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    return [outputFormatter stringFromDate:Adate];
}

2. 서버에서 받은 시간 변환


나는 당시에 서버에서 시간을 얻은 후에 NSDateFormatter 포맷을 직접 사용했다. 그 결과 점프0.0 우리가 서버에서 얻은 시간은 모두 우리의 현재 시간대라고 느꼈다. 그러나 얻은 유형이 통하지 않기 때문에 우리는 서로 다른 유형으로 바꾸어 사용해야 한다. 위의 코드 사고방식은 모두 + 이다.
시스템은 그린 타임을 기준으로 하기 때문에 서버에서 얻은 시간 시스템은 그린 타임이라고 생각할 것이다.이때 당신이 전환할 때 시스템에 이것이 정확한 시간과 그린의 시간 차이가 0이라는 것을 알려야 한다.
+(NSString *) stringFormDate:(NSDate *) Adate{
    NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];
   [outputFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    [outputFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    return [outputFormatter stringFromDate:Adate];
}

3 Date의 요소 중 하나를 조정합니다.


프로젝트에서 처음에 수요가 하나 있는데 바로 내일과 모레의 이맘때에 대해 일을 하는 것이다. 나는 처음에 시간차를 더하는 것이라고 생각했다.마지막에 바보 같은 느낌.몇몇 자료를 찾아보니 시스템이 제공하는 달력 종류가 이런 조작을 실현할 수 있다는 것을 알았다.
바로 + 마이너스➖
+(NSDate *)addYear:(NSInteger)year Month:(NSInteger)month Day:(NSInteger)day date:(NSDate *)date{
//      
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
//date   ,   date     。 
    NSDateComponents *adcomps = [[NSDateComponents alloc] init];
    [adcomps setYear:year];
    [adcomps setMonth:month];
    [adcomps setDay:day];
    NSDate *date1 = [calendar dateByAddingComponents:adcomps toDate:date options:0];
    return date1;
    
}

연월일만 적었는데 NSDate Compoents에서 이렇게 많은 속성을 제공했어.하고 싶은 대로 해.
@property NSInteger era;
@property NSInteger year;
@property NSInteger month;
@property NSInteger day;
@property NSInteger hour;
@property NSInteger minute;
@property NSInteger second;
@property NSInteger nanosecond NS_AVAILABLE(10_7, 5_0);
@property NSInteger weekday;
@property NSInteger weekdayOrdinal;
@property NSInteger quarter NS_AVAILABLE(10_6, 4_0);
@property NSInteger weekOfMonth NS_AVAILABLE(10_7, 5_0);
@property NSInteger weekOfYear NS_AVAILABLE(10_7, 5_0);
@property NSInteger yearForWeekOfYear NS_AVAILABLE(10_7, 5_0);

4 Date 카운트다운 기능


프로젝트에서 카운트다운 기능을 실현해야 하는데 내가 가장 먼저 생각한 것은 모두 초로 바꾸어 연산하는 것이다(내가 어리석어 죽을 것 같다).사실 카운트다운 기능을 실현하는 것은 매우 간단하지만, 그중에는 아직도 매우 많은 구멍이 있다.간단하게 말씀드리지만 카운트다운 두 가지 방법을 실현해야 합니다.하나는 NSTimer, 하나는 GCD.

4.1 NSTimer

//               
- (void)resetTimerWithDate:(NSDate *)futureDate{
    
    NSTimeInterval futureTimeInterval = [futureDate timeIntervalSinceDate:[[NSDate date] dateByAddingTimeInterval:3600*8]];
    self.interval = futureTimeInterval;
    if (self.timer == nil) {
        self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeDecrease:) userInfo:nil repeats:YES];
//   timer    UI       NSRunloop    NSRunLoopCommonModes
        [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
    }
}

- (void)timeDecrease:(NSTimer *)timer{
    self.interval --;
    if (self.interval <= 0) {
        //      = 0              
        [timer invalidate];
        timer = nil;
        return;
    }
    int day = self.interval/(3600*24);
    int hour = (self.interval - day*(3600*24))/3600.0;
    int min = (self.interval - day*(3600*24) - hour*3600)/60;
    int sec = (self.interval - day*(3600*24) - hour*3600 - min*60);
    NSArray *arr = @[@(day),@(hour),@(min),@(sec)];
//                        
    
}


timer를 하위 라인에 넣으면 Runloop 모드를 설정하지 않아도 되지만, 수동으로runloop을 시작해야 합니다

4.2GCD

//  _timer        
{
 dispatch_source_t _timer;
}
//                      
  __block int timeout = timeInterval; //     
//        timer   GCD  
dispatch_queue_t queue = dispatch_queue_create("my queue", 0);
//  Timer
_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
//  dispatch_source_set_timer    timer  
dispatch_source_set_timer(_timer, dispatch_time(DISPATCH_TIME_NOW, 0), interval, 0);
//    
dispatch_source_set_event_handler(_timer, ^(){ 
if(timeout<=0)
{ //     ,  
                    dispatch_source_cancel(_timer);
                    _timer = nil;
                    dispatch_async(dispatch_get_main_queue(), ^{
//     
                    });
timeout--;

});
//dispatch_source   Suspended  ,  dispatch_resume     
dispatch_resume(_timer);

rounloop과 timer에 대해서 이쪽을 보실 수 있어요.https://www.mgenware.com/blog/?p=459

좋은 웹페이지 즐겨찾기