Если это поможет, подумайте о температуре. Они могут быть выражены в градусах Фаренгейта, Цельсия или Кельвина. Но выражаемая информация (среднее движение молекул) не имеет внутренней единицы, хотя она имеет значение для нас только тогда, когда выражается в некоторых единицах.
программное обеспечение появилось
7
@DaveDeLong NSDate имеет часовой пояс. Из справочника по классу NSDate: «Этот метод возвращает значение времени относительно абсолютной ссылочной даты - первого момента 1 января 2001 г. по Гринвичу». Обратите внимание на четкую и конкретную ссылку на GMT.
Мюррей Сагал,
3
Я не согласен. NSDate НЕ имеет часового пояса. Чтобы указать часовой пояс для NSDate, вы используете объект NSCalendar или объект NSDateFormatter. Если вы создаете NSDate из строки, в которой не указан часовой пояс, тогда NSDate будет предполагать, что строка находится в GMT.
Rickster 03
1
@MurraySagal Тот факт, что один конкретный метод возвращает значение времени относительно даты в определенном часовом поясе, не означает, что NSDate моделирует дату как относящуюся к часовому поясу.
eremzeit 07
Ответы:
139
NSTimeInterval seconds; // assume this existsNSDate* ts_utc = [NSDate dateWithTimeIntervalSince1970:seconds];
NSDateFormatter* df_utc = [[[NSDateFormatter alloc] init] autorelease];
[df_utc setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
[df_utc setDateFormat:@"yyyy.MM.dd G 'at' HH:mm:ss zzz"];
NSDateFormatter* df_local = [[[NSDateFormatter alloc] init] autorelease];
[df_local setTimeZone:[NSTimeZone timeZoneWithName:@"EST"]];
[df_local setDateFormat:@"yyyy.MM.dd G 'at' HH:mm:ss zzz"];
NSString* ts_utc_string = [df_utc stringFromDate:ts_utc];
NSString* ts_local_string = [df_local stringFromDate:ts_utc];
// you can also use NSDateFormatter dateFromString to go the opposite way
вероятно, стоит упомянуть, что вы также можете использовать форматер для чтения дат из строк
slf
34
@DaveDeLong, все хорошо, если вы просто отображаете дату в виде строки. Но есть вполне веские причины для преобразования часового пояса в дату. Например, если вы хотите установить дату по умолчанию в UIDatePicker с помощью setDate :. Даты, возвращаемые веб-службами, часто являются временем в формате UTC, но представляют собой событие в местном часовом поясе пользователя, например, телетрансляцию. При передаче непреобразованной даты в средстве выбора будет отображаться неправильное время.
Кристофер Пикслей,
5
@GlennMaynard Я не согласен. Суть этого ответа в том, что преобразование в NSDateобъект не требуется, и это правильно. Преобразование в часовой пояс происходит при форматировании даты, а не при ее создании, потому что в датах нет часовых поясов.
Дэйв Делонг,
1
@GlennMaynard ... за исключением того, что NSCalendarDateон устарел.
ИЗМЕНИТЬ Когда я писал это, я не знал, что мне следует использовать форматирование даты, что, вероятно, является лучшим подходом, поэтому также ознакомьтесь slfс ответом.
У меня есть веб-сервис, который возвращает даты в формате UTC. Я использую, toLocalTimeчтобы преобразовать его в местное время и toGlobalTimeпри необходимости преобразовать обратно.
Не делай этого. NSDates всегда в формате UTC. Это просто сбивает с толку.
JeremyP
13
Это может быть очень полезно для упомянутого выше случая «веб-службы». Допустим, у вас есть сервер, который хранит события в формате UTC, и клиент хочет запросить все события, которые произошли сегодня. Для этого клиенту необходимо получить текущую дату (UTC / GMT), а затем сдвинуть ее на смещение часового пояса перед отправкой на сервер.
Тейлор Лафринер 01
@JeremyP Было бы точнее сказать, что NSDates всегда в GMT. Из справочника по классу NSDate: «Этот метод возвращает значение времени относительно абсолютной ссылочной даты - первого момента 1 января 2001 г. по Гринвичу». Обратите внимание на четкую и конкретную ссылку на GMT. Между GMT и UTC есть техническая разница, но это в основном не имеет отношения к решениям, которые ищут большинство людей.
Этот ответ кажется более портативным. В приведенном ниже ответе предполагается, что часовой пояс фиксируется во время выполнения, тогда как ответ выше получает часовой пояс с платформы.
bleeckerj 07
10
Очень полезно. Одно дополнение, secondsFromGMTForDateследует использовать, если вы хотите учесть переход на летнее время. См. Apple Docs
Сергей Маркелов
1
Это не учитывает изменения летнего времени.
lkraider
36
Swift 3+ : UTC в локальный и локальный в UTC
extensionDate{
// Convert UTC (or GMT) to local timefunctoLocalTime() -> Date {
let timezone = TimeZone.current
let seconds = TimeInterval(timezone.secondsFromGMT(for: self))
returnDate(timeInterval: seconds, since: self)
}
// Convert local time to UTC (or GMT)functoGlobalTime() -> Date {
let timezone = TimeZone.current
let seconds = -TimeInterval(timezone.secondsFromGMT(for: self))
returnDate(timeInterval: seconds, since: self)
}
}
Отличный ответ! Это захватит текущую дату. Адаптация этого, которая использует строку даты, должна быть заменена [NSDate date]на [NSDate dateWithNaturalLanguageString:sMyDateString].
//This is basic way to get time of any GMT time.
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"hh:mm a"]; // 09:30 AM
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:1]]; // For GMT+1
NSString *time = [formatter stringFromDate:[NSDate date]]; // Current time
Поскольку казалось, что никто не использует NSDateComponents, я подумал, что вставлю один ... В этой версии не NSDateFormatterиспользуется, следовательно, нет синтаксического анализа строк и NSDateне используется для представления времени за пределами GMT (UTC). Оригинал NSDateнаходится в переменной i_date.
NSCalendar *anotherCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:i_anotherCalendar];
anotherCalendar.timeZone = [NSTimeZone timeZoneWithName:i_anotherTimeZone];
NSDateComponents *anotherComponents = [anotherCalendar components:(NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitNanosecond) fromDate:i_date];
// The following is just for checking
anotherComponents.calendar = anotherCalendar; // anotherComponents.date is nil without thisNSDate *anotherDate = anotherComponents.date;
i_anotherCalendarможет быть NSCalendarIdentifierGregorianили любой другой календарь. NSStringДопускается i_anotherTimeZoneмогут быть приобретены с [NSTimeZone knownTimeZoneNames], но anotherCalendar.timeZoneможет быть [NSTimeZone defaultTimeZone]или [NSTimeZone localTimeZone]или [NSTimeZone systemTimeZone]вообще.
На самом деле он anotherComponentsпоказывает время в новом часовом поясе. Вы заметите , что это anotherDateравно i_date, потому что время указано в GMT (UTC).
Ответы:
NSTimeInterval seconds; // assume this exists NSDate* ts_utc = [NSDate dateWithTimeIntervalSince1970:seconds]; NSDateFormatter* df_utc = [[[NSDateFormatter alloc] init] autorelease]; [df_utc setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]]; [df_utc setDateFormat:@"yyyy.MM.dd G 'at' HH:mm:ss zzz"]; NSDateFormatter* df_local = [[[NSDateFormatter alloc] init] autorelease]; [df_local setTimeZone:[NSTimeZone timeZoneWithName:@"EST"]]; [df_local setDateFormat:@"yyyy.MM.dd G 'at' HH:mm:ss zzz"]; NSString* ts_utc_string = [df_utc stringFromDate:ts_utc]; NSString* ts_local_string = [df_local stringFromDate:ts_utc]; // you can also use NSDateFormatter dateFromString to go the opposite way
Таблица параметров строки форматирования:
https://waracle.com/iphone-nsdateformatter-date-formatting-table/
Если производительность является приоритетом, вы можете рассмотреть возможность использования
strftime
https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/strftime.3.htmlисточник
NSDate
объект не требуется, и это правильно. Преобразование в часовой пояс происходит при форматировании даты, а не при ее создании, потому что в датах нет часовых поясов.NSCalendarDate
он устарел.ИЗМЕНИТЬ Когда я писал это, я не знал, что мне следует использовать форматирование даты, что, вероятно, является лучшим подходом, поэтому также ознакомьтесь
slf
с ответом.У меня есть веб-сервис, который возвращает даты в формате UTC. Я использую,
toLocalTime
чтобы преобразовать его в местное время иtoGlobalTime
при необходимости преобразовать обратно.Вот откуда я получил свой ответ:
https://agilewarrior.wordpress.com/2012/06/27/how-to-convert-nsdate-to-different-time-zones/
@implementation NSDate(Utils) -(NSDate *) toLocalTime { NSTimeZone *tz = [NSTimeZone defaultTimeZone]; NSInteger seconds = [tz secondsFromGMTForDate: self]; return [NSDate dateWithTimeInterval: seconds sinceDate: self]; } -(NSDate *) toGlobalTime { NSTimeZone *tz = [NSTimeZone defaultTimeZone]; NSInteger seconds = -[tz secondsFromGMTForDate: self]; return [NSDate dateWithTimeInterval: seconds sinceDate: self]; } @end
источник
Самый простой способ, который я нашел, таков:
NSDate *someDateInUTC = …; NSTimeInterval timeZoneSeconds = [[NSTimeZone localTimeZone] secondsFromGMT]; NSDate *dateInLocalTimezone = [someDateInUTC dateByAddingTimeInterval:timeZoneSeconds];
источник
secondsFromGMTForDate
следует использовать, если вы хотите учесть переход на летнее время. См. Apple DocsSwift 3+ : UTC в локальный и локальный в UTC
extension Date { // Convert UTC (or GMT) to local time func toLocalTime() -> Date { let timezone = TimeZone.current let seconds = TimeInterval(timezone.secondsFromGMT(for: self)) return Date(timeInterval: seconds, since: self) } // Convert local time to UTC (or GMT) func toGlobalTime() -> Date { let timezone = TimeZone.current let seconds = -TimeInterval(timezone.secondsFromGMT(for: self)) return Date(timeInterval: seconds, since: self) } }
источник
Если вам нужна местная дата и время. Попробуйте этот код: -
NSString *localDate = [NSDateFormatter localizedStringFromDate:[NSDate date] dateStyle:NSDateFormatterMediumStyle timeStyle:NSDateFormatterMediumStyle];
источник
[NSDate date]
на[NSDate dateWithNaturalLanguageString:sMyDateString]
.Преобразуйте дату UTC в местную дату
-(NSString *)getLocalDateTimeFromUTC:(NSString *)strDate { NSDateFormatter *dtFormat = [[NSDateFormatter alloc] init]; [dtFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; [dtFormat setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; NSDate *aDate = [dtFormat dateFromString:strDate]; [dtFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; [dtFormat setTimeZone:[NSTimeZone systemTimeZone]]; return [dtFormat stringFromDate:aDate]; }
Использовать как это
NSString *localDate = [self getLocalDateTimeFromUTC:@"yourUTCDate"];
источник
Здесь input представляет собой строку currentUTCTime (в формате 30.08.2012 11:11) преобразует время ввода в GMT в системное время зоны
//UTC time NSDateFormatter *utcDateFormatter = [[[NSDateFormatter alloc] init] autorelease]; [utcDateFormatter setDateFormat:@"MM/dd/yyyy HH:mm"]; [utcDateFormatter setTimeZone :[NSTimeZone timeZoneForSecondsFromGMT: 0]]; // utc format NSDate *dateInUTC = [utcDateFormatter dateFromString: currentUTCTime]; // offset second NSInteger seconds = [[NSTimeZone systemTimeZone] secondsFromGMT]; // format it and send NSDateFormatter *localDateFormatter = [[[NSDateFormatter alloc] init] autorelease]; [localDateFormatter setDateFormat:@"MM/dd/yyyy HH:mm"]; [localDateFormatter setTimeZone :[NSTimeZone timeZoneForSecondsFromGMT: seconds]]; // formatted string NSString *localDate = [localDateFormatter stringFromDate: dateInUTC]; return localDate;
источник
//This is basic way to get time of any GMT time. NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"hh:mm a"]; // 09:30 AM [formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:1]]; // For GMT+1 NSString *time = [formatter stringFromDate:[NSDate date]]; // Current time
источник
Преобразуйте дату из календаря UTC в дату с соответствующим локальным NSTimeZone .
источник
Я пишу этот метод для преобразования даты и времени в нашу LocalTimeZone
-Здесь (NSString *) параметр TimeZone - часовой пояс сервера
-(NSString *)convertTimeIntoLocal:(NSString *)defaultTime :(NSString *)TimeZone { NSDateFormatter *serverFormatter = [[NSDateFormatter alloc] init]; [serverFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:TimeZone]]; [serverFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSDate *theDate = [serverFormatter dateFromString:defaultTime]; NSDateFormatter *userFormatter = [[NSDateFormatter alloc] init]; [userFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; [userFormatter setTimeZone:[NSTimeZone localTimeZone]]; NSString *dateConverted = [userFormatter stringFromDate:theDate]; return dateConverted; }
источник
Поскольку казалось, что никто не использует
NSDateComponents
, я подумал, что вставлю один ... В этой версии неNSDateFormatter
используется, следовательно, нет синтаксического анализа строк иNSDate
не используется для представления времени за пределами GMT (UTC). ОригиналNSDate
находится в переменнойi_date
.NSCalendar *anotherCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:i_anotherCalendar]; anotherCalendar.timeZone = [NSTimeZone timeZoneWithName:i_anotherTimeZone]; NSDateComponents *anotherComponents = [anotherCalendar components:(NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitNanosecond) fromDate:i_date]; // The following is just for checking anotherComponents.calendar = anotherCalendar; // anotherComponents.date is nil without this NSDate *anotherDate = anotherComponents.date;
i_anotherCalendar
может бытьNSCalendarIdentifierGregorian
или любой другой календарь.NSString
Допускаетсяi_anotherTimeZone
могут быть приобретены с[NSTimeZone knownTimeZoneNames]
, ноanotherCalendar.timeZone
может быть[NSTimeZone defaultTimeZone]
или[NSTimeZone localTimeZone]
или[NSTimeZone systemTimeZone]
вообще.На самом деле он
anotherComponents
показывает время в новом часовом поясе. Вы заметите , что этоanotherDate
равноi_date
, потому что время указано в GMT (UTC).источник
Вы можете попробовать это:
NSDate *currentDate = [[NSDate alloc] init]; NSTimeZone *timeZone = [NSTimeZone defaultTimeZone]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateStyle:NSDateFormatterLongStyle]; [dateFormatter setTimeStyle:NSDateFormatterLongStyle]; [dateFormatter setTimeZone:timeZone]; [dateFormatter setDateFormat:@"ZZZ"]; NSString *localDateString = [dateFormatter stringFromDate:currentDate]; NSMutableString *mu = [NSMutableString stringWithString:localDateString]; [mu insertString:@":" atIndex:3]; NSString *strTimeZone = [NSString stringWithFormat:@"(GMT%@)%@",mu,timeZone.name]; NSLog(@"%@",strTimeZone);
источник
Преобразование времени UTC в текущий часовой пояс.
функция вызова
NSLocale *locale = [NSLocale autoupdatingCurrentLocale]; NSString *myLanguageCode = [locale objectForKey: NSLocaleLanguageCode]; NSString *myCountryCode = [locale objectForKey: NSLocaleCountryCode]; NSString *rfc3339DateTimeString = @"2015-02-15 00:00:00"]; NSDate *myDateTime = (NSDate*)[_myCommonFunctions _ConvertUTCTimeToLocalTimeWithFormat:rfc3339DateTimeString LanguageCode:myLanguageCode CountryCode:myCountryCode Formated:NO];
Функция
-NSObject*)_ConvertUTCTimeToLocalTimeWithFormat:rfc3339DateTimeString LanguageCode:(NSString *)lgc CountryCode:(NSString *)ctc Formated:(BOOL) formated { NSDateFormatter *sUserVisibleDateFormatter = nil; NSDateFormatter *sRFC3339DateFormatter = nil; NSTimeZone *timeZone = [NSTimeZone defaultTimeZone]; if (sRFC3339DateFormatter == nil) { sRFC3339DateFormatter = [[NSDateFormatter alloc] init]; NSLocale *myPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:[NSString stringWithFormat:@"%@", timeZone]]; [sRFC3339DateFormatter setLocale:myPOSIXLocale]; [sRFC3339DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"]; [sRFC3339DateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; } // Convert the RFC 3339 date time string to an NSDate. NSDate *date = [sRFC3339DateFormatter dateFromString:rfc3339DateTimeString]; if (formated == YES) { NSString *userVisibleDateTimeString; if (date != nil) { if (sUserVisibleDateFormatter == nil) { sUserVisibleDateFormatter = [[NSDateFormatter alloc] init]; [sUserVisibleDateFormatter setDateStyle:NSDateFormatterMediumStyle]; [sUserVisibleDateFormatter setTimeStyle:NSDateFormatterShortStyle]; } // Convert the date object to a user-visible date string. userVisibleDateTimeString = [sUserVisibleDateFormatter stringFromDate:date]; return (NSObject*)userVisibleDateTimeString; } } return (NSObject*)date; }
источник