NSDate和不同的时区?

时间:2011-06-17 09:25:13

标签: iphone objective-c ios timezone nsdate

好的。我们的应用程序会发送一个NSString,其中包含当前用户的用户名和今天格式为yyyyMMddHH的日期。我们位于瑞典的服务器与String完全相同,并在收到呼叫时对它们进行比较。

现在。我们已经意识到,如果我们的一个用户出国,时区会发生变化,导致并发症。

如果iPhone用户可以说,首尔,韩国。他发送的NSString类似于:

2011061718

同时,当我们的服务器接到调用时,它将以这种格式重新创建自己的日期字符串,因为它位于瑞典。

2011061711

因此拒绝用户访问服务器端的功能。

总结:

如何以编程方式在我的应用程序中设置默认静态时区?

我们这样做:

NSDate *aDate = [aDateFormatter stringFromDate:[NSDate date]]; 

不知何故,我们需要时区并比较用户实际时区之间的差异,并将其更改为瑞典时区。

有什么想法吗?

编辑:好的。此应用程序仅适用于瑞典发布。我们使用用户的用户名和yyyyMMddHH格式的当前日期的组合来制作安全密钥,该密钥用于在新的小时开始时自行更新。该服务器位于格林威治标准时间+1时区的瑞典,用于验证用户是否在使用该应用程序的实际设备上,而不是使自己的客户对我们的服务进行肥皂呼叫的人。

因此,如果我们的某个用户超出时区,它将拒绝用户,因为字符串不匹配。

这就是为什么我们要始终为该功能GMT + 1设置默认时区。这就是我们真正想要的。

感谢。试。

4 个答案:

答案 0 :(得分:5)

如果您需要使客户端格式化日期,请按以下步骤操作:

NSDate *now = [NSDate date];

NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"Europe/Stockholm"]; // Sets the right time.
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; // Forces the date formatter to accept any format string.
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setCalendar:gregorianCalendar];
[formatter setTimeZone:timeZone];
[formatter setDateFormat:@"yyyyMMddHH"];
[formatter setLocale:locale];

NSString *dateString = [formatter stringFromDate:now];

NSLog(@"Date: %@", dateString);

[locale release];
[gregorianCalendar release];
[formatter release];

日期格式化程序将为您完成所有工作,您只需要对其进行配置。

通过设置公历,您使用的是与瑞典相同的日历。

通过设置时区,您将获得在瑞典的时间。

通过将语言环境设置为“en_US_POSIX”,您可以使格式化程序使用您指定的确切格式,而不会附加任何AM / PM内容。

答案 1 :(得分:2)

不要搞砸了。将完整日期时间作为字符串发送,让服务器计算出时间。

NSString *dtString = [[NSDate date] description];

这将创建格式为

的字符串
YYYY-MM-DD HH:MM:SS ±HHMM

答案 2 :(得分:0)

使用-[NSDateFormatter setTimeZone:]NSDate与它无关,因为它不关心时区。

顺便说一句,如果用户使用其他日历,您的代码也会失败。

答案 3 :(得分:0)

如果你在日期格式化器上转动AM / PM功能,即使你没有将它放在格式字符串中,也会显示“AM / PM”。 要解决此问题,还需要在DateFormatter中添加NSLocale。