0

我开发了一个应用程序,它可以处理很多日期,并使用这种方法将这些作为字符串存储在核心数据中:

- (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];

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

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

我应该总是写:

NSCalendar *calendar = [NSCalendar currentCalendar]; ?

或者

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

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

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

4

1 回答 1

2

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

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

Core Data 可以直接存储日期(即,与数值相比,您无需手动转换为 from 字符串),因此我不完全确定您在做什么。但正常行为是currentCalendar在您想为用户显示某些内容时使用。这将根据他们的时区和其他设置显示。

根据 QA,对于应用固定日期字符串,您应该使用具有明确设置区域设置的日期格式化程序,而根本不考虑日历。

于 2012-07-25T15:34:12.813 回答