我试图将字符串日期转换为本地时区日期然后将其转换回日期,并使用我当前的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!
}
非常感谢任何帮助
答案 0 :(得分:0)
我认为你的代码没问题。您只需要了解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...
}
}