如何将GMT时间转换为当地时间显示确切的时间

时间:2013-12-17 07:13:31

标签: ios iphone nsdate

我正在创建一个可以访问任何地方的应用程序,所以我要说我在格林尼治标准时间上午5:30上传视频,所以如果巴基斯坦的用户看到该视频,它应该显示他在本地的时间,而不是视频上传格林尼治标准时间上午5:30我正在使用以下代码进行转换,但它对我不起作用。

NSString *dateStr = @"2013-12-17 05:30 AM";

NSDateFormatter *dateFormatter1 = [[NSDateFormatter alloc] init]; 
[dateFormatter1 setDateFormat:@"yyyy-MM-dd HH:mm a"]; 

NSDate *date = [dateFormatter1 dateFromString:dateStr];

NSLog(@"date : %@",date);

NSTimeZone *currentTimeZone = [NSTimeZone localTimeZone];

NSDateFormatter *dateFormatter2 = [[NSDateFormatter alloc] init]; 
[dateFormatter2 setDateFormat:@"yyyy-MM-dd HH:mm: a"];
[dateFormatter2 setTimeZone:currentTimeZone];

NSDate *dateNew = [dateFormatter2 dateFromString:dateStr];
NSLog(@"date : %@",date);

NSLog两者分别是

date : 2013-12-16 19:30:00 +0000 2013-12-17 12:20:27.006 TimeTesting[1548:f803]
date : 2013-12-16 19:30:00 +0000

2 个答案:

答案 0 :(得分:0)

 -(NSDate *)getLocalTimeFrom:(NSDate *)GMTTime
{
    NSTimeZone *tz = [NSTimeZone localTimeZone];
    NSLog(@"%@",tz);
    NSInteger seconds = [tz secondsFromGMTForDate: GMTTime];
    NSLog(@"%ld",(long)seconds);
    return [NSDate dateWithTimeInterval: seconds sinceDate: GMTTime];
}

答案 1 :(得分:0)

默认情况下,NSDateFormatter将在从字符串创建日期时使用与当前语言环境关联的时区。因此,当您使用以下方法从字符串中获取日期时:

[dateFormatter1 setDateFormat:@"yyyy-MM-dd HH:mm a"]; 
NSDate *date = [dateFormatter1 dateFromString:dateStr];

您无意中使用手机的区域设置时区创建了日期,因此格林尼治标准时间8AM的值在用户的时区变为8AM,而不是格林尼治标准时间上午8点。 要纠正此问题,您需要设置日期格式化程序的区域设置,用于创建日期格式为GMT 0,如下面的代码所示:

NSString *dateStr = @"2013-12-17 05:30 AM";

NSDateFormatter *df = [[NSDateFormatter alloc]init];
//explicitly set the timezone for the date formatter, so it will treat dates parsed in as GMT 0
[df setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[df setDateFormat:@"yyyy-MM-dd HH:mm a"];

NSDate *date = [df dateFromString:dateStr];
NSLog(@"GMT date : %@",[df stringFromDate:date]);

//create a new date formatter to use in displaying in the UI, which by default will use the user's locale and timezone
NSDateFormatter *userLocaleDF  = [[NSDateFormatter alloc]init];
[userLocaleDF setDateFormat:@"yyyy-MM-dd HH:mm a"];

NSLog(@"date in user's locale/timezone: %@",[userLocaleDF stringFromDate:date]);