Swift 3.0 Преобразование строки в дату - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь преобразовать строковую дату в дату местного часового пояса, а затем преобразовать ее обратно в дату, используя мой текущий метод timeZone. Первый метод работает хорошо:

  let date  =  convertToLocalTimeZone(dateStr:"2018-05-30T14:13:20.000Z")
        print(date)

    the following is printed which is right:
    2018-05-30 16:13GMT+2

let newDate = convertStringToDate(dateStr:date)

    print(newDate)

//Converted back to UTC Time Zone :(
2018-05-30 14:13:00 +0000



func convertToLocalTimeZone(dateStr:String)->String{
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:sss.SSSZ"
        dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
        let date = dateFormatter.date (from: dateStr)
        dateFormatter.timeZone = TimeZone(secondsFromGMT: getSecondsFromGMT())
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mmz"
        let strVal  = dateFormatter.string(from: date!)
        return strVal

    }

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

func convertStringToDate(dateStr:String)->Date{
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat =  "yyyy-MM-dd HH:mmz"
// dateFormatter.timeZone = TimeZone(abbreviation: "GMT+2")
        let date = dateFormatter.date (from: dateStr)
        let calendar = Calendar.current
        let components = calendar.dateComponents([.year, .month, .day, .hour], from: date!)
        let finalDate = calendar.date(from:components)
        return finalDate!
    }

Любая помощь будет высоко ценится

1 Ответ

0 голосов
/ 30 мая 2018

Я думаю, что ваш код в порядке.Вам просто нужно понять, что Date представляет собой момент времени.Он ничего не знает о часовых поясах.Часовые пояса отображаются только при форматировании даты, поэтому только в String вы когда-либо увидите часовой пояс.Независимо от того, как вы создаете Date, вы увидите его в UTC, когда он будет напечатан напрямую.

Так что, если вы хотите показать дату в часовом поясе, отформатируйте ее так же, какВы сделали в convertToLocalTimeZone.

Если хотите, вы можете создать свою собственную дату с Date и TimeZone:

struct ZonedDate: CustomStringConvertible {
    var date: Date
    var timeZone: TimeZone

    var description: String {
        // format the date using timeZone here...
    }
}
...