string格式的date转换为stringdate前一天的nsdate结果

我搜查了我的问题,但我没有find任何相关的帮助…

故事:用户通过名称,开始date,结束date和注释创build一个继续事件,所以将所有字段保存在Sqlite数据库中。 两种date格式是“yyyy-MM-dd”。 之后,当用户想要对事件进行操作时,应用程序检查用户在开始date和结束date之间select的date,以及inputdate是在开始date之前还是在结束date之后通知用户。

问题:作为一个用户,我从18-8-2012到18-9-2012创build了一个事件。 然后我把18-8-2012login,我被通知。 我debugging了应用程序。 我很惊讶。 格式为“yyyy-MM-dd”的string中的date对象是“2012-08-17 19:30:00 +0000”。 代码是:

#define kPickerDate @"yyyy-MM-dd" NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:kPickerDate]; NSDate *sDate = [formatter dateFromString:start_date]; NSDate *eDate = [formatter dateFromString:exam_date]; 

应用程序如何???????????????

你可以使用更好的方法创build一个NSDate对象。 首先修改NSDate的@interface(你可以在任何地方做到这一点)。 要做到这一点,把它放在你的头文件中。

 @interface NSDate (missingFunctions) + (NSDate *)dateWithYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day; @end 

然后在主文件里放:

 @implementation NSDate (missingFunctions) + (NSDate *)dateWithYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day { NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *components = [[NSDateComponents alloc] init]; [components setYear:year]; [components setMonth:month]; [components setDay:day]; //BUT MOST IMPORTANTLY: [components setTimeZone:[NSTimeZone localTimeZone]]; [components setHour:hour]; [components setMinute:minute]; [components setSecond:second]; return [calendar dateFromComponents:components]; } @end 

然后从代码调用的任何地方(例如):

 [NSDate dateWithYear:1969 month:8 day:15]; 

它会根据您的请求在正确的时区返回一个NSDate。 您也可以通过在官方的苹果文档中阅读关于NSTimeZone的更多信息来更改使用哪个时区。

注意我不能写信给这个代码,但我可以保证它的工作。

NSDate不仅仅是一个date,也是一个时间。

你需要在每个阶段检查这个:

  • 你的date在parsing时是否正确build立? 应该是UTC的午夜,而不是当地的午夜。 你可能使用NSDateFormatter 。 确保它的时区设置为UTC。
  • 你的date正确存储在SQLite吗? 再次确保您将其存储为UTC。 如果你正确地parsing它,但是,这应该工作。
  • 你正确地格式化输出吗? 可能使用NSDateFormatter为此。 确保它的时区设置为UTC。

只有这三个部分都是完美的,你才能摆脱潜在的错误。

要设置date格式化程序的时区,请使用:

 formatter.timeZone = [NSTimeZone timeZoneWithAbbreviation: @"UTC"]; 

不要试图通过采取当地时间来解决这个问题。

与当地时代的问题:

  • 在许多时区,夏令时每年会变化几次。 那一个小时的差距会把date的一部分放到前一天!
  • 如果用户在没有夏令时的时区,则他们可能会前往不同的时区。 同样,date的一部分可能会被抛弃一天。

唯一安全的做法是到处使用UTC。

(我实际上有一种生活在UTC的可怜人,他们不会被迫将这些错误摆脱出他们的应用程序!)