使用NSTimeZone和Dateformatter格式化从服务器时间到本地时间的日期

时间:2013-08-22 02:08:30

标签: nsdate nsdateformatter

我从我的服务器收到一个日期/时间作为NSString,我使用NSTimeZone将该时间转换为NSDate到用户本地时间。之后,我尝试使用新的NSDateFormatter格式将此NSDate重新格式化为更易读的NSString,但是当我尝试应用这种新格式时,它会将生成的dateString恢复为原始服务器时间。

我想知道我做错了什么,我想用新格式显示转换时间。

这是我正在使用的代码

// set date format
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";

    // change time to systemTimeZone
    NSTimeZone *timeZone = [NSTimeZone systemTimeZone];
    [dateFormatter setTimeZone:timeZone];
    NSDate *localTime = [dateFormatter dateFromString:[singleInstanceActivationHistoryDictionay objectForKey:@"ActivationTime"]];


    // reformat converted Time to readable format
    NSDateFormatter *dateFormat1 = [[NSDateFormatter alloc] init];
    [dateFormat1 setDateFormat:@"dd/MM/yy - hh:mm a"];
     NSString *dateWithNewFormat = [dateFormat1 stringFromDate:localTime];


    NSLog(@"TimeZone - %@", timeZone);
    NSLog(@"UTC ServerTime - %@", [singleInstanceActivationHistoryDictionay objectForKey:@"ActivationTime"]);

    NSLog(@"UTC to deviceTimeZone - %@", localTime);
    NSLog(@"NewFormat - %@", dateWithNewFormat);

这是我输出的一个例子

TimeZone - Pacific/Auckland (NZST) offset 43200
UTC ServerTime - 2013-08-22 01:45:59
UTC to deviceTimeZone - 2013-08-21 13:45:59 +0000
NewFormat - 22/08/13 - 01:45 AM

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

读取日期的NSDateFormatter必须设置为您要解析的日期所在的时区,在您的情况下,它是UTC。然后,日期格式化程序将能够生成NSDate对象(它表示特定的时刻,而不管时区如何)。然后,您可以将该NSDate对象提供给另一个配置为格式化特定时区中日期的NSDateFormatter。

// set date format
NSDateFormatter *dateParser = [[NSDateFormatter alloc] init];
dateParser.dateFormat = @"yyyy-MM-dd HH:mm:ss";
dateParser.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
NSDate *specificMomentInTime = [dateParser dateFromString:[singleInstanceActivationHistoryDictionay objectForKey:@"ActivationTime"]];

// reformat converted Time to readable format
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"dd/MM/yy - hh:mm a";
dateFormatter.timeZone = [NSTimeZone defaultTimeZone];
NSString *dateWithNewFormat = [dateFormatter stringFromDate:specificMomentInTime];

NSLog(@"UTC ServerTime - %@", specificMomentInTime);
NSLog(@"NewFormat - %@", dateWithNewFormat);