NSDate没有返回设备的本地时区/默认时区

我的本地和默认时区是格林尼治标准时间+5,但是当我通过NSDate得到date和时间时,它会返回我GMT时间和date。

例如,我的代码在设备上testing时的代码和输出是[设备时区伊斯兰堡GMT +5]

NSTimeZone *lo = [NSTimeZone localTimeZone]; NSLog(@" - current local timezone is %@",lo); // GMT +5 2010-12-28 20:56:11.785 Done[484:307] - current local timezone is Local Time Zone (Asia/Karachi (GMT+05:00) offset 18000) NSTimeZone *df = [NSTimeZone defaultTimeZone]; NSLog(@" - current default timezone is %@",df); // GMT +5 2010-12-28 20:56:11.790 Done[484:307] - current default timezone is Asia/Karachi (GMT+05:00) offset 18000 

  NSDate *cDate = [NSDate date]; NSLog(@"current date by NSDate %@",cDate); //but NSDate show GMT 2010-12-28 20:56:11.794 Done[484:307] current date by NSDate 2010-12-28 15:56:11 GMT NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm"; //// NSTimeZone *gmt = [NSTimeZone ] NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT+05:00"]; [dateFormatter setTimeZone:gmt]; NSString *timeStamp = [dateFormatter stringFromDate:[NSDate date]]; NSLog(@" date string object %@" ,timeStamp); // string From Date is GMT +5 2010-12-28 20:56:11.802 Done[484:307] date string object 2010-12-28T20:56 NSDate *datef = [dateFormatter dateFromString:timeStamp]; NSLog(@" date object %@" ,datef); // the date form above string gives again GMT 2010-12-28 20:56:11.809 Done[484:307] **date object 2010-12-28 15:56:00 GMT** 

为什么NSDate不给当地时间? 请帮忙…

尝试这个…

 NSDate* sourceDate = [NSDate date]; NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone]; NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate]; NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate]; NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset; NSDate* destinationDate = [[[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate] autorelease]; 

这有助于响应当前的系统时区。

忘记NSDateFormatter它太复杂了,而是尝试这个神奇的:

 NSLog(@"date with local timezone is: %@", [date descriptionWithLocale:[NSLocale systemLocale]]); 

NSDate是一个“原始”date。 这就是为什么在GMT。 这取决于使用NSDateFormatter的代码(如你所做的)将date输出到对用户有意义的值。

在极less数情况下,您可能需要显示不使用用户时区的NSDate(例如,如果您想在纽约时间显示时间,无论用户身在何处)。 然后,将date格式化程序中的时区设置为特定值(再次像您所做的那样)。

计算机通常会将所有date存储在GMT中,然后调整它们如何显示给用户。 如果您开始尝试更改date实际存储的方式,那么您将会搞乱大量date处理框架,这些框架都假设您的NSDate是在GMT时间。

正如你所看到的,当你通过一个NSDateFormatter读取date时,它将根据你设置的格式化程序的时区转换为input时间,然后转换为GMT。 那么你认为它在做什么是错的? 因为它正在做它应该做的事 – 在GMT中存储date,并根据时区输出string。

如果你想要本地的date和时间。 试试这个代码:

 NSString *localDate = [NSDateFormatter localizedStringFromDate:[NSDate date] dateStyle:NSDateFormatterMediumStyle timeStyle:NSDateFormatterMediumStyle]; 

尝试这个

 - (NSDate *) GetLocalDate { NSDateComponents *dayComponent = [[NSDateComponents alloc] init]; NSCalendar *theCalendar = [NSCalendar currentCalendar]; theCalendar.timeZone = [NSTimeZone timeZoneWithName:@"GMT"]; dayComponent = [[NSCalendar currentCalendar] components:NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]]; NSDate *localDate = [theCalendar dateFromComponents:dayComponent]; return localDate; } 

Eliseo Chavez Jr回答翻译成Swift

 let sourceDate = NSDate(); let sourceTimeZone = NSTimeZone(abbreviation: "GMT")!; let destinationTimeZone = NSTimeZone.systemTimeZone(); let sourceGMTOffset: NSInteger = sourceTimeZone.secondsFromGMTForDate(sourceDate); let destinationGMTOffset:NSInteger = destinationTimeZone.secondsFromGMTForDate(sourceDate); let interval: NSTimeInterval = Double (destinationGMTOffset - sourceGMTOffset); let destinationDate = NSDate(timeInterval: interval, sinceDate: sourceDate); 

这对我来说很适合在我的时区中获取date,并将其格式化为我想要的格式:

 NSDate* gmtDate = [NSDate date]; NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setTimeZone:[NSTimeZone timeZoneWithName:@"America/Los_Angeles"]]; [formatter setDateFormat:@"yyyy/MM/dd HH:mm:ss"]; NSString *dateString = [formatter stringFromDate:gmtDate];