-2

我在服务器上以 GMT 格式存储值。我将它们下载到设备上并通过以下功能将其转换为用户本地时间:

- (void)convertTimeZone
{
    //Converts the match timing from GMT to the users local time
    NSString *serverDateString = [NSString stringWithFormat:@"%@-%@-%@ %@:%@ GMT", year, month, day, hour, min];

    NSDateFormatter *dateFormatter = [NSDateFormatter new];
    dateFormatter.dateFormat       = @"yyyy-MM-dd HH:mm zzz";

    NSDate *serverDate             = [dateFormatter dateFromString:serverDateString];

    NSString *localDateString      = [dateFormatter stringFromDate:serverDate];
    NSDate *localDate              = [dateFormatter dateFromString:localDateString];


    NSDateComponents *components = [[NSCalendar currentCalendar] components:NSHourCalendarUnit |NSMinuteCalendarUnit |NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:localDate];

    min   = [NSString stringWithFormat:@"%d",[components minute]];
    hour  = [NSString stringWithFormat:@"%d",[components hour]];
    day   = [NSString stringWithFormat:@"%d",[components day]];
    month = [NSString stringWithFormat:@"%d",[components month]];
    year  = [NSString stringWithFormat:@"%d",[components year]];

}

几乎每个人都在转换后得到适当的时间。然而,很少有用户写信说他们收到的日期是 2001 年 1 月 1 日,这是 iOS 和 OSX 上的初始化日期。日期是格林威治标准时间与其当地日期之间的时差。

它们的值是由服务器正确设置和接收的年、月、日、小时和分钟。我知道这是因为其他一些值显示正确。

然而,这种日期时间转换过程在少数情况下会出错。

为什么会这样?

由于它从未发生在我的设备上,但发​​生在其他国家的用户身上,我不知道如何重现它。他们试图重新启动它,但他们仍然得到错误的日期。谢谢。

4

2 回答 2

1

您没有按照QA1480的要求设置语言环境。因此,您设置的日期格式可能会根据用户的设置进行修改。

显式设置语言环境以解决问题。

于 2013-08-21T16:02:36.007 回答
1

每当您使用 anNSDateFormatter来读取或发出需要采用某种特定格式的日期时,您都需要执行以下操作:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];

这将防止出现例如此处所示的问题。

于 2013-08-21T16:03:54.763 回答