iOS:添加时区而不更改/转换时间值

时间:2019-01-26 05:34:11

标签: ios date nsdate

您需要时区方面的帮助,我需要在不更改时间戳的情况下进行更改,如下所示: “ 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,但时间也改变了(

谢谢。

2 个答案:

答案 0 :(得分:1)

鉴于您需要忽略时间戳字符串中提供的时区,并将其替换为时区标识符,可以使用如下代码:

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,代表洛杉矶时区的2019年1月25日11:55:00。请记住,如果仅打印date,它将以UTC格式显示日期。这只是打印Date的输出。

请注意,实际的正确解决方案是首先从API获取具有正确时区的时间戳字符串。您不必为了获得正确的时间戳而像这样跳过篮球。

答案 1 :(得分:0)

所以我在这里结束了

日期:

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"