我的本地和默认时区是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
Run Code Online (Sandbox Code Playgroud)
但
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**
Run Code Online (Sandbox Code Playgroud)
为什么NSDate没有给当地时间?请帮忙...
小智 71
试试这个...
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];
Run Code Online (Sandbox Code Playgroud)
这有助于响应当前的系统时区.
mal*_*hal 23
忘记NSDateFormatter这太复杂了,而是试试这个魔法:
NSLog(@"date with local timezone is: %@",
[date descriptionWithLocale:[NSLocale systemLocale]]);
Run Code Online (Sandbox Code Playgroud)
NSDate是一个"原始"日期.这就是GMT的原因.由代码来决定使用NSDateFormatter(就像你所做的那样)将日期输出到对用户有意义的值.
在极少数情况下,您可能需要显示不使用用户时区的NSDate(如果您想在纽约时间显示时间,无论用户身在何处).然后,将日期格式化程序上的时区设置为特定值(再次,就像您所做的那样).
计算机通常会在GMT中存储所有日期,然后调整它们为用户显示的方式.如果你开始尝试改变日期的实际存储方式,你将会搞砸很多日期处理框架,这些框架都假定你的NSDate是GMT格式.
如您所见,当您通过NSDateFormatter读取日期时,它会根据您设置的格式化程序的时区从输入的时间转换,然后转换为GMT.那么你认为它在做什么是错的?因为它正在做它应该做的事情 - 在GMT中存储日期并根据时区输出字符串.
| 归档时间: |
|
| 查看次数: |
48351 次 |
| 最近记录: |