2010-12-28 3 views
33

Мой местный часовой пояс и часовой пояс по умолчанию GMT +5, но когда я получаю дату и время от NSDate, он возвращает мне дату и время в GMT.NSDate не возвращает мой местный часовой пояс/часовой пояс по умолчанию устройства

Например, код и выход из моего кода во время тестирования на устройстве, как, [часовой пояс устройства Исламабаде 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 не дает местного Текущее время? Пожалуйста, помогите ...

+0

Это делается для упрощения кодирования , Как программист, вы всегда можете предположить, что значение «NSDate» находится в GMT. Таким образом вам нужно только беспокоиться о timeZone, когда вы используете 'NSDateFormatter', чтобы отображать время для пользователя. – Tobias

ответ

8

NSDate - это «сырая» дата. Вот почему он находится в GMT. Это зависит от кода для использования NSDateFormatter (как вы это сделали), чтобы вывести дату в значение, которое имеет смысл для пользователя.

В некоторых редких случаях вам может потребоваться отобразить NSDate, не используя часовой пояс пользователей (например, если вы хотите отображать время в Нью-Йорке независимо от того, где находится пользователь). Затем вы устанавливаете часовой пояс для форматирования даты на определенное значение (опять же, как вы это делали).

Обычно компьютеры хранят все даты в GMT, а затем настраивают, как они отображаются для пользователя. Если вы начнете пытаться изменить дату фактической записи, вы собираетесь испортить много фреймворков обработки дат, которые все предполагают, что ваш NSDate находится в GMT.

Как вы видели, когда вы читаете дату через NSDateFormatter, она преобразуется с введенного времени на основе часового пояса форматирования, который вы установили, а затем преобразуется в GMT. Так что, по-вашему, неправильно с тем, что он делает? Потому что он делает именно то, что должен - хранить даты в GMT и выводить строки на основе часового пояса.

70

Попробуйте это ...

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]; 

Это поможет ответить на текущий часовой пояс системы.

+6

Не работает с летним временем –

+0

Спасибо, что мне нужно –

+0

Это должно отлично работать для меня :). Спасибо. – Birju

22

Забудьте NSDateFormatter это слишком сложно, вместо того, чтобы попробовать эту магию:

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

Если вы хотите местное время и дату. Попробуйте этот код: -

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

+1. Это то, что я понял и обнаружил, что это уже было предложено. Он дает результат, похожий на: 2014-06-27 00:51:13 – asiby

1

Это хорошо работает для меня, чтобы получить дату в моем часовом поясе и отформатировать его так же, как я хочу это:

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]; 
4

Попробуйте

- (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; 
} 
2

Элизео Чавес-младший ответ переведен на 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); 
Смежные вопросы