【问题标题】:NSDateIntervalFormatter printing dates even when dateStyle is set to NSDateFormatterNoStyleNSDateIntervalFormatter 打印日期,即使 dateStyle 设置为 NSDateFormatterNoStyle
【发布时间】:2015-05-12 20:59:15
【问题描述】:

我使用NSDateIntervalFormatter 来格式化时间范围。他们总是在同一天,所以我不想显示日期。在美国英语语言环境中,它们看起来像 9:00 PM - 10:00 PM。

当时间超过午夜时,问题就出现了。然后,从技术上讲,结束日期是第二天,NSDateIntervalFormatter 打印日期,即使它的dateStyle 设置为NSDateFormatterNoStyle

NSDateComponents *comps = [[NSDateComponents alloc] init];
comps.year = 2015;
comps.month = 5;
comps.day = 12;
comps.hour = 21;

NSDate *startDate = [[NSCalendar currentCalendar] dateFromComponents:comps];

// next day, at midnight
comps.day = comps.day + 1;
comps.hour = 0;
NSDate *endDate = [[NSCalendar currentCalendar] dateFromComponents:comps];

NSDateIntervalFormatter *formatter = [[NSDateIntervalFormatter alloc] init];
formatter.timeZone = [NSTimeZone localTimeZone];

formatter.dateStyle = NSDateFormatterNoStyle;
formatter.timeStyle = NSDateFormatterShortStyle;

NSString *string = [formatter stringFromDate:startDate toDate:endDate];
NSLog(@"%@", string);
// expected: 9:00 PM - 12:00 AM
// actual: 5/12/2015, 9:00 PM - 5/13/2015, 12:00 AM

有没有办法让它始终隐藏日期,而不必分别格式化两个日期并用破折号连接它们?

【问题讨论】:

  • 经过进一步调查(感谢 Brian!),这似乎是 Apple 的错误。我filed a radar。将退回到将两个 NSDateFormatters 的结果与本地化格式字符串连接起来。

标签: ios objective-c ios8 foundation


【解决方案1】:

如果您从日期组件中消除 Y/M/D,它会按需要工作:

NSDateComponents *comps = [[NSDateComponents alloc] init];
//    comps.year = 2015;
//    comps.month = 5;
//    comps.day = 12;
comps.hour = 21;

NSDate *startDate = [[NSCalendar currentCalendar] dateFromComponents:comps];

// next day, at midnight
comps.day = comps.day + 1;
comps.hour = 24;
NSDate *endDate = [[NSCalendar currentCalendar] dateFromComponents:comps];

NSDateIntervalFormatter *formatter = [[NSDateIntervalFormatter alloc] init];
formatter.timeZone = [NSTimeZone localTimeZone];

formatter.dateStyle = NSDateFormatterNoStyle;
formatter.timeStyle = NSDateFormatterShortStyle;

NSString *string = [formatter stringFromDate:startDate toDate:endDate];
// string = 9:00 PM - 12:00 AM

另外有趣的是,如果 comps.day + 1 被删除,它会显示:

1/3/1, 9:00 PM - 1/4/1, 12:00 AM

这对我来说毫无意义.... 1/3?!

更新:只有当 endDate 比 startDate 早一天时,它似乎才有正确的结果。如果休息超过一天,则不会。这感觉像是未定义的领域,无法按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多