Objective-C 설정 NSDate를 현재 UTC로


80

NSDate현재 UTC 날짜 / 시간 으로를 초기화하는 쉬운 방법이 있습니까?


1
시겠습니까 [NSDate date]일? UTC인지 확실하지 않습니다.
zneak 2010

2
NSDateUTC 로 설정된 것과 같은 것은 없으며 관련된 시간대가 없습니다.
Nick Forge

3
@MurraySagal 당신은 틀 렸습니다- NSDate순간의 순간을 나타냅니다 (이름 NSDate은 잘못된 이름입니다). "2001 년 1 월 1 일의 첫 순간"과 같은 시간을 설명 할 때 말하는 정확한 시간을 계산하기위한 시간대가 필요하지만, 일단 NSDate생성되면 그와 관련된 시간대가 없습니다.
Nick Forge

1
@NickForge NSDate는 특정 시간대의 특정 시간 인 "2001 년 1 월 1 일 GMT의 첫 번째 순간"으로 생성되며, 그 사실은 변경 불가능하며 날짜가 작동하는 이유에 매우 중요합니다. 다른 시간대에 있고이를 동시에 기록한 NSLog(@"since1970= %f", [[NSDate date] timeIntervalSince1970]);경우 결과는 동일합니다. 왜? 사용자가 어디에 있든 특정 시간대 (GMT)의 특정 시점을 기준으로하기 때문입니다. GMT와 관련이 있다는 사실은 일단 생성되면 사라지지 않습니다. 이 앵커가 없으면 날짜는 임의적입니다.
Murray Sagal 2013 년

2
당신은 여러 가지 방법으로 모두 맞아,하지만 닉은 "같은 것은 없다 말에 더 적합한 @MurraySagal NSDate당신이의 시간대를 설정할 수 없기 때문에, UTC로 설정"는 NSDate것을 말하는, 그리고 네 잘못 "시간대가 있습니다". 특정 시간대를 기준 으로 정의 된 것은 사실 이지만 시간대가 "있다"는 것은 시간대가의 속성임을 의미 NSDate하며 이는 사실이 아닙니다.
devios1 2013-08-06

답변:


148

[NSDate date];

다음과 같은 작업을 수행하는 범주를 만들 수 있습니다.

-(NSString *)getUTCFormateDate:(NSDate *)localDate
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
    [dateFormatter setTimeZone:timeZone];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSString *dateString = [dateFormatter stringFromDate:localDate];
    [dateFormatter release];
    return dateString;
}

2
NSTimeZone * timeZone = [NSTimeZone timeZoneWithName : @ "UTC"]; [dateFormatter setTimeZone : timeZone]; 못을 박았다 그 덕분에 그
브로디

1
이것이 프로덕션으로 이동하는 경우 실제로 지연 초기화되는 정적 dateFormatter를 만들 수 있습니다. dateFormatter 생성은 실제로 다소 비쌉니다.
jessecurry

3
문자열이 아닌 날짜 객체로 필요합니다.이 경우 어떻게해야합니까?
Maystro

1
날짜는 시간대와 무관하게 존재하며 시간대는 사람이 소비 할 출력을 생성하는 데만 사용됩니다.
jessecurry 2013 년

@jessecurry 사실이 아닙니다. NSDate 클래스 참조에서 : "이 메서드는 절대 참조 날짜 (GMT 2001 년 1 월 1 일의 첫 번째 순간)에 상대적인 시간 값을 반환합니다." GMT에 대한 명확하고 구체적인 참조에 유의하십시오.
Murray Sagal 2013 년

13

NSDate는 절대 참조 날짜 인 2001 년 1 월 1 일 00:00 GMT의 간격에 대한 참조입니다. 따라서 클래스 메서드 [NSDate date]는 해당 간격의 표현을 반환합니다. 해당 데이터를 UTC의 텍스트 형식으로 표시하려면 적절한 NSTimeZone (UTC)과 함께 NSDateFormatter를 사용하여 필요에 따라 렌더링하십시오.


3
나는이 답변에서 [NSDate now]가 [NSDate date]이어야한다고 생각합니다.
foldinglettuce

2

NSDate 객체는 특정 캘린더 시스템이나 시간대에 관계없이 단일 시점을 캡슐화합니다. Date 객체는 변경 불가능하며 절대 참조 날짜 ( 2001 년 1 월 1 일 00:00:00 UTC) 에 상대적인 불변 시간 간격을 나타냅니다 .

Swift 버전 :

extension NSDate {
    func getUTCFormateDate() -> String {
        let dateFormatter = NSDateFormatter()
        let timeZone = NSTimeZone(name: "UTC")
        dateFormatter.timeZone = timeZone
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        return dateFormatter.stringFromDate(self)
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.