Как получить время по Гринвичу?GMT время на iPhone
NSDate *c =[NSDate date];
дает системное время, а не GMT.
Как получить время по Гринвичу?GMT время на iPhone
NSDate *c =[NSDate date];
дает системное время, а не GMT.
- (NSDate*) convertToUTC:(NSDate*)sourceDate
{
NSTimeZone* currentTimeZone = [NSTimeZone localTimeZone];
NSTimeZone* utcTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];
NSInteger currentGMTOffset = [currentTimeZone secondsFromGMTForDate:sourceDate];
NSInteger gmtOffset = [utcTimeZone secondsFromGMTForDate:sourceDate];
NSTimeInterval gmtInterval = gmtOffset - currentGMTOffset;
NSDate* destinationDate = [[[NSDate alloc] initWithTimeInterval:gmtInterval sinceDate:sourceDate] autorelease];
return destinationDate;
}
NSDate сохраняет часовой пояс внутри - есть несколько функций, которые вы можете позвонить и передать в целевой часовой пояс, если вы хотите этого нужно просто строковое представление даты, см apple's documentation
Если это для целей отображения, которые вы хотите отобразить, используйте NSDateFormatter так:
NSDate *myDate = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
// Set date style:
[dateFormatter setDateStyle:NSDateFormatterShortStyle];
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];
NSString *GMTDateString = [dateFormatter stringFromDate: myDate];
Что делать, если время устройства на 2 часа позже. В этом случае этот расчет будет правильным ??? –
Как вы узнали, если устройство опоздает на 2 часа? Вы можете работать только с тем, что вам дано, и должны полагаться на правильное время системы для любых случаев. Это работа системы, а не ваше приложение. –
мы должны рассмотреть все сценарии, мой сценарий - я хочу получить время gmt независимо от времени устройства. , , есть ли другой способ достичь этого? –
Это более простой вариант ответа Рамин в
+ (NSDate *) GMTNow
{
NSDate *sourceDate = [NSDate date];
NSTimeZone* currentTimeZone = [NSTimeZone localTimeZone];
NSInteger currentGMTOffset = [currentTimeZone secondsFromGMT];
[sourceDate addTimeInterval:currentGMTOffset];
return sourceDate;
}
Это неправильно. Если я нахожусь в NY currentGMOffset будет -14400. Поскольку GMT позже NYC, я хочу добавить положительное значение в sourceDate. Также здесь не был изменен sourceDate. Вам нужно sourceDate = [sourceDate addTimeInterval: currentGMTOffset * -1]; который инвертирует знак смещения. – ransomweaver
Что делать, если время устройства на 2 часа позже. В этом случае это будет правильно? –
+ (NSDate*) convertToGMT:(NSDate*)sourceDate
{
NSTimeZone* currentTimeZone = [NSTimeZone localTimeZone];
NSTimeInterval gmtInterval = [currentTimeZone secondsFromGMTForDate:sourceDate];
NSDate* destinationDate = [[[NSDate alloc] initWithTimeInterval:gmtInterval sinceDate:sourceDate] autorelease];
return destinationDate;
}
Это действительно очень полезный метод. Я буду использовать его в своем текущем проекте. Однако на самом деле он не отвечает на вопрос. Вопрос: «Как мне получить время по Гринвичу?» –
При выполнении вычислений даты, эти категории могут быть полезным. Преобразуя дату в «нормализованный» (то есть, имея один и тот же месяц, день и год, но при +1200 UTC), если вы затем выполните последующие вычисления с использованием NSCalendar, который также установлен в UTC (+[NSCalendar normalizedCalendar]
) все будет работать.
@implementation NSDate (NormalizedAdditions)
+ (NSDate *)normalizedDateFromDateInCurrentCalendar:(NSDate *)inDate
{
NSDateComponents *todayComponents = [[NSCalendar currentCalendar] components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit)
fromDate:inDate];
[todayComponents setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
[todayComponents setHour:12];
return [[NSCalendar normalizedCalendar] dateFromComponents:todayComponents];
}
+ (NSDate *)normalizedDate
{
return [self normalizedDateFromDateInCurrentCalendar:[NSDate date]];
}
@end
@implementation NSCalendar (NormalizedAdditions)
+ (NSCalendar *)normalizedCalendar
{
static NSCalendar *gregorian = nil;
if (!gregorian) {
gregorian = [[NSCalendar alloc]
initWithCalendarIdentifier:NSGregorianCalendar];
[gregorian setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
}
return gregorian;
}
@end
-1 неправильно на очень многих уровнях –
-1 Это '' NSDate' для преобразования NSDate' вводит в заблуждение и основано на неправильном представлении о том, что представляет собой объект 'NSDate'. – albertamg
@Dave DeLong Я согласен с тем, что попытка конвертировать объекты NSDate между часовыми поясами - это бессмыслица, и я не понимаю, почему в этом другом ответе так много upvotes: http: //stackoverflow.com/questions/1081647/how-to-convert -time-to-the-timezone-of-the-iphone-device/1082179 # 1082179 – albertamg