2 mapmapm MapMapM 于 2013.04.26 10:28 提问

转换NSString到NSDate

转换两个string值到NSDate,一个日期,一个时间。日期转换正确,但是时间总是转错。并且xcode给出log错误信息。实现转换日期的代码如下,不知道时间怎么转换才对。

 NSDate * date;
//Assume dateString is populated and of format NSString * dateString =@"2011-11-21 11:20";
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
NSString *dateString =[NSString stringWithFormat:@"%@ %@", socialEvent.SocialEventsDC_EventDate,socialEvent.SocialEventsDC_EventStartTime];
NSLog(@"%@ %@",socialEvent.SocialEventsDC_EventDate,socialEvent.SocialEventsDC_EventStartTime);
[dateFormatter setDateFormat:@"MM/dd/yyyy HH:mm a"];
if (dateString != nil)  {
    date = [dateFormatter dateFromString:dateString];
//        [date release];
}
NSLog(@"%@",date);

log信息:

2013-04-25 10:45:04.417 BNI UK & Ire[450:5203] 01/20/2015 11:00 PM
2013-04-25 10:45:09.679 BNI UK & Ire[450:5203] 2015-01-20 07:00:00 +0000

获得的时间总是7:00:00。正确的结果应该是11:00。

1个回答

KindAzrael
KindAzrael   2013.04.28 00:45
已采纳

你问题问的很好,里面涉及到了人们经常会犯的时区错误,看了下面的代码 你应该会对时区有所了解
如果还疑问可以特别问我,我考虑写一个关于这个时区方面文章解惑

  NSDate * date;
  NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
  NSString *dateString = @"01/20/2015 11:00 PM";
  NSLog(@"%@", dateString);

  //这里有个小错误
  // 使用 hh 代替 HH 因为一旦有了 a(AM/PM) 就不应该使用24小时制的HH而要用12小时制的hh,不然转换的时间会不准
  [dateFormatter setDateFormat:@"MM/dd/yyyy hh:mm a"];

  date = [dateFormatter dateFromString:dateString];
  //这个返回的时间是基于GMT+00:00的时间,而我机器是GMT+08:00,所以时间要减8小时是2015-01-20 15:00:00 +0000
  NSLog(@"timezone GMT+00:00 time: %@", date);

  //使用机器时区打印 date, 这样看到就是对的
  NSLog(@"%@", [date descriptionWithLocale:[NSLocale currentLocale]]);
  //或者这样也是对的, 用使用默认时区的dateFormatter格式化 date 就会看到和之前一样的时间
  NSLog(@"%@", [dateFormatter stringFromDate:date]);

  NSLog(@"default timezone:%@", [NSTimeZone defaultTimeZone]);

运行结果
2013-04-28 00:40:59.889 NoARCTestProject[1123:c07] 01/20/2015 11:00 PM
2013-04-28 00:40:59.892 NoARCTestProject[1123:c07] timezone GMT+00:00 time: 2015-01-20 15:00:00 +0000
2013-04-28 00:40:59.894 NoARCTestProject[1123:c07] Tuesday, January 20, 2015, 11:00:00 PM China Standard Time
2013-04-28 00:40:59.894 NoARCTestProject[1123:c07] 01/20/2015 11:00 PM
2013-04-28 00:40:59.895 NoARCTestProject[1123:c07] default timezone:Asia/Shanghai (GMT+08:00) offset 28800

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!