【问题标题】:NSString to NSDate returns wrong dateNSString 到 NSDate 返回错误的日期
【发布时间】:2012-07-10 07:54:59
【问题描述】:

我尝试将我的 NSString 转换为 NSDate 对象,但 NSDateFormatter 返回一个奇怪的值。

代码如下:

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy-MM-dd HH:mm"]; 
NSDate *date = [dateFormat dateFromString:@"2012-08-15 00:00"];
[dateFormat release];

date 的值为2012-08-14 21:00 +0000NSString 值和NSDate 值之间相差 3 小时。我想我错过了一些东西,但我不知道是什么。

【问题讨论】:

  • 如果你尝试NSDate *date = [dateFormat dateFromString:@"2012-08-14 24:00"];会怎样?
  • @mavrick3 不,dateformatter 返回 nil
  • 我的猜测是它与时区有关......你离 UTC 有 3 小时的路程吗?
  • 是的,我住的地方离 UTC 3 小时车程

标签: objective-c ios nsstring nsdate nsdateformatter


【解决方案1】:

这是我用的:

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss ZZZ"]; 

NSDate *date = [dateFormat dateFromString:@"2012-08-15 00:00:00 +0000"];
NSLog(@"\n\n  DATE: %@ \n\n\n", date);

+0000 是时区,因此请确保使用您的时区,例如 +0400

编辑: 如果你不能改变字符串,你可以使用这个代码来做:

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy-MM-dd HH:mm"]; 
[dateFormat setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

NSDate *date = [dateFormat dateFromString:@"2012-08-15 00:00"];

【讨论】:

  • 不幸的是我从网络服务器收到了这个值,它返回给我的字符串没有 +0000
【解决方案2】:

据我所知,NSDate 持有格林威治时间,所以如果你在莫斯科时区,一切都是正确的

【讨论】:

    【解决方案3】:

    在 NSDate 的目标 c 中,如果你没有设置 setTimeZone,NSDate 会将默认时区作为 localTimeZone。因此,如果您需要获取以 NSString 字符串格式提供的确切日期,则需要将 TimeZone 设置为 UTC。按照示例代码,我想它会对你有所帮助。

    NSDateFormatter *loacalformatter=[[NSDateFormatter alloc]init];
    [loacalformatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSDate *localDate =[loacalformatter dateFromString:@"2012-08-15 00:00"];
    NSLog(@"localDate :%@",localDate);
    
    
    NSDateFormatter *UTCformatter=[[NSDateFormatter alloc]init];
    [UTCformatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
    [UTCformatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSDate *UTCDate =[UTCformatter dateFromString:@"2012-08-15 00:00"];
    NSLog(@"UTCDate :%@",UTCDate);
    UTCDate :2012-08-15 00:00 +0000 (GMT+00:00)
    

    【讨论】:

      【解决方案4】:

      根据 cmets 的建议,如果您收到的日期是 UTC,那么您需要将其转换为您当地的时区。 Apple 建议您在显示日期时始终使用正确配置的 NSDateFormatter 来处理本地化问题。

      下面是一些将 NSDate 转换为 NSString 的示例代码:

      NSDate *date = // initialised elsewhere
      
      NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
      dateFormat.locale = [NSLocale currentLocale];
      dateFormat.timeZone = [NSTimeZone localTimeZone];
      dateFormat.timeStyle = NSDateFormatterShortStyle;
      dateFormat.dateStyle = NSDateFormatterShortStyle;    
      dateFormat.locale = [NSLocale currentLocale];
      NSString *dateAsString = [dateFormat stringFromDate:date];
      

      【讨论】:

        猜你喜欢
        • 2017-06-19
        • 2014-01-18
        • 2013-09-07
        • 1970-01-01
        • 2014-05-19
        • 1970-01-01
        • 1970-01-01
        • 2012-07-12
        • 1970-01-01
        相关资源
        最近更新 更多