【问题标题】:NSDate and NSDate stringFromDate are inconsistentNSDate 和 NSDate stringFromDate 不一致
【发布时间】:2013-11-13 17:50:20
【问题描述】:

我正在尝试将 mysql 日期时间字段转换为另一个时区。当我打印日期对象时,转换似乎是正确的,但是当我将日期打印为字符串时,时间不正确。源代码和输出如下。

来源:

已编辑 - 以秒和字符串打印原始间隔,添加时区

interval = [NSNumber numberWithDouble: seconds];
NSLog(@"interval in ms: %@",interval); 
self.dateStamp = [[NSDate alloc] initWithTimeIntervalSince1970:seconds/1000];


if(![currentZone.name isEqualToString: timezone]){          //need to convert
    NSDateFormatter *fromTZ = [[NSDateFormatter alloc]init];
    [fromTZ setTimeZone:currentZone];
    [fromTZ setDateFormat:@"hh:mm yyyy-MM-dd"];
    NSLog(@"original date: %@",[fromTZ stringFromDate:self.dateStamp]);
    NSDateFormatter *toTZ = [[NSDateFormatter alloc]init];
    [toTZ setTimeZone:spotZone];
    [toTZ setDateFormat:@"hh:mm yyyy-MM-dd"];
    NSString *tempdate = [fromTZ stringFromDate:self.dateStamp];
    NSDate *toDate = [toTZ dateFromString:tempdate];
    NSLog(@"Date: %@",toDate);
    NSLog(@"Date String: %@", [toTZ stringFromDate:toDate]);
}

输出:

以毫秒为单位的间隔:1384193573000

original date: 01:12 2013-11-11 //当前时区日期:America/Phoenix

日期:2013-11-11 08:12:00 +0000 //新时区日期:美国/纽约

日期字符串:2013-11-11 01:12

【问题讨论】:

  • 它们是一样的。只是当您记录 NSDate 时,它会以 UTC 时间显示。
  • 您在 -7 时区。
  • 我需要将此日期作为字符串打印到 UI,您能帮我理解我该怎么做吗? @rmaddy
  • 你已经在使用[toTZ stringFromDate:toDate];
  • 请注意 1) 小时的日期格式是HH,而不是hh。 2) NSLog(@"Date: %@",toDate) 打印相对于 UTC 的日期。 - 如果没有帮助,请提供完整信息:输入self.dateStamp、使用的时区、中间结果tempdate 和最终结果toDate

标签: objective-c nsdate nsdateformatter nstimezone


【解决方案1】:

NSDate 没有时区的概念,它只是一个对象,表示自 2001 年 1 月 1 日 GMT 以来的秒数,并以 UTC 表示。无论您尝试将其设置为什么,当您直接登录 NSDate 时,它都会为您提供相同的结果。避免这种情况的唯一方法是使用您已经完成的NSDateFormatter。您发布的所有内容都是预期的行为。

【讨论】:

    【解决方案2】:

    您的服务器发送自 1970 年 1 月 1 日以来的时间 1384193573000(以毫秒为单位),但不是像通常那样相对于 GMT,而是相对于不同的时区,在您的示例中为“美国/凤凰城”。

    因此你必须先添加一个更正,这是“美国/凤凰”和格林威治标准时间的区别:

    NSTimeInterval serverTime = 1384193573000/1000.;
    NSTimeZone *fromZone = [NSTimeZone timeZoneWithName:@"America/Phoenix"];
    NSTimeInterval diff = [fromZone secondsFromGMTForDate:[NSDate dateWithTimeIntervalSince1970:0]];
    NSDate *dateStamp = [NSDate dateWithTimeIntervalSince1970:(serverTime - diff)];
    

    这是关键的一步。 dateStamp 现在是一个“正确的”NSDate 对象,表示 从服务器发送的时间。 剩下的就是显示日期了。就像上面的 cmets 和其他 回答。例如:

    NSTimeZone *toZone = [NSTimeZone timeZoneWithName:@"America/New_York"];
    NSDateFormatter *toTZ = [[NSDateFormatter alloc]init];
    [toTZ setTimeZone:toZone];
    [toTZ setDateFormat:@"HH:mm yyyy-MM-dd"];
    NSString *result = [toTZ stringFromDate:dateStamp];
    
    // result = 20:12 2013-11-11
    

    【讨论】:

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