Подтвердить что ты не робот

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 не дает локальное текущее время? Пожалуйста, помогите...

4b9b3361

Ответ 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];