【问题标题】:NSDate format and value strange behaviorNSDate 格式和值的奇怪行为
【发布时间】:2011-04-01 04:46:38
【问题描述】:

我有以下代码:

NSDateFormatter * df = [[NSDateFormatter alloc] init];
    [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    [df setTimeZone:[NSTimeZone systemTimeZone]];
    [df setFormatterBehavior:NSDateFormatterBehaviorDefault];

myres.start_date = [df dateFromString:[NSString stringWithFormat:@"%@ %@", [self.data objectForKey:@"date"], [self.data objectForKey:@"start_time"]]];
    NSLog(@"Start date is %@", [NSString stringWithFormat:@"%@ %@", [self.data objectForKey:@"date"], [self.data objectForKey:@"start_time"]]);
    NSLog(@"Start date from NSDate is %@", myres.start_date);
    myres.end_date = [df dateFromString:[NSString stringWithFormat:@"%@ %@", [self.data objectForKey:@"date"], [self.data objectForKey:@"end_time"]]];
    NSLog(@"End date is %@", [NSString stringWithFormat:@"%@ %@", [self.data objectForKey:@"date"], [self.data objectForKey:@"end_time"]]);
    NSLog(@"End date from NSDate is %@", myres.end_date);

我得到的结果是:

Start date is 2011-03-31 9:00:00
Start date from NSDate is 2011-03-31 16:00:00 +0000
End date is 2011-03-31 10:00:00
End date from NSDate is 2011-03-31 17:00:00 +0000

为什么结果不同? 我想拥有它,这样当我调用 myres.start_date 描述时,它会为我提供与字符串相同的数据。

【问题讨论】:

  • 你朋友的开始时间和结束时间是什么时候?你从哪里得到这些?
  • 它来自我拥有的字典......此时它不相关......我的观点是,如果您使用 NSDateFormatter 从 NSString 生成 NSDate ,那么您尝试从中调用描述新的 NSDate... 由于时区不同,结果会有所不同

标签: iphone objective-c nsdate


【解决方案1】:

结果不同,因为您使用通用 description 方法打印您的 NSDate 实例,这与您期望的输出格式不匹配。

如果你使用[df stringFromDate:myres.start_date],你应该得到相同的输出。

记住NSDate存储了一个时间的表示,并且有很多种方式来打印时间并且description的打印时间方式是固定的.

让description 或NSDate 返回所需格式的字符串的唯一方法是用类别覆盖它或使用子类。

您似乎对时间的存储和显示方式有一个根本的误解:您的NSDate 存储了NSDateFormatter 解析的时间,实际上它返回的是相同的数据它的description 方法。它只是以不同的形式显示。

【讨论】:

  • 以及如何解决它,使两者都指向同一时间?我希望我的 NSDate 与 NSDateFormatter 具有相同的日期
  • 将 null 打印为 NSDate
  • 我需要打印出描述给我准确的日期和时间作为字符串
  • 我的意思是这样做只会给我一个字符串..我实际上想要一个与我在字符串中指定的时间相同的 NSDate 对象..这不仅仅是为了打印目的
  • 您的 NSDate 对象与您指定的字符串具有相同的时间(假设您给它的字符串指定了设备默认时区中的时间),它只是以 UTC 时间打印,而不是您的本地时间.使用您设置的 dateformatter 打印它,您应该会看到相同的输出。
【解决方案2】:

日期格式化程序会考虑时区。当你直接使用日期时,你只是得到它的描述,这显然是祖鲁时间。

【讨论】:

    猜你喜欢
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 2017-12-27
    相关资源
    最近更新 更多