来自字符串的NSDate给出了错误的结果

时间:2013-01-07 22:42:57

标签: iphone objective-c ios ipad

我正在尝试将字符串转换为NSDate对象。我使用以下代码进行转换:

NSDateFormatter * dateFormat = [[NSDateFormatter alloc] init];
NSTimeZone *tz = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
[dateFormat setDateFormat:@"M/d/yyyy HH:mm:ss a"];
[dateFormat setTimeZone:tz];

NSDate * dtEventStart = [dateFormat dateFromString:@"1/7/2013 6:30:00 AM"];
NSDate * dtEventEnd = [dateFormat dateFromString:@"1/7/2013 8:45:00 PM"];

NSLog(@"dtEventStart: %@", dtEventStart);
NSLog(@"dtEventEnd: %@", dtEventEnd);

但是,输出如下所示:

dtEventStart: 2013-01-07 00:30:00 +0000
dtEventEnd: 2013-01-07 12:45:00 +0000

输出时间和日期与用于转换的字符串不同。我也尝试过使用EST作为timeZone,但会产生不同的错误结果,如下所示:

dtEventStart: 2013-01-07 05:30:00 +0000
dtEventEnd: 2013-01-07 17:45:00 +0000

我知道我错过了什么,但我不知道是什么。非常感谢任何帮助。

谢谢

更新:

这是

EKEventStore *eventStore = [[EKEventStore alloc] init];

EKEvent * eventForCalendar  = [EKEvent eventWithEventStore:eventStore];
eventForCalendar.title     = event.title;

NSDateFormatter * dateFormat = [[NSDateFormatter alloc] init];
NSTimeZone *tz = [NSTimeZone timeZoneWithAbbreviation:@"EST"];
[dateFormat setDateFormat:@"M/d/yyyy HH:mm:ss a"];
[dateFormat setTimeZone:tz];

NSDate * dtEventStart = [dateFormat dateFromString:@"1/7/2013 6:30:00 AM"];
NSDate * dtEventEnd = [dateFormat dateFromString:@"1/7/2013 8:45:00 PM"];

NSLog(@"dtEventStart: %@", dtEventStart);
NSLog(@"dtEventEnd: %@", dtEventEnd);

eventForCalendar.startDate = dtEventStart;
eventForCalendar.endDate = dtEventEnd;

[eventForCalendar setCalendar:[eventStore defaultCalendarForNewEvents]];
NSError *err;
[eventStore saveEvent:eventForCalendar span:EKSpanThisEvent error:&err];

2 个答案:

答案 0 :(得分:0)

对于解析,文档建议首先将日期格式化程序的语言环境设置为en_US_POSIX:

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html#//apple_ref/doc/uid/TP40002369-SW7

此外,这个Q& A on Date格式化程序:

http://developer.apple.com/library/ios/#qa/qa1480/_index.html

  

我正在使用NSDateFormatter来解析互联网风格的日期,但对于某些地区的某些用户来说,这会失败。我已经设置了一个特定的日期格式字符串;不应该强迫NSDateFormatter独立于用户的区域设置工作吗?

     

没有。虽然设置日期格式字符串似乎适用于大多数用户,但它不是解决此问题的正确方法。有许多地方格式字符串以意想不到的方式运行。例如:

答案 1 :(得分:0)

请尝试以下代码: -

NSDateFormatter * dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"MM/dd/yyyy hh:mm:ss a"];
[dateFormat setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];

NSDate * dtEventStart = [dateFormat dateFromString:@"1/7/2013 6:30:00 AM"];
NSDate * dtEventEnd = [dateFormat dateFromString:@"1/7/2013 8:45:00 PM"];

NSLog(@"dtEventStart: %@", dtEventStart);
NSLog(@"dtEventEnd: %@", dtEventEnd);

您将获得24小时格式的以下输出: -

dtEventStart: 2013-01-07 06:30:00 +0000
dtEventEnd: 2013-01-07 20:45:00 +0000