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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了苦苦挣扎着NSDate,格式和时区相关的知识,希望对你有一定的参考价值。

这笔交易是我想要一个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以输出正确的日期,而不是试图在任何地方强制相同的日期。

所以基本上:我想要的是在任何国家设备设置的任何时区,无处不在的格式为“780618”的NSDate实例。

怎么做到这一点?

答案

我希望上述日期(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);
另一答案

你可以这样做:

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。

以上是关于苦苦挣扎着NSDate,格式和时区的主要内容,如果未能解决你的问题,请参考以下文章

将 UTC 日期格式转换为本地 nsdate

将UTC日期格式转换为本地nsdate

创建具有特定时区的 NSDate 对象

创建 NSDate 时区问题

NSDate: 我只输入utc时间成分,并正确设置日历,但NSDate不知为何会被重新计算到我的时区。

本地时区的当前 NSDate 是不是在另一个时区的开始和结束 NSDate 范围内?