【问题标题】:parsing date from string, nsdate, objective c从字符串、nsdate、objective c 解析日期
【发布时间】:2013-03-14 19:16:37
【问题描述】:

下面是一个代表日期的字符串

NSString *dateStr = @"2011-07-06";

当我尝试将其转换为 NSDate 时:

    NSDateFormatter *format         =   [[NSDateFormatter alloc] init];

    [format setDateFormat:@"yyyy-MM-dd"];
    NSDate      *tmp                =   [format dateFromString:dateStr];
    NSLog(@"tmp  is %@",[tmp description]);

我从控制台得到的是

tmp  is 2011-07-06 04:00:00 +0000

我不明白为什么我会得到额外的信息:04:00:00 +0000 的结果

如果你之前遇到过,请帮忙

【问题讨论】:

    标签: objective-c nsdate nsdateformatter


    【解决方案1】:

    你的代码

    NSString *dateStr = @"2011-07-06";
    NSDateFormatter *format         =   [[NSDateFormatter alloc] init];
    
    [format setDateFormat:@"yyyy-MM-dd"];
    NSDate      *tmp                =   [format dateFromString:dateStr]
    

    将产生一个 NSDate 对象,它表示您的当地时间 0:00 — 一天的开始。

    但是如果你打印一个普通的日期对象,它会产生一个代表 GMT 时区时间的字符串,因为在内部,所有日期都被标准化为那个时区。

    由于您的字符串提前 4 小时,我们可以判断,您很可能在东欧,也许是莫斯科。

    所以如果你想在你的时区看到字符串,你需要使用 NSDateFormatter 从日期对象创建它。

    NSLog(@"tmp  is %@",[formatter stringFromDate:tmp]);
    

    检查,如果它是正确的,我所说的,改变格式以包含时间组件。

    formatter.format = [@"yyyy-MM-dd HH:mm"];
    NSLog(@"tmp  is %@",[formatter stringFromDate:tmp]);
    

    格式化程序还将考虑“闰日”、Leap Month(是的——那些退出)、夏令时、Leap Seconds 等“奇怪”——与当前日历一致。


    精彩的 WWDC 2011 视频:Performing Calendar Calculations — 每个可可开发人员都必须观看。


    顺便说一句:要使用 NSLog 打印对象,您不需要在其上调用 -description 来传递字符串。 NSLog 将在内部执行此操作。

    NSLog(@"tmp  is %@", tmp);
    

    没问题。

    【讨论】:

      【解决方案2】:

      答案很简单,NSLog 只是将 NSDate 转换为 NSString,使用它的格式化程序和 GMT(零)时区。

      您的格式化程序默认设置为您的默认时区,可能是-4:00。当您打印出来时,NSLog 会将其转换为 0:00,增加 4 小时。

      一般来说,在不指定时区的情况下解析日期是不安全的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-21
        • 1970-01-01
        • 2011-04-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多