将事件添加到日历时,NSDateFormatter 未正确格式化日期

Posted

技术标签:

【中文标题】将事件添加到日历时,NSDateFormatter 未正确格式化日期【英文标题】:NSDateFormatter not formatting dates correctly when adding events to calendar 【发布时间】:2013-04-26 21:55:07 【问题描述】:

我无法弄清楚如何使用 NSDateFormatter 解析某种日期格式并将其放入 EKEvent。目前这是我的代码。我已经请求添加事件的权限,并且从 requestAccessToEntityType:completion: 的完成处理程序调用方法:

-(void) performCalendarOperation 
    NSString *startString = @"04/28/2013 2:30 PM";
    NSString *endString = @"04/28/2013 5:30 PM";

    EKEvent *newEvent = [EKEvent eventWithEventStore:self.eventStore];
    [newEvent setCalendar:[self.eventStore defaultCalendarForNewEvents]];
    NSDateFormatter *format = [[NSDateFormatter alloc] init];
    [format setDateFormat:@"MM/dd/yyyy hh:mm a"];

    newEvent.startDate = [format dateFromString:startString];
    newEvent.endDate = [format dateFromString:endString];

    NSLog(@"START:%@\n\nEND:%@\n\n", newEvent.startDate, newEvent.endDate);

NSLog 打印以下内容:

开始时间:2013-04-28 21:30:00 +0000 结束:2013-04-29 00:30:00 +0000

在这种特殊情况下,我希望这是 12 小时的时间

对于这种日期字符串样式,NSDateFormatter 格式字符串似乎是正确的,但由于某种原因,输出不正确。在设置更多属性后,该事件实际上是稍后在代码中添加到日历中的,但这对于这个问题并不重要。 请注意,我在解析 ios 6.0 之前的日期时从未遇到过这个问题,所以这可能是我没有考虑到的 API 或格式的某些更改的产物?有没有我没有看到的明显错误?

谢谢。

【问题讨论】:

这是 NSLog 打印 NSDate 对象的方式。您的格式字符串只是让日期格式化程序知道您的字符串的格式,以便它可以将其转换为日期。如果你希望它以不同的方式打印出来,那么你需要记录一个 stringFromDate: 字符串,而不是 NSDate 对象。 【参考方案1】:

NSLog 始终以 24 小时制和时区 GMT+0/UTC 打印。这就是为什么它看起来不正确,但实际上是。如果您想使用 NSLog 正确打印日期,则需要使用 NSDateFormatter 将日期格式化为您喜欢的格式(使用 stringFromDate)。

【讨论】:

这似乎是问题所在,而且很明显。谢谢你让我更加头疼!

以上是关于将事件添加到日历时,NSDateFormatter 未正确格式化日期的主要内容,如果未能解决你的问题,请参考以下文章

如何使用离子电容器将事件添加到移动设备的日历

设置日历单元格格式以在添加事件时更改颜色

你如何添加一个链接,将一个事件从 safari 添加到你的 iPhone 日历?

iOS - 无法使用 EventKit 将日历事件添加到 Gmail 日历

如何将日历活动发布到参与者的特定日历

如何使用 html 代码将事件添加到指定的谷歌日历