iOS: добавление часового пояса без изменения / преобразования значения времени - PullRequest
0 голосов
/ 26 января 2019

Привет, нужна помощь с часовым поясом, мне нужно изменить его, не меняя отметку времени, например: "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 с этим форматом даты: «гггг-мм-дд'т'хч: мм: ssZ "попытался отделить целую временную метку от dateComponents и перестроить ее снова после, tz добавил, но время также изменилось (

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Так вот чем я заканчиваю

Дата:

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" 
0 голосов
/ 26 января 2019

Если вам необходимо игнорировать часовой пояс, указанный в строке метки времени, и заменить его идентификатором часового пояса, вы можете использовать код, подобный следующему:

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, представляющее 25 января 2019 года в 11:55:00 в часовом поясе Лос-Анджелеса. Имейте в виду, что если вы просто напечатаете date, вам будет показана дата в формате UTC. Это просто вывод печати Date.

Обратите внимание, что на самом деле правильным решением является получение строки метки времени с правильным часовым поясом из API для начала. Вам не нужно прыгать через такие обручи, чтобы получить правильную метку времени.

...