Swift 3.0将字符串转换为日期

时间:2018-05-30 16:02:31

标签: swift date timezone

我试图将字符串日期转换为本地时区日期然后将其转换回日期,并使用我当前的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

    }

当我尝试将新的字符串日期与我的本地timeZone转换为日期时,会发生问题,它会返回错误的时间区域:

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 :(得分:0)

我认为你的代码没问题。您只需要了解Date代表一个时间点。它对时区一无所知。只有在格式化日期时才会显示时区,因此只有String才能看到时区。无论您如何创建Date,您都会看到它在直接打印时以UTC格式结束。

因此,如果您想在时区中显示日期,请将其格式化,就像您在convertToLocalTimeZone中所做的那样。

如果您愿意,可以使用DateTimeZone创建自己的日期:

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

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