Установлення цілі-C NSDate до поточного UTC


80

Чи є простий спосіб ініціювати NSDateпоточну дату / час UTC?


1
Працювало б [NSDate date]? Я не впевнений, це UTC.
zneak

2
Не існує такого поняття, як NSDateвстановлення UTC, воно не має часового поясу, пов’язаного з ним.
Нік Фордж

3
@MurraySagal Ви помилкові - NSDateпредставляє момент у часі (ім'я NSDateє дещо неправильним). Описуючи такий час, як "перша мить 1 січня 2001 року", вам потрібен часовий пояс, щоб визначити, про який саме момент часу ви говорите, але як тільки час NSDateстворений, часовий пояс з ним не пов'язаний.
Нік Фордж

1
@NickForge NSDate створюється як "перша мить 1 січня 2001 р., GMT", конкретний час у певному часовому поясі, і цей факт є незмінним і критично важливим для того, чому дати працюють так, як вони працюють. Якщо ми знаходимося в різних часових поясах, і ми реєстрували це в один і той же момент, NSLog(@"since1970= %f", [[NSDate date] timeIntervalSince1970]);результат однаковий. Чому? Оскільки це відносно конкретного моменту часу у певному часовому поясі (GMT), незалежно від того, де знаходиться користувач. Той факт, що він відносно GMT, не зникає після його створення. Без цього якоря дати були б довільними.
Мюррей Сагал

2
@MurraySagal Ви обидва маєте рацію по-різному, але Нік має рацію, сказавши "Не існує такого поняття, як NSDateвстановлення UTC", тому що ви не можете встановити часовий пояс ан NSDate, і ви неправильно говорите, що він "має часовий пояс". Це правда, що він визначений щодо конкретного часового поясу, але якщо він має "часовий пояс", це означає, що часовий пояс є властивістю NSDate, а це не відповідає дійсності.
devios1

Відповіді:


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
Мені це потрібно як об'єкт дати, а не як рядок, що я можу зробити в цьому випадку?
Майстро

1
Дати існують незалежно від часових поясів, часовий пояс використовується лише для виробництва продукції для споживання людиною.
jessecurry

@jessecurry Не зовсім так. З посилання на клас NSDate: "Цей метод повертає значення часу відносно абсолютної контрольної дати - першої миті 1 січня 2001 р., GMT". Зверніть увагу на чітке та конкретне посилання на GMT.
Мюррей Сагал

13

NSDate - це посилання на інтервал від абсолютної контрольної дати, 1 січня 2001 р., 00:00 за Грінвичем. Тож метод класу [дата NSDate] поверне подання цього інтервалу. Щоб представити ці дані у текстовому форматі в UTC, просто використовуйте NSDateFormatter із відповідним NSTimeZone (UTC) для візуалізації за необхідності.


3
Я вважаю, що [NSDate зараз] має бути [дата NSDate] у цій відповіді.
складаний салат

2

Об'єкти NSDate інкапсулюють один момент часу, незалежно від будь-якої конкретної календарної системи чи часового поясу. Об'єкти дати незмінні, представляючи інваріантний інтервал часу відносно абсолютної контрольної дати (00:00:00 UTC 1 січня 2001 р.).

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)
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.