苦苦挣扎着NSDate,格式和时区

时间:2011-10-24 08:05:49

标签: iphone ipad nsdate nsdateformatter

这笔交易是我想要1978年6月18日的NSDate代表。 我试过像

那样初始化NSDate
dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
self.dateFormatter.timeStyle = NSDateFormatterNoStyle;
self.startDate = [dateFormatter dateFromString:@"19/06/78"];
NSLog(@"%@", self.startDate);

在国际设置中将iPhone设置为丹麦语时,会生成正确的日期。 它不适用于设置为英语/美国设置的iPhone。

注意额外的一天(19),因为丹麦是GMT +1,我认为NSDate默认为时间23:00:00。这表明我没有按预期工作。

我希望上述日期(18/06/1978)代表一个NSDate对象,无论设备上的时区,区域设置和国际设置如何。

如何实现?

修改

所以Ole Begemann的回答似乎解决了我的问题。他的解决方案确实在美国国际设置和欧洲国际环境中的设备上创建了正确的日期。 但是,当苹果应该审查应用程序时,创建日期是1978年6月17日。这是因为我将时区设置为GMT +0000。而库比蒂诺就像GMT -0007左右。 所以这会提前一天。

所以要纠正我的问题:我想要18-06-1978,无论设备在物理上或设置方面的区域,时区。

我要做的是设置开始日期18. 1978年6月及以后在我的应用程序中将日期呈现为格式为“780618”(yyMMdd)的字符串,无论设备的时区或位置如何。它总是必须是“780618”,因为这是我的应用程序的关键开始日期。

所以我可能会错误地解决这个问题。我可能应该接受时区的东西并尝试配置NSDateFormatter以输出正确的日期,而不是试图在任何地方强制使用相同的日期。

所以基本上:我想要的是NSDate实例,它可以在任何时区以任何国际设备设置格式化为“780618”。

如何实现这一目标?

2 个答案:

答案 0 :(得分:3)

  

我希望上述日期(18/06/1978)代表一个NSDate对象,无论设备上的时区,区域设置和国际设置如何。

这对NSDate毫无意义。 NSDate始终表示单个时间点,因此根据定义,它包括此时间所在的时间和时区(或者更确切地说,它将时间存储在GMT中;时间仅转换为另一个时间用于显示目的的时区)。如果您只想要日期,则必须自己定义时间,例如:以格林尼治标准时间午夜的时间存储这些日期。

以编程方式设置日期时,必须始终设置时区,如果使用日期格式化程序,则设置格式化程序的区域设置和日历。这可确保您的代码独立于用户/设备的区域设置。

我会这样做:

NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
[dateComponents setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[dateComponents setYear:1978];
[dateComponents setMonth:6];
[dateComponents setDay:18];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *date = [calendar dateFromComponents:dateComponents];
NSLog(@"%@", date);

答案 1 :(得分:0)

你可以这样做:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

// Set the locale to en_US_POSIX. This makes the date formatter respect
// the format string regardless of the user's locale.
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
[formatter setLocale:locale];
[locale release];

// We want the date in the user's current time zone.
[formatter setTimeZone:[NSTimeZone localTimeZone]];

[formatter setDateFormat:@"dd/MM/yy"];

NSDate *date = [formatter dateFromString:@"18/06/78"];

[formatter release];

NSLog(@"%@", date);

日期显示如此1978-06-17 23:00:00 +0000是因为NSDate的描述返回GMT中的日期。 1978年6月17日23:00,1978年6月18日00:00 GMT + 1。