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

iOS:添加时区而不更改/转换时间值,ios,date,nsdate,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” 我使用的日期格式是:“yyyy-MM-dd'T'HH:MM:ssZ” 尝试通过dateCompone

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

我使用的日期格式是:“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)
删除)

此代码为您提供了一个
日期
,表示洛杉矶时区2019年1月25日11:55:00。请记住,如果您只需打印
日期
,它将以UTC显示日期。这只是打印
日期
的输出


请注意,真正正确的解决方案是首先从API中获取具有正确时区的时间戳字符串。您不必像这样跳转来获取正确的时间戳。

因此,这里是我的结尾

日期:

和时区:

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
  }

您可能误解了它的工作原理吗?时间戳,如“2019-01-25T11:55:00+00:00”具体地说,它发生在UTC时区的11:55:00。在-08:00时区的同一时刻是3:55:00,而不是11:50:00。为什么要更改时区但保持相同的时间?这似乎是错误的。我得到的时间戳是:“2019-01-25T11:55:00+00:00”,时区是“美国/洛杉矶”另外,这个11:55已经在那个时区了,我只需要用右边的替换时间戳中的+00:00。这真的很奇怪,你得到的时区标识符是一个字符串,而不是一个特别声明它在UTC时区的时间戳。所以你的目标是忽略时间戳中指定的时区,而使用另一个时间戳ne单独给你的,对吗?@rmaddy,如果我不得不猜测的话,我会说这就像是一个写得很糟糕的JSON API,我必须使用一次,API返回的时间戳在服务器本地时间没有时区,然后在解析时,接收者将缺少的时区解析为UTC,现在他试图告诉Swift,实际上是时间区域不是UTC,它是美国/洛杉矶。@Kirill如果我在最后一句话中没有问题的话,我会说,尽你最大的努力让你的API更改为返回带有明确时区的UTC时间戳。可靠的解决方法。还有+1表示API应该首先正确完成。@rmaddy谢谢你,是的,我agree的观点是,它应该已经被API纠正了。
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"