iOS: 添加没有 changing/converting 时间值的时区
iOS: Add timezone without changing/converting the time value
您好需要时区方面的帮助,我需要在不更改时间戳的情况下更改它,如下所示:
“2019-01-25T11:55:00+00:00”->“2019-01-25T11:55:00-08:00”
这是我得到的:
“2019-01-25T11:55:00+00:00”时间戳,00:00 不正确,我需要将其更改为特定时区,例如 -08:00 以获得“2019- 01-25T11:55:00-08:00
我正在使用具有这种日期格式的 dateFormatter:"yyyy-MM-dd'T'HH:mm:ssZ"
尝试通过 dateComponents 解耦整个时间戳并在添加 tz 之后再次重建它但时间也改变了(
提前致谢。
鉴于您需要忽略时间戳字符串中提供的时区并将其替换为时区标识符,您可以使用如下代码:
let timezone = "America/Los_Angeles"
let timestamp = "2019-01-25T11:55:00+00:00"
let df = DateFormatter()
df.timeZone = TimeZone(identifier: timezone)
df.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
let date = df.date(from: String(timestamp.dropLast(6)))
这会使用附加时区设置日期格式化程序,同时解析没有任何时区的时间戳(使用 dropLast(6)
删除)。
此代码为您提供 Date
,代表洛杉矶时区 11:55:00 2019 年 1 月 25 日。请记住,如果您只是打印 date
,它会以 UTC 格式显示日期。这只是打印 Date
.
的输出
请注意,实际正确的解决方案是从 API 开始获取具有正确时区的时间戳字符串。您不必为了获得正确的时间戳而像这样跳来跳去。
所以这里是我最终的
日期:
extension Date {
public func dateWithAdjusted(timeZone: String, date: String) -> String {
let timeZoneIdentifier = TimeZone(identifier: timeZone)?.identifier
guard let timezoneId = timeZoneIdentifier else { return "" }
let timeZoneOffset = TimeZone.getOffset(from: timezoneId)
let regex = try! NSRegularExpression(pattern: "([+-])([0-9]{2}[:]{1}[0-9]{2})", options: .caseInsensitive)
let range = NSMakeRange(0,date.count)
let newTimeStamp = regex.stringByReplacingMatches(in: date, options: [], range: range, withTemplate: timeZoneOffset)
return newTimeStamp
}
和时区:
extension TimeZone {
public static func getOffset(from identifier: String) -> String {
let timeZone = TimeZone(identifier: identifier)
guard let tz = timeZone else { return getOffset(from: TimeZone.current.identifier ) }
let seconds = tz.secondsFromGMT()
let hours = seconds/3600
let minutes = abs(seconds/60) % 60
let timeZoneOffset = String(format: "%+.2d:%.2d", hours, minutes)
return timeZoneOffset
}
let adjustedTimestamp = Date().dateWithAdjusted(timeZone:"America/New_York", date: "2019-01-26T02:55:00+00:00")
Output: "2019-01-26T02:55:00-05:00"
您好需要时区方面的帮助,我需要在不更改时间戳的情况下更改它,如下所示: “2019-01-25T11:55:00+00:00”->“2019-01-25T11:55:00-08:00”
这是我得到的: “2019-01-25T11:55:00+00:00”时间戳,00:00 不正确,我需要将其更改为特定时区,例如 -08:00 以获得“2019- 01-25T11:55:00-08:00
我正在使用具有这种日期格式的 dateFormatter:"yyyy-MM-dd'T'HH:mm:ssZ" 尝试通过 dateComponents 解耦整个时间戳并在添加 tz 之后再次重建它但时间也改变了(
提前致谢。
鉴于您需要忽略时间戳字符串中提供的时区并将其替换为时区标识符,您可以使用如下代码:
let timezone = "America/Los_Angeles"
let timestamp = "2019-01-25T11:55:00+00:00"
let df = DateFormatter()
df.timeZone = TimeZone(identifier: timezone)
df.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
let date = df.date(from: String(timestamp.dropLast(6)))
这会使用附加时区设置日期格式化程序,同时解析没有任何时区的时间戳(使用 dropLast(6)
删除)。
此代码为您提供 Date
,代表洛杉矶时区 11:55:00 2019 年 1 月 25 日。请记住,如果您只是打印 date
,它会以 UTC 格式显示日期。这只是打印 Date
.
请注意,实际正确的解决方案是从 API 开始获取具有正确时区的时间戳字符串。您不必为了获得正确的时间戳而像这样跳来跳去。
所以这里是我最终的
日期:
extension Date {
public func dateWithAdjusted(timeZone: String, date: String) -> String {
let timeZoneIdentifier = TimeZone(identifier: timeZone)?.identifier
guard let timezoneId = timeZoneIdentifier else { return "" }
let timeZoneOffset = TimeZone.getOffset(from: timezoneId)
let regex = try! NSRegularExpression(pattern: "([+-])([0-9]{2}[:]{1}[0-9]{2})", options: .caseInsensitive)
let range = NSMakeRange(0,date.count)
let newTimeStamp = regex.stringByReplacingMatches(in: date, options: [], range: range, withTemplate: timeZoneOffset)
return newTimeStamp
}
和时区:
extension TimeZone {
public static func getOffset(from identifier: String) -> String {
let timeZone = TimeZone(identifier: identifier)
guard let tz = timeZone else { return getOffset(from: TimeZone.current.identifier ) }
let seconds = tz.secondsFromGMT()
let hours = seconds/3600
let minutes = abs(seconds/60) % 60
let timeZoneOffset = String(format: "%+.2d:%.2d", hours, minutes)
return timeZoneOffset
}
let adjustedTimestamp = Date().dateWithAdjusted(timeZone:"America/New_York", date: "2019-01-26T02:55:00+00:00")
Output: "2019-01-26T02:55:00-05:00"