【问题标题】:On setting doesRelativeDateFormatting = YES, stringFromDate returns nil在设置 dosRelativeDateFormatting = YES 时,stringFromDate 返回 nil
【发布时间】:2015-12-09 07:01:41
【问题描述】:

在 NSDateFormatter 文档中,

如果日期格式化程序使用相对日期格式,它会在可能的情况下用表示相对日期的短语(例如“今天”或“明天”)替换其输出的日期部分。

我正在使用以下代码:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = [NSDateFormatter dateFormatFromTemplate:@"EEEE dMMMM',' hma"
                                                       options:0
                                                        locale:[NSLocale currentLocale]];
formatter.doesRelativeDateFormatting = YES;
NSLog(@"Date: %@", [formatter stringFromDate:[NSDate date]]);

它记录Date:

但是在注释掉 formatter.doesRelativeDateFormatting = YES; 时输出是正确的。

Date: Tuesday, 19 August 1:18 pm

我理解doesRelativeDateFormatting 错了吗?

【问题讨论】:

    标签: ios iphone nsdateformatter


    【解决方案1】:

    嗨,当我这样修改代码时。它有效..

     NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
     formatter.dateFormat = [NSDateFormatter dateFormatFromTemplate:@"EEEE dMMMM',' hma"
                                                           options:0
                                                            locale:[NSLocale currentLocale]];
     [formatter setDateStyle:NSDateFormatterFullStyle];
     [formatter setTimeStyle:NSDateFormatterShortStyle];
     formatter.doesRelativeDateFormatting = YES;
      NSLog(@"Date: %@", [formatter stringFromDate:[NSDate date]]);
    

    【讨论】:

    • 重置dateStyle 会破坏添加的dateFormat。这记录 Date: Today 而不是 Date: Today, current_time
    • 嗨@AyushGoel 我已经更新了代码。请立即检查..默认时间样式是NSDateFormatterNoStyle,这就是您没有时间的原因。但我已将时间样式更新为NSDateFormatterShortStyle。现在它可以工作了。还有其他格式。即 NSDateFormatterNoStyle、NSDateFormatterShortStyle、NSDateFormatterMediumStyle、NSDateFormatterLongStyle、NSDateFormatterFullStyle。
    • 嘿,重置日期和时间样式也会更新NSDateFormatterdateFormatNSLog(@"%@ Date: %@", formatter.dateFormat, [formatter stringFromDate:[NSDate dateWithTimeIntervalSinceNow:-10000000]]); 提供EEEE, d MMMM y h:mm a Date: Thursday, 1 May 2014 4:58 am。请注意新的dateFormat 包含不应该存在的y
    【解决方案2】:

    似乎doesRelativeDateFormatting 不适用于自定义dateFormat

    显示Today, 11:44 pm19 Aug, 1:23 am 时,我遇到了与您相同的挑战。困难的部分是年份总是被排除在外。

    我是这样解决的:

    在启用doesRelativeDateFormatting 的情况下获取您喜欢的任何格式的日期

    let dateFormatter = NSDateFormatter()
    dateFormatter.dateStyle = NSDateFormatterStyle.MediumStyle
    dateFormatter.doesRelativeDateFormatting = true
    var dateString = dateFormatter.stringFromDate(dateToFormat)
    

    从同一日期获取格式化年份(确保 dateFormat 具有正确的 y 数来表示年份。我使用 4 y 是因为中等日期样式使用全年格式.

    let yearFormatter = NSDateFormatter()
    yearFormatter.dateFormat = NSDateFormatter.dateFormatFromTemplate("yyyy", options: 0, locale: NSLocale.currentLocale())
    let yearString = dateFormatter.stringFromDate(dateToFormat)
    

    最后通过从生成的dateString 中删除年份并修剪一些多余的空白来组成最终的字符串。

    var finalString = dateString.stringByReplacingOccurrencesOfString(yearString, withString: "")
    finalString = finalString.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
    

    这不是一个理想的解决方案,因为我确信在某些语言环境中,年份的格式正好在日月之间或其他东西之间,这会创建一个看起来很时髦的字符串。但它适用于我所有的测试案例。

    【讨论】:

    • 还有一些日期格式在日期之前或之后包含逗号,请注意仅剥离一年!
    • @rshev 没错,这就是为什么我说这不是一个理想的解决方案。
    猜你喜欢
    • 2015-04-22
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多