【问题标题】:unexpected result of dateFromComponents:dateFromComponents 的意外结果:
【发布时间】:2012-04-02 19:42:58
【问题描述】:

以下代码

NSCalendar *cal = [NSCalendar currentCalendar];
[cal setFirstWeekday:2];
[cal setMinimumDaysInFirstWeek:4];

NSDateComponents *comp = [[NSDateComponents alloc] init];
[comp setYear: 2012];
[comp setMonth:3];
[comp setDay: 12];
NSDate *date = [cal dateFromComponents:comp];
NSLog(@"date:%@",date);

日志:

date:2012-03-11 23:00:00 +0000

任何想法,为什么会发生这种情况以及如何避免 天呐

【问题讨论】:

标签: objective-c io nsdate nsdatecomponents


【解决方案1】:

我假设您在本地使用 CET 时区。这就是 [NSCalendar currentCalendar] 将使用的时区。

当您使用 NSLog 转储 NSDate 时,您将获得原始 UTC 格式的日期。要使用本地格式打印日期,请查看具有 timeZone 属性的 NSDateFormatter 类:

....
NSDate *date = [cal dateFromComponents:comp];
NSDateFormatter* fmt = [[NSDateFormatter alloc] init];
fmt.timeZone = [NSTimeZone defaultTimeZone]; // Probably not required
NSLog(@"date:%@", [fmt stringFromDate:date]);

【讨论】:

    【解决方案2】:

    设置时区

    NSCalendar *cal = [NSCalendar currentCalendar];
    
    [cal setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
    

    【讨论】:

      【解决方案3】:

      当您调用dateFromComponents: 时,您会丢失所有时区和日历信息,并留下一个 NSDate 对象,该对象包含您的日期组件所代表的时间点,但仅此而已。当您在 NSDate 对象上使用 NSLog 时,该时刻将转换为 UTC 时间并呈现为人类可读的字符串。

      您需要提供更多关于您想要达到的目标的信息,才能回答您的第二个问题,即如何避免这种情况。

      【讨论】:

      • 实际上恰恰相反 - 使用 dateFromComponents 时不会丢失任何时区信息,它实际上会考虑时区并为您返回一个对您的 local 有意义的日期i> 时区(默认)。本质上,如果您使用 Today 作为日期和 16:00 作为时间创建组件,则创建的日期将为当地时间 16:00,除非您使用 NSCalendar 并将 GMT 设置为时区。
      • @strangetimes 我不认为我们不同意,你只是用不同的方式看待它。
      猜你喜欢
      • 1970-01-01
      • 2012-04-23
      • 2011-09-15
      • 2019-05-14
      • 2017-07-11
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多