【问题标题】:Date formatter returns nil for June日期格式化程序在 6 月返回 nil
【发布时间】:2013-09-06 17:32:13
【问题描述】:

我对这些代码行有一个奇怪的问题:

NSDateFormatter * df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"MMyyyy"];
NSDate * date = [df dateFromString:@"062008"];
NSLog(@"Date %@", date);

结果是:

 Date (null)

但是当我这样更改月份时:

NSDateFormatter * df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"MMyyyy"];
NSDate * date = [df dateFromString:@"072008"];
NSLog(@"Date %@", date);

结果是:

Date 2008-06-30 23:00:00 +0000

仅六月 (06) 月份,从字符串转换日期失败!

我认为,这与时区有关,任何想法。

谢谢

解决了:

[df setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];

正如我所想,它与时区有关。

【问题讨论】:

  • 写下你自己的答案,然后点击它回答——它会给你加分,让其他关注的人更清楚。
  • 在您的回答中,您可以更详细地解释:它与时区有什么关系?好的,将时区更改为 GMT “修复”了它,但它真的修复了吗?出了什么问题?如果这真的是一种修复,而不仅仅是绷带,那么它是如何解决问题的呢?
  • 顺便问一下:在哪个时区?当我运行该代码时,显然当 hussain Shabbir(来自答案)运行它时,我们都得到了@"062008" 的日期。你没有,那么你的格式化程序使用什么时区和日历?如果您将其保留为默认值,您的系统设置为哪个时区和日历?
  • 我的时区是:非洲/卡萨布兰卡
  • 感谢 Hot Licks 的提议,非常好

标签: cocoa nsdate nsdateformatter


【解决方案1】:

恭喜,您发现了更多时区异常!你说得对,改变你的时区可以解决这个问题。让我们去洞穴探险,看看能不能找出原因!

首先,我们将尝试找出发生这种奇怪现象的每个时区:

NSArray *tzs = [NSTimeZone knownTimeZoneNames];
NSDateFormatter *f = [[NSDateFormatter alloc] init];
f.dateFormat = @"MMyyyy";
for (NSString *name in tzs) {
    f.timeZone = [NSTimeZone timeZoneWithName:name];
    NSDate *date = [f dateFromString:@"062008"];
    if (date == nil) {
        NSLog(@"%@", name);
    }
}

这将遍历所有已知的时区并尝试在该时区解析“062008”。如果我们运行它,我们会发现它会记录:

Africa/Casablanca
Asia/Karachi

所以我猜你住在卡萨布兰卡或卡拉奇(因为默认情况下,你的 NSDateFormatter 是用你的时区初始化的,这就是你看到这个问题的原因;可能是卡萨布兰卡,因为您似乎比格林威治标准时间早 1 小时)。

让我们看看我们能否找出这些时区的奇怪之处:

$ zdump -v Africa/Casablanca
... snip ...
Africa/Casablanca  Sun Jun  1 00:00:00 2008 UTC = Sun Jun  1 01:00:00 2008 WEST isdst=1
... snip ...

$ zdump -v Asia/Karachi
... snip ...
Asia/Karachi  Sat May 31 19:00:00 2008 UTC = Sun Jun  1 01:00:00 2008 PKST isdst=1
... snip ...

果然,看起来卡萨布兰卡和卡拉奇都跳过了 2008 年 6 月 1 日的午夜时间。因此,您实际上是在给它一个无法解析的日期,它正在返回 nil。简而言之。

在这种情况下,正确的答案 更改您的时区(GMT 可能是一个不错的选择),因为您正在解析的这个字符串很可能不是来自用户输入(考虑到它很奇怪格式),因此应根据标准时区进行解析。虽然我确信卡萨布兰卡和卡拉奇是非常整洁的地方,但它们的时区并不完全一样......

TL;DR:

应该取消夏令时。

【讨论】:

    【解决方案2】:

    是的!你是绝对正确的。我也面临同样的问题我的想法也与时区有关。不确定这是否是您问题的理想解决方案

    NSString *strDate=@"06-2008";
    NSDateFormatter * df = [[NSDateFormatter alloc] init];
    [df setDateFormat:@"MM-yyyy"];
    [df setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
    NSDate * date = [df dateFromString:strDate];
    NSLog(@"Date %@", date);
    

    【讨论】:

    • 更改日期写入的格式并不总是一种选择,并且不会揭示导致 NSDateFormatter 以该格式返回该日期的nil 的任何信息。
    【解决方案3】:

    已解决: 正如我所想,它与时区有关。

    [df setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      相关资源
      最近更新 更多