我开发了一个应用程序,它可以大量处理日期,并且还使用以下方法将它们作为字符串存储在核心数据中:

- (NSDate*) stringToDate{
   NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
   [dateFormat setDateFormat:@"yy-MM-dd HH:mm"];
   NSDate *date = [dateFormat dateFromString:self];

   return date;

}

使用日期/时间非常棘手 - 仅系统和区域设置时间之间的时差 - 无论如何上述方法应该解决这个问题。(所以我希望,因为将 NSDate 格式化为 NSString 会返回正确的本地时间,而不是在调试器中查看 NSDate 变量,在我的情况下,它显示了 2 小时的差异)

还有很多这样的计算:

    NSCalendar *calendar = [NSCalendar currentCalendar];   <------

    NSDateComponents *components = [calendar components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSYearCalendarUnit |NSMonthCalendarUnit|NSDayCalendarUnit) fromDate:someDate];

    NSInteger now_hour = [components hour];
    NSInteger now_minute = [components minute];
    NSInteger yearx =  [components year];
    NSInteger monthx =  [components month];
    NSInteger dayx =  [components day];

我需要设置/更改/创建某些日期/时间,进行计算并将它们再次作为 NSString 检索/存储在核心数据中。

我的问题是关于使用适当的日历。

我应该总是写:

NSCalendar *calendar = [NSCalendar currentCalendar]; ?

或者

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSRepublicOfChinaCalendar];

尤其是取决于该应用程序是否在欧洲/美国与中国使用?

有帮助吗?

解决方案

你的方法 stringToDate 实际上并不完全有效,请参阅 QA1480. 。简洁版本:这 NSDateFormatter 不幸的是,它有两个稍微矛盾的角色——解码和编码特定的文本格式以及转换日期以供显示。因为后者与区域设置相关,所以它是默认值。为了确保您获得前一种行为,您应该明确设置 en_US_POSIX 区域设置,保证完全符合您的日期字符串。

话虽如此,您似乎对什么是有点困惑 NSDate 是。这不是一个 NSString 或日期的任何其他书面表示。这是对某个特定时刻的抽象记录。因此,它与当前日历完全无关。用户的日历和区域设置将影响日期的打印方式,但不会影响日期本身。不管你怎么写,现在仍然是现在。这就是为什么当您将格式化程序应用于日期时,您会得到正确的本地日期,但如果您只是将日期记录到控制台,那么您会得到一些抽象的东西,而不一定是在您的本地时区。 NSDate 没有时区或不同日历的概念。

核心数据可以直接存储日期(即,与数值相比,您不需要手动转换为字符串),所以我不完全确定您要得到什么。但正常行为是使用 currentCalendar 当你想向用户显示一些东西时。这将根据他们的时区和其他设置显示。

根据 QA,要应用固定日期字符串,您应该使用具有显式设置区域设置的日期格式化程序,并且根本不考虑日历。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top