NSRepublicOfChinaCalendar 和 NSGregorianCalendar 有什么区别?
-
11-12-2019 - |
题
我开发了一个应用程序,它可以大量处理日期,并且还使用以下方法将它们作为字符串存储在核心数据中:
- (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,要应用固定日期字符串,您应该使用具有显式设置区域设置的日期格式化程序,并且根本不考虑日历。