如何通过代码设置iOS的系统时区?

时间:2013-08-08 01:55:28

标签: ios objective-c

我想通过代码在iOS中设置系统时区,日期时间。任何想法或私人api帮助我? 示例:将时区设置为GMT + 8,将日期时间设置为2013年8月10日晚上8:30。怎么做?谢谢!

3 个答案:

答案 0 :(得分:15)

正如其他人所说,您无法在应用内编辑系统时区,但可以使用NSTimeZone static NSTimeZone *cachedTimeZone; @implementation DateUtilTests + (void)setUp { [super setUp]; cachedTimeZone = [NSTimeZone defaultTimeZone]; // Set to whatever timezone you want your tests to run in [NSTimeZone setDefaultTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]]; } + (void)tearDown { [NSTimeZone setDefaultTimeZone:cachedTimeZone]; [super tearDown]; } // ... do some tests ... @end 为您的整个应用设置默认时区}。

你提到这是用于测试的,所以我假设这是用于单元测试一些自定义日期格式化程序等等,在这种情况下你可以在你的单元测试中做这样的事情:

{{1}}

我希望有所帮助!

答案 1 :(得分:2)

@Filip在评论中如何表示,无法在应用内编辑系统偏好设置。您可能会做什么(不知道它对您有用)是在您的APP内设置您正在使用的NSDates的时区。

这是如何做到这一点的一个例子:

NSString *dateString = @"2013-08-07 17:49:54";
NSDateFormatter *dateFormatter = [NSDateFormatter new];
NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"Europe/London"]; //set here the timezone you want
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
[dateFormatter setTimeZone:timeZone];

NSDate *date = [dateFormatter dateFromString:dateString];

以下是与timeZoneWithName一起使用的可能时区列表:`:http://pastebin.com/ibNU2RcG

答案 2 :(得分:2)

仍然可以在Xcode 11上工作。swift 5的实现看起来像:

override func setUpWithError() throws {
    // Put setup code here. This method is called before the invocation of each test method in the class.
    
    //All test by default will use GMT time zone. If different, change it within the func
    TimeZone.ReferenceType.default = gmtTimeZone
}

override func tearDownWithError() throws {
    // Put teardown code here. This method is called after the invocation of each test method in the class.
    
    //Rest to current
    TimeZone.ReferenceType.default = TimeZone.current
}

在我的XCTestCase类中,我的时区被声明为:

private let gmtTimeZone = TimeZone(abbreviation: "GMT")!
private let gmtPlus1TimeZone = TimeZone(abbreviation: "GMT+1")!
private let gmtMinus1TimeZone = TimeZone(abbreviation: "GMT-1")!

我将所有测试默认设置为GMT,但是对于特定测试,我想更改它,然后:

func test_Given_NotGMTTimeZone_ThenAssertToGMT() {
    TimeZone.ReferenceType.default = gmtPlus1TimeZone
    ...
}

已添加 您还可以使用诸如“英国夏令时”之类的时区名称

private let britishSummerTimeZone = TimeZone(abbreviation: "BST")!