【问题标题】:NSDate is wrong when doing 'dateFromString'执行“dateFromString”时 NSDate 错误
【发布时间】:2015-07-01 16:02:05
【问题描述】:

我在英国,在 iOS 中处理日期时,他们总是迟到一小时(晚一小时),我需要的是来自 NSDate 的正确时间。我做了以下,但我得到了两个不同的时间:

 NSDate *today = [NSDate date];

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
 dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
 [dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];

 NSLog(@"NSDate %@",today);
 NSLog(@"Time %@", [dateFormatter stringFromDate:today]);
 NSDate*stringDate = [dateFormatter dateFromString:[dateFormatter stringFromDate:today]];
 NSLog(@"Time date %@",stringDate);

这是记录的内容:

NSDate 2015-07-01 16:07:22 +0000
Time 2015-07-01 17:07:22
Time date 2015-07-01 16:07:22 +0000

为什么会这样?我错过了一些明显的东西吗?当然如果字符串日期是正确的,那么执行dateFromString 应该会产生正确的结果?

我需要NSDate 的原因是我可以使用[myTime timeIntervalSince1970] 获得正确的秒数

2015-07-01 17:07:22 //is the correct date

我期待一个与我的日期和时间正确的 NSDate 对象。

更新 下面的答案帮助我找到了出错的地方,所以我改变了方法,我能够通过以下方式获取当前时间戳:

NSString *timeStamp = [dateFormatter stringFromDate:[NSDate date]];
    NSDate *curdate = [dateFormatter dateFromString:timeStamp];
    int unix_timestamp =  [curdate timeIntervalSince1970];
    NSDate* referenceDate = [NSDate dateWithTimeIntervalSince1970: 0];
    NSTimeZone* timeZone = [NSTimeZone systemTimeZone];
    int offset = (int)[timeZone secondsFromGMTForDate: referenceDate];
    int currentTimestamp = unix_timestamp + offset;

    NSLog(@"CUrrent time stamp %d",currentTimestamp);

【问题讨论】:

  • 你的系统时区是+0吗?您不会以相同的方式打印出两个日期,因此您不一定希望它们看起来相同。
  • @jtbandes 其 UTC/GMT+1
  • @jtbandes 我更新了我的代码以包含更多的 NSDate 之前。
  • 这里一切正常,16:00 GMT+0 == 17:00 GMT+1。你期待什么?
  • 这是NSDatedescription 方法,它使用使用GMT 的日期格式化程序。日期不变,内部表示始终为 GMT。注意:Apple 文档指的是 GMT,而不是 UTC,所以我使用 GMT,即使它是过时的。

标签: objective-c nsdate nsdateformatter


【解决方案1】:

NSDate 是一个绝对时刻,它没有时区。您拥有的日期对象是正确的:正是执行代码的那一刻。

如果您需要特定时区中那个时刻的字符串表示,请像您一样使用stringFromDate:

如果您需要了解特定时区的小时/分钟数值,请使用-[NSCalendar components:fromDate:]

[calendar setTimeZone:...];
NSDateComponents* components = [calendar components:(NSHourCalendarUnit|NSMinuteCalendarUnit) fromDate:date];

【讨论】:

    【解决方案2】:

    日期格式化程序默认为本地时区。如果您想要不同的时区,请指定它。日期的NSLog 使用默认为 GMT (UTC) 的 'NSDatedescription` 方法。

    检查代码:

    NSDate *today = [NSDate date];
    // Creates today's data in GMT (UTC) All NSDates are referenced to GMT.
    
    NSLog(@"NSDate %@",today); (moved up for explanation ordering)
    // NSDate 2015-07-01 16:07:22 +0000
    // Displays the date in GMT
    
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
    dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    [dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];
    // Creates a date for matter with the system timezone
    
    NSLog(@"Time %@", [dateFormatter stringFromDate:today]);
    // Time 2015-07-01 17:07:22
    
    // Creates a string representation in the system timezone and displays it
    NSDate*stringDate = [dateFormatter dateFromString:[dateFormatter stringFromDate:today]];
    // Creates a date from the string taking into the system timezone
    NSLog(@"Time date %@",stringDate);
    
    // Time date 2015-07-01 16:07:22 +0000
    // Displays the date in GMT.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多