Swift json 本地时区的时间值
Swift json time value to local time zone
我有一个 json 请求可以产生两种不同类型的时间值。两种方式都是 UTC 时间,但我需要将其转换为当地时间。
2015-12-01T13:05:33+00:00
或
1:05:33 PM
我的尝试。
let dateFormatter = NSDateFormatter()
dateFormatter.timeStyle = NSDateFormatterStyle.ShortStyle //Set time style
dateFormatter.timeZone = NSTimeZone()
let localDate: NSDate? = dateFormatter.dateFromString(time1)
print(localDate)
这就是我得到的结果。 2000-01-01 19:05:33 +0000 如果我使用 1:05:18 PM 值。
获取 json 值的行。
let time1 = json["results"]["time1"].string!
您可以尝试设置本地时区或设置 GMT
formatter.timeZone = NSTimeZone.localTimeZone()
OR
formatter.timeZone = NSTimeZone(abbreviation: "GMT")
如果您仍然遇到错误,请告诉我!
好的,有几件事:
解析 RFC 3339/ISO 8601 字符串:
let string = "2015-12-01T13:05:33+00:00"
let rfc3339Formatter = NSDateFormatter()
rfc3339Formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
rfc3339Formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
let date = rfc3339Formatter.dateFromString(string)
请注意,我已经设置了语言环境(根据 Technical Q&A 1480)。但是因为日期字符串包含时区信息,所以我可以使用 Z
格式化字符以便正确解释时区。
但是 NSDate
对象 没有 有与之关联的时区。事实上,如果我们执行在上一步中成功解析的 print(date)
,它将向我们显示 GMT/UTC 中的 NSDate
,即使原始字符串位于不同的时区。
只有当您使用格式化程序将此 NSDate
转换回要呈现给用户的新字符串时,时区才有意义。所以我们可以使用一个单独的格式化程序来创建输出字符串:
let userDateFormatter = NSDateFormatter()
userDateFormatter.dateStyle = .MediumStyle
userDateFormatter.timeStyle = .MediumStyle
let outputString = userDateFormatter.stringFromDate(date!)
因为这没有指定时区,所以它会在用户的本地时区中创建一个字符串。因为我们没有覆盖 locale
并使用 .dateStyle
和 .timeStyle
,所以在创建要呈现给最终用户的字符串时,它将使用设备的当前本地化设置显示它。
现在,如果您确实收到了 UTC 时间(不包括时区?!哎呀,在 JSON,恕我直言,这是一个非常糟糕的设计),然后你必须指定时区:
let string = "1:05:33 PM"
let utcTimeStringFormatter = NSDateFormatter()
utcTimeStringFormatter.dateFormat = "hh:mm:ss a"
utcTimeStringFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)
let time = utcTimeStringFormatter.dateFromString(string)
现在我们有 time
,一个包含该字符串表示的时间的 NSDate
。但同样,NSDate
个对象本身没有时区。只有当我们将其转换回最终用户的字符串时,我们才能看到本地时区的时间:
let userTimeFormatter = NSDateFormatter()
userTimeFormatter.timeStyle = .MediumStyle
let outputString = userTimeFormatter.stringFromDate(time!)
我有一个 json 请求可以产生两种不同类型的时间值。两种方式都是 UTC 时间,但我需要将其转换为当地时间。
2015-12-01T13:05:33+00:00
或
1:05:33 PM
我的尝试。
let dateFormatter = NSDateFormatter()
dateFormatter.timeStyle = NSDateFormatterStyle.ShortStyle //Set time style
dateFormatter.timeZone = NSTimeZone()
let localDate: NSDate? = dateFormatter.dateFromString(time1)
print(localDate)
这就是我得到的结果。 2000-01-01 19:05:33 +0000 如果我使用 1:05:18 PM 值。
获取 json 值的行。
let time1 = json["results"]["time1"].string!
您可以尝试设置本地时区或设置 GMT
formatter.timeZone = NSTimeZone.localTimeZone()
OR
formatter.timeZone = NSTimeZone(abbreviation: "GMT")
如果您仍然遇到错误,请告诉我!
好的,有几件事:
解析 RFC 3339/ISO 8601 字符串:
let string = "2015-12-01T13:05:33+00:00" let rfc3339Formatter = NSDateFormatter() rfc3339Formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ" rfc3339Formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") let date = rfc3339Formatter.dateFromString(string)
请注意,我已经设置了语言环境(根据 Technical Q&A 1480)。但是因为日期字符串包含时区信息,所以我可以使用
Z
格式化字符以便正确解释时区。但是
NSDate
对象 没有 有与之关联的时区。事实上,如果我们执行在上一步中成功解析的print(date)
,它将向我们显示 GMT/UTC 中的NSDate
,即使原始字符串位于不同的时区。只有当您使用格式化程序将此
NSDate
转换回要呈现给用户的新字符串时,时区才有意义。所以我们可以使用一个单独的格式化程序来创建输出字符串:let userDateFormatter = NSDateFormatter() userDateFormatter.dateStyle = .MediumStyle userDateFormatter.timeStyle = .MediumStyle let outputString = userDateFormatter.stringFromDate(date!)
因为这没有指定时区,所以它会在用户的本地时区中创建一个字符串。因为我们没有覆盖
locale
并使用.dateStyle
和.timeStyle
,所以在创建要呈现给最终用户的字符串时,它将使用设备的当前本地化设置显示它。现在,如果您确实收到了 UTC 时间(不包括时区?!哎呀,在 JSON,恕我直言,这是一个非常糟糕的设计),然后你必须指定时区:
let string = "1:05:33 PM" let utcTimeStringFormatter = NSDateFormatter() utcTimeStringFormatter.dateFormat = "hh:mm:ss a" utcTimeStringFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0) let time = utcTimeStringFormatter.dateFromString(string)
现在我们有
time
,一个包含该字符串表示的时间的NSDate
。但同样,NSDate
个对象本身没有时区。只有当我们将其转换回最终用户的字符串时,我们才能看到本地时区的时间:let userTimeFormatter = NSDateFormatter() userTimeFormatter.timeStyle = .MediumStyle let outputString = userTimeFormatter.stringFromDate(time!)