在字符串日期前一天将字符串格式的日期转换为nsdate结果

Fa.*_*uri 4 nsdate ios

我搜索了我的问题,但我没有找到任何相关的帮助......

故事:用户按名称,开始日期,结束日期和注释创建继续事件,因此保存Sqlite数据库上的所有字段.两种日期格式均为"yyyy-MM-dd".之后,当用户想要对事件执行操作时,应用程序会检查用户按开始日期和结束日期选择的日期,以及输入的日期是在开始日期之前还是在结束日期之后通知用户.

问题:作为用户,我创建了一个从2012年8月18日到2012年9月18日的活动.然后我把登录在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]; 
Run Code Online (Sandbox Code Playgroud)

app怎么样??????????????

Ste*_*her 10

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

您需要在每个阶段检查:

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

只有当这三件作品都完美无缺时,你才能摆脱潜在的错误.

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

formatter.timeZone = [NSTimeZone timeZoneWithAbbreviation: @"UTC"];
Run Code Online (Sandbox Code Playgroud)

不要试图通过采用当地时间解决这个问题.

当地时间的问题:

  • 在许多时区,夏令时间每年都会改变几次.一小时的差异将把你的时间的一部分扔到前一天!
  • 如果用户处于没有夏令时的时区,他们可能会前往不同的时区.同样,您的时间的日期部分可能会被抛弃一天.

唯一安全的做法是在任何地方使用UTC.

(我实际上有点生活在UTC的可怜的人;他们不会被迫从他们的应用程序中甩掉这些错误!)