【问题标题】:NSDate and different timezones?NSDate 和不同的时区?
【发布时间】:2011-09-17 01:09:43
【问题描述】:

好的。我们的应用程序发送一个NSString,该NSString 由当前用户的用户名和格式为yyyyMMddHH 的今天日期组成。我们位于瑞典的服务器发出完全相同的String,并在接到呼叫时比较两者。

现在。我们已经意识到,如果我们的一位用户出国,时区将会改变,从而导致复杂性。

如果 iPhone 用户在韩国首尔。他发送的NSString 类似于:

2011061718

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

2011061711

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

总结一下:

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

我们这样做:

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

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

有什么想法吗?

编辑:好的。此应用程序仅打算在瑞典发布。我们使用用户的用户名和当前日期(格式为 yyyyMMddHH)的组合来制作安全密钥,该密钥旨在在新的小时开始时自行更新。该服务器位于瑞典 GMT+1 时区,验证用户是在使用应用程序的实际设备上,而不是让自己的客户对我们的服务进行肥皂调用的人。

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

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

谢谢。再次。

【问题讨论】:

  • 最后一行 - 你从一个日期得到一个字符串并将它存储在一个日期中?
  • 瑞典不在 GMT+1 时区。它在冬天使用 GMT+1,在夏天使用 GMT+2。

标签: iphone objective-c ios timezone nsdate


【解决方案1】:

如果您需要让客户端格式化日期,可以这样做:

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 内容。

【讨论】:

  • @Da_smokes 这将为您提供从世界任何地方到瑞典的正确时间。
【解决方案2】:

不要纠结这个。以字符串形式发送完整的日期时间,让服务器计算出时间。

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

这将创建一个格式为

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

【讨论】:

  • 没有更多上下文。这是一个完整的答案。你到底有什么不明白的?
  • 我认为这是一个糟糕的解决方案。 NSDate的描述方法的输出格式没有定义。 Apple 可能会在未来的任何版本中对其进行更改。
  • 重点不是格式——而是字符串包含日期、时间时区。然后可以将其发送到服务器,在那里它可以转换回 NSDate 并且服务器可以比较它,但是它喜欢独立于创建它的时区。
【解决方案3】:

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

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

【讨论】:

  • 如我所说,使用-setTimeZone:
【解决方案4】:

另外提醒一下,如果您打开日期格式化程序上的 AM/PM 功能,即使您没有将它放在格式字符串中,也会打印出“AM/PM”。 要解决此问题,还要向 DateFormatter 添加一个 NSLocale。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-13
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多