2012-08-29 57 views
4

我搜索我的问题字符串日期的前一天,但我没有找到相关的任何帮助......通过字符串格式转换的日期NSDate的结果

故事: 用户创建一个名字继续活动,开始日期,结束日期和注释,因此将所有字段保存在Sqlite数据库中。两种日期格式都是“yyyy-MM-dd”。 之后,当用户想要做对事件的动作,应用程序会检查用户的开始和结束日期,如果输入的日期为起始日期之前或之后结束日期通知用户选择的日期。

问题: I,作为用户,创建的活动从18-8-2012至18-9-2012。然后我在18-8-2012登录,我被通知了。我调试了应用程序。我很惊讶。格式为“yyyy-MM-dd”的字符串中的日期对象是“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]; 

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

+1

它给你在不同的时区的日期(其实我的那种怜悯的人谁住在UTC他们不是被迫动摇这些虫子他们的应用程序!)。 –

+0

包括一些代码总是很好 – Augie

+0

我在+03:30 GMT时区,如果你的想法是真的,我应该给格林威治标准时间08:30:00 –

回答

1

您可以使用更好的方法,一个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的更多信息来更改使用哪个时区。

注意我不能赞扬写这段代码,但我可以保证它的工作。

+0

抱歉,但这不是安全的。我试过这个。它只有在夏令时将您的时钟调整回到一个小时后才能运行。那时,你的NSDates将指向不同的一天。 –

+0

@StevenFisher你会提供一个解决方案(遵循这种方法),而不是工作吗?如果重要的是当天的月份和年份以及小时和分钟与NSDate对象无关,那么是否可以将小时设置为正午并且没有任何问题?也许手动将时区设置为UTC对于许多问题来说是更好的解决方案,但对于这个特定的问题似乎没有必要。 – achi

+0

解决了DST情况,但它不能解决旅行问题。我有一个应用程序,就像您可能获得的区域设置一样(这是一所学校的信息),我仍然需要切换到UTC。 –

10

一个NSDate不只是一个日期,但也是一个时间。

你需要在每一个阶段进行检查:

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

只有一旦所有三块都是完美的,你会在这里没有潜在的错误。

要设定一个日期格式的时区,使用方法:

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

不要试图采用本地时间来解决这个问题。

与本地时间问题:

  • 在多个时区的时间变化的一年几次与夏令时。这一小时的差异将会把日期的一部分放到前一天!
  • 如果用户在没有夏令时的时区内,他们可能会前往不同的时区。同样,你的时间的日期部分可能会被抛弃一天。

唯一安全的事情就是使用UTC。

;