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