如何在iOS上获取当地时间[重复]

Posted

技术标签:

【中文标题】如何在iOS上获取当地时间[重复]【英文标题】:How to get local time on iOS [duplicate] 【发布时间】:2013-03-25 13:02:29 【问题描述】:

我刚刚注意到NSDate *nowDate = [NSDate date]; 给了我 GMT+0 时间,而不是当地时间。所以基本上在我的 iPad 上是 13:00,这段代码的输出是 12:00。

如何正确获取当地时间?

【问题讨论】:

试试这个链接,它可以让你得到当地的时区。 buildingmyworld.wordpress.com/2011/04/13/… 您如何获得“此代码的输出”?您是使用 NSDateFormatter 来获取字符串还是只是 NSLogging NSDate 对象? 【参考方案1】:

试一试!

NSDate* sourceDate = [NSDate date];

NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];//use `[NSTimeZone localTimeZone]` if your users will be changing time-zones. 

NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];
NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;

NSDate* destinationDate = [[[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate] autorelease];

它将根据当前系统时区为您提供时间。

【讨论】:

为什么这么复杂。 -1 适用于 ios 它并不复杂。时间就是时间。时间的格式很难,因为人类创造了时区。因此,世界各地的下午 6:00 将是晚上。 这将为您提供x hours 之前或将来的时间点,而不是当前时间。 这段代码对我有用 警告! 在调用resetSystemTimeZone 方法之前调用resetSystemTimeZone 方法非常重要,因为在应用程序的整个生命周期中都会缓存时区。请参阅 Apple 对 systemTimeZone 方法的说明。【参考方案2】:

NSDate 不关心时区。它只是记录一个时刻。

在使用 NSDateFormatter 获取日期的字符串表示时,您应该设置本地时区:

NSDate *date = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle]; // Set date and time styles
[dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
NSString *dateString = [dateFormatter stringFromDate:date];

【讨论】:

然后呢?我应该再次将 NSSTring 转换为 NSDate 吗?看起来效率不高 如果你需要一个 NSDate 然后使用[NSDate date] - 它不关心时区。我建议你阅读日期和时间编程指南 - developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… 这就是我需要关心的 NSDate 对象的问题 ;) 需要在 alloc/init 行中添加一个方括号,并在最后一行将 NSDateFormatter 更改为 dateFormatter。 SO 不允许更改少于 6 个字符 @amergin 谢谢 - 已编辑【参考方案3】:
 NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
 [calendar setTimeZone:[NSTimeZone localTimeZone]];
 NSDateComponents *dateComponents = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]];
 NSDate *d = [calendar dateFromComponents:dateComponents];

【讨论】:

【参考方案4】:
// get current date/time
NSDate *today = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
// display in 12HR/24HR (i.e. 11:25PM or 23:25) format according to User Settings
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];
NSString *currentTime = [dateFormatter stringFromDate:today];
[dateFormatter release];
NSLog(@"%@",currentTime);

【讨论】:

以上是关于如何在iOS上获取当地时间[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在网页中将 UTC 时间显示为当地时间?

如何在给定时间和状态信息的情况下获取当地时区

PayPal ExpressCheckout API:以当地货币获取交易总额

phpPHP 获取当地准确时间

js将UTC时间转化为当地时区时间

获取当地时间