什么是swift中以下时区的区别

时间:2018-03-27 05:26:30

标签: ios swift datetime timezone nstimezone

let timeZone = NSTimeZone.system.description
let localTimeZone = TimeZone.ReferenceType.local.description
let currentTimeZone = TimeZone.current.description
let defaultTimeZone = TimeZone.ReferenceType.default.description
let autoUpdateTimezon = TimeZone.autoupdatingCurrent.description

print ("System Timezone \(timeZone)")
print ("Local Timezone \(localTimeZone)")
print ("Current Timezone \(currentTimeZone)")
print ("Default Timezone \(defaultTimeZone)")
print ("Auto updating Timezone \(autoUpdateTimezon)")

输出

  

系统时区亚洲/加尔各答(现在)

     

当地时区亚洲/加尔各答(autoupdatingCurrent)

     

亚洲当前时区/加尔各答(现在)

     

默认时区亚洲/加尔各答(现在)

     

自动更新Timezone Asia / Kolkata(autoupdatingCurrent)

所以,我得到的所有输出都是相同的,所以这些时区之间的区别是什么,在这种情况下我们应该使用哪个时区。

问题

我使用了以下代码来进行日期转换

static func stringToString(strDate:String, fromFormat:String, toFormat:String)->String{
        let dateFormatter = DateFormatter()
        dateFormatter.timeZone = TimeZone.init(abbreviation: "UTC") ?? TimeZone(identifier: "UTC") ?? TimeZone.ReferenceType.default
        dateFormatter.dateFormat = fromFormat
        let currentDate = dateFormatter.date(from: strDate) ?? Date()
        dateFormatter.dateFormat =  toFormat
        dateFormatter.timeZone = TimeZone.ReferenceType.default
        let currentDates = dateFormatter.string(from: currentDate)
        return currentDates
    }
  

场景:如果用户自动设置时区并off the 24 hours,我的应用程序在卡塔尔崩溃,但在印度没有崩溃   (TimeZone.ReferenceType.local)

     

我已使用TimeZone.ReferenceType.default进行了下一次构建,问题已解决

     

所以,我无法理解这是什么问题。

崩溃报告

enter image description here

我正在崩溃的旧代码

enter image description here

2 个答案:

答案 0 :(得分:0)

本地 - >跟踪当前系统时区的对象。如果需要始终反映当前系统时区的对象,请使用此属性。从ios 11开始,本地类属性反映当前系统时区,而之前它反映了默认时区。

系统 - >系统当前使用的时区。如果您访问系统类属性,则其值将由应用程序缓存,如果用户随后更改系统时区,则不会更新。为了使系统属性能够反映新的时区,您必须先调用resetSystemTimeZone()方法来清除缓存的值。

默认 - >当前应用程序的默认时区。如果未设置默认时区,则使用当前系统时区。如果无法确定当前系统时区,则使用GMT时区。应用程序使用默认时区进行日期和时间操作。您可以将其设置为使应用程序像在不同的时区一样运行。

当前 - >系统当前使用的时区。

autoupdatingCurrent - >系统当前使用的时区,自动更新为用户的当前首选项。

来源 - > https://developer.apple.com/documentation/foundation/nstimezone

答案 1 :(得分:0)

请注意,TimeZone.ReferenceType基本上是NSTimeZone

如果您查看TimeZoneNSTimeZone的文档,您会很快发现。

来自NSTimeZone

  

system class属性返回系统当前使用的时区(如果已知)。访问该属性后,此值将被缓存,并且在您调用resetSystemTimeZone()方法之前不会反映任何系统时区更改。 local类属性返回一个自动更新代理对象,该对象始终返回系统使用的当前时区。

总而言之,system已缓存,因此在用户更改时区时不会更改。您必须致电resetSystemTimeZone进行更新。另一方面,local会在用户更改时区时自动更新。

TimeZone同样如此:

  

TimeZone提供两个静态函数来获取时区值:currentautoupdatingCurrentautoupdatingCurrent时区会自动跟踪用户所做的更新。

current对应systemautoupdatingCurrent对应local