iPhone - странная проблема с NSDate, NSString и часовыми поясами - PullRequest
0 голосов
/ 29 июня 2011

Я искал и не нашел точного вопроса, подобного моему, поэтому здесь ничего не говорится:

У меня есть строка NSString, содержащая ключ, который я извлекаю из XML-канала.Ключом является время в 24-часовом формате (например, 13:30 или 15:00). Я хотел бы преобразовать строку NSString в NSDate и преобразовать ее в соответствующий часовой пояс на основе установленного часового пояса устройства.Ключ Unicode HH: mm (24:00), поэтому мне любопытно, почему это не работает так, как должно.

Я уже получил базовую схему, которая должна работать, но, увы, нет.2-й NSLog (Got NS Date) возвращает ноль, а окончательный журнал возвращает странное число (1969-12--2147483629 -596: -31: -23 +0000, если быть точным.) Что я здесь делаю неправильно?

Заранее спасибо,

    NSString *dateString = [dict objectForKey:@"24hrdate"];
    NSLog(@"NSString Date: %@", dateString);

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];    
    [formatter setDateFormat:@"HH:mm"];
    NSDate *sourceDate = [formatter dateFromString:dateString]; 
    NSLog(@"Got NS Date: %@", sourceDate);

    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];
    NSLog(@"Final Date: %@", destinationDate);

Ответы [ 3 ]

0 голосов
/ 29 июня 2011

NSDate используется для представления даты и времени. В то время как вы можете представлять только дату, придерживаясь полуночи, вы не можете действительно представлять только время суток с ней. Вы можете подделать это на Mac (по умолчанию это приемлемый день), но на iOS вы получите крайне неточные времена. (По крайней мере, вы делаете это на определенных версиях. Возможно, это было исправлено.)

Здесь есть два подхода:

  1. Вы можете построить NSDateComponents из своего времени суток и, используя dateByAddingComponents, добавить это к полуночи даты, когда вы хотите, чтобы время появилось. Это не вернет время, которое вы ожидаете в день, когда начинается или заканчивается переход на летнее время.

  2. Вы можете построить строку даты / времени, используя желаемую дату (NSDate) и время (вероятно, как NSString).

- (NSDate *)timeInHours: (NSInteger)hours
                minutes: (NSInteger)minutes
                seconds: (NSInteger)seconds
                 onDate: (NSDate *)inDate;
{
    id timeStr = [[NSMutableString alloc] initWithFormat: @"%02d:%02d:%02d", hours, minutes, seconds];
    id dateStr = [dateWithoutTimeFormatter stringFromDate: inDate];
    id dateTimeStr = [[NSString alloc] initWithFormat: @"%@ %@", dateStr, timeStr];
    [timeStr release];
    id dateTime = [dateWithTimeFormatter dateFromString: dateTimeStr];
    [dateTimeStr release];
    return dateTime;
}

Если вы действительно хотите просто время дня, просто держите его как строку.

0 голосов
/ 30 июня 2011

Просто хотел сообщить, что мне удалось достичь того, что я изначально намеревался сделать без каких-либо проблем.По сути, мне пришлось преобразовать строку в NSDate, запустить этот NSDate через NSDateFormatter (установить исходный часовой пояс времени - было полезно setTimeZone для NSDateFormatter), извлечь из этого NSDate, а затем запустить его через другой NSDateFormatter для часового пояса устройства,Затем я преобразовал полученный NSDate обратно в NSString и прикрепил его к UILabel.

Это решение, похоже, сработало достаточно хорошо, поскольку я настроил свои устройства на разные часовые пояса, и изменение часового пояса все еще корректно.

РЕДАКТИРОВАТЬ: это также важно было включить:

NSString *date…….
date = [date stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
0 голосов
/ 29 июня 2011

Прежде всего, поймите, что компонентом даты будет 01-01-1970, поскольку он не предоставлен.Я предполагаю, что вы хотите, чтобы время было 04:00 GMT, если входная строка @"04:00".Этого можно добиться, установив часовой пояс форматтера.

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];    
[formatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
[formatter setDateFormat:@"HH:mm"];
NSDate *sourceDate = [formatter dateFromString:dateString]; 
...