iOS 카운트다운, date 일부 구덩이
코드에서 훑는 시간은 기본적으로 그린 시간을 기준으로 합니다.
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.