NSDate не возвращает мой локальный часовой пояс/часовой пояс по умолчанию
Мой локальный и часовой пояс по умолчанию - GMT +5, но когда я получаю дату и время NSDate, он возвращает мне дату и время в GMT.
Например, код и вывод моего кода во время тестирования на устройстве, как [часовой пояс устройства Islamabad 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 не дает локальное текущее время? Пожалуйста, помогите...
Ответы
Ответ 1
Попробуйте это...
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];
Эта помощь реагирует на текущий системный часовой пояс.
Ответ 2
Забудьте NSDateFormatter, это слишком сложно, вместо этого попробуйте эту магию:
NSLog(@"date with local timezone is: %@",
[date descriptionWithLocale:[NSLocale systemLocale]]);
Ответ 3
NSDate - это "сырая" дата. Вот почему он находится в GMT. Это до кода для использования NSDateFormatter (как вы это сделали) для вывода даты в значение, которое имеет смысл для пользователя.
В некоторых редких случаях вам может потребоваться отобразить NSDate, не используя часовой пояс пользователей (например, если вы хотите отображать время в Нью-Йорк, независимо от того, где находится пользователь). Затем вы устанавливаете часовой пояс в форматировании даты на определенное значение (опять же, как вы это сделали).
Обычная практика для компьютеров хранить все даты в GMT, а затем настраивать, как они отображаются для пользователя. Если вы начнете пытаться изменить дату фактической записи, вы собираетесь испортить много фреймворков обработки дат, которые все предполагают, что ваш NSDate находится в GMT.
Как вы видели, когда вы читаете дату через NSDateFormatter, она преобразуется с введенного времени в соответствии с часовым поясом форматирования, который вы установили, а затем преобразуется в GMT. Так что, по-вашему, неправильно с тем, что он делает? Потому что он делает то, что должен - хранить даты в GMT и выводить строки на основе часового пояса.
Ответ 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;
}
Ответ 5
Если вам нужны локальные дата и время. Попробуйте этот код: -
NSString *localDate = [NSDateFormatter localizedStringFromDate:[NSDate date] dateStyle:NSDateFormatterMediumStyle timeStyle:NSDateFormatterMediumStyle];
Ответ 6
Элисео Чавес-младший отвечает на перевод в 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);
Ответ 7
Это хорошо работает для меня, чтобы получить дату в моем часовом поясе и отформатировать ее так же, как я хочу:
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];